二十一点

../../../_images/blackjack.gif

此环境是玩具文本环境的一部分,其中包含有关环境的常规信息。

动作空间

Discrete(2)

观察空间

Tuple(Discrete(32), Discrete(11), Discrete(2))

导入

gymnasium.make("Blackjack-v1")

二十一点是一款纸牌游戏,目标是通过获得总点数更接近 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

奖励

  • 赢得游戏:+1

  • 输掉游戏:-1

  • 平局:0

  • 以自然二十一点赢得游戏:+1.5(如果 自然 为 True)+1(如果 自然 为 False)

回合结束

如果发生以下情况,则回合结束

  • 终止

  1. 玩家要牌,手中的牌总点数超过 21。

  2. 玩家停牌。

A 将始终被算作可用(11),除非它使玩家爆牌。

信息

不返回其他信息。

参数

import gymnasium as gym
gym.make('Blackjack-v1', natural=False, sab=False)

natural=False: 是否为以自然二十一点开始而提供额外的奖励,即以 A 和 10 开始(总点数为 21)。

sab=False: 是否遵循 Sutton 和 Barto 书籍中概述的精确规则。如果 sabTrue,则关键字参数 natural 将被忽略。如果玩家获得自然二十一点而庄家没有,玩家将获胜(即获得 +1 的奖励)。反之则不成立。如果玩家和庄家都获得自然二十一点,则为平局(即奖励为 0)。

参考文献

[1] R. Sutton 和 A. Barto,“强化学习:介绍” 2020 年。[在线]。可用:http://www.incompleteideas.net/book/RLbook2020.pdf

版本历史

  • v1: 修复二十一点中自然牌处理

  • v0: 初始版本发布