二十一点

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

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

动作空间

离散(2)

观测空间

元组(离散(32), 离散(11), 离散(2))

导入

gymnasium.make("Blackjack-v1")

二十一点是一种纸牌游戏,目标是通过获得总点数更接近 21 点(不超过 21 点)的牌来击败庄家。

描述

游戏开始时,庄家有一张明牌和一张暗牌,而玩家有两张明牌。所有牌都从无限牌堆中抽取(即有放回地抽取)。

牌的点数是

  • 花牌(J、Q、K)的点数为 10。

  • A 可以计为 11 点(称为“可用 A”)或 1 点。

  • 数字牌(2-10)的点数等于其数字。

玩家的点数为所持牌的点数之和。玩家可以要求加牌(hit),直到他们决定停牌(stick)或超过 21 点(爆牌,立即输牌)。

玩家停牌后,庄家亮出其暗牌,并抽牌直到其点数之和达到 17 点或更高。如果庄家爆牌,玩家获胜。

如果玩家和庄家都没有爆牌,则根据谁的点数更接近 21 点来决定结果(赢、输、平局)。

此环境对应于 Sutton 和 Barto 在《Reinforcement Learning: An Introduction》的示例 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

奖励

  • 赢得游戏:+1

  • 输掉游戏:-1

  • 平局:0

  • 使用天生二十一点赢得游戏:+1.5(如果 natural 为 True)+1(如果 natural 为 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,“Reinforcement Learning: An Introduction” 2020。[在线]。可用网址:http://www.incompleteideas.net/book/RLbook2020.pdf

版本历史

  • v1:修复了二十一点中的天生牌处理

  • v0:初始版本发布