二十一点¶

此环境是玩具文本环境的一部分,其中包含有关环境的一般信息。
动作空间 |
|
观察空间 |
|
导入 |
|
二十一点是一种纸牌游戏,目标是通过获得的牌点数总和比庄家更接近21点(但不超过21点)来击败庄家。
描述¶
游戏开始时,庄家有一张明牌和一张盖牌,而玩家有两张明牌。所有牌都从无限牌堆中抽取(即有放回地抽取)。
牌面价值为
人头牌(杰克、皇后、国王)点数为10。
A可以算作11点(称为“可用A”)或1点。
数字牌(2-10)的价值等于其牌面数字。
玩家持有牌的总点数。玩家可以请求额外牌(hit),直到他们决定停止(stick)或超过21点(爆牌,立即输掉)。
玩家停牌后,庄家揭开他们的盖牌,并继续抽牌直到点数总和达到或超过17点。如果庄家爆牌,玩家获胜。
如果玩家和庄家都没有爆牌,则根据谁的点数总和更接近21点来决定结果(赢、输、平局)。
此环境对应于 Sutton 和 Barto 的《强化学习:简介》中例5.1描述的二十一点问题 [1]。
动作空间¶
动作形状为 (1,)
,范围是 {0, 1}
,表示是停牌还是要牌。
0: 停牌
1: 要牌
观察空间¶
观察结果由一个3元组组成,包含:玩家当前的总点数,庄家显示的一张牌的点数(1-10,其中1是A),以及玩家是否持有一个可用A(0或1)。
观察结果以 (int(), int(), int())
的形式返回。
初始状态¶
初始状态通过以下值初始化。
观察 |
值 |
---|---|
玩家当前总点数 |
4, 5, ..., 21 |
庄家显示牌的点数 |
1, 2, ..., 10 |
可用A |
0, 1 |
奖励¶
回合结束¶
如果发生以下情况,回合结束
终止
玩家要牌且手牌总点数超过21点。
玩家停牌。
A牌总是被计为可用(11点),除非这样会导致玩家爆牌。
信息¶
不返回额外信息。
参数¶
import gymnasium as gym
gym.make('Blackjack-v1', natural=False, sab=False)
natural=False
:是否对以天生二十一点(即以A和10开始,总点数为21)开局给予额外奖励。
sab=False
:是否遵循 Sutton 和 Barto 书中概述的精确规则。如果 sab
为 True
,则关键字参数 natural
将被忽略。如果玩家获得天生二十一点而庄家没有,玩家将获胜(即获得+1奖励)。反向规则不适用。如果玩家和庄家都获得天生二十一点,则为平局(即奖励0)。
参考文献¶
[1] R. Sutton 和 A. Barto,《强化学习:简介》2020年。[在线]。可访问:http://www.incompleteideas.net/book/RLbook2020.pdf
版本历史¶
v1: 修复二十一点中的天生牌处理
v0: 初始版本发布