二十一点

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

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

动作空间

Discrete(2)

观察空间

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

导入

gymnasium.make("Blackjack-v1")

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

奖励

  • 赢游戏:+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,《强化学习:简介》2020年。[在线]。可访问:http://www.incompleteideas.net/book/RLbook2020.pdf

版本历史

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

  • v0: 初始版本发布