二十一点¶
此环境是玩具文本环境的一部分,其中包含有关环境的常规信息。
动作空间 |
|
观察空间 |
|
导入 |
|
二十一点是一款纸牌游戏,目标是通过获得总点数更接近 21(不超过 21)的牌来击败庄家。
描述¶
游戏开始时,庄家有一张正面朝上,一张正面朝下的牌,而玩家有两张正面朝上的牌。所有牌都从无限牌堆(即有替换)中抽取。
牌面值如下
花牌(J、Q、K)的点数为 10。
A 可以算作 11(称为“可用 A”)或 1。
数字牌(2-9)的值等于其数字。
玩家持有牌的总点数。玩家可以要求额外的牌(要牌),直到他们决定停止(停牌)或超过 21(爆牌,立即输掉)。
玩家停牌后,庄家会翻开其正面朝下的牌,并抽牌,直到其总点数为 17 或更大。如果庄家爆牌,玩家获胜。
如果玩家和庄家都没有爆牌,则结果(赢、输、平局)由谁的总点数更接近 21 决定。
此环境对应于强化学习:Sutton 和 Barto 的介绍 [1] 中示例 5.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: 初始版本发布