二十一點

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

此環境是玩具文字環境的一部分,其中包含有關環境的一般資訊。

動作空間

離散(2)

觀測空間

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

import

gymnasium.make("Blackjack-v1")

二十一點是一種紙牌遊戲,目標是擊敗莊家,方法是獲得總和接近 21 點(但不超過 21 點)的牌,比莊家的牌更接近。

描述

遊戲開始時,莊家有一張牌面朝上和一張牌面朝下,而玩家則有兩張牌面朝上。所有牌都從無限牌組中抽取(即有放回)。

紙牌點數如下:

  • 人頭牌(J、Q、K)的點數為 10。

  • A 可以算作 11(稱為「可用的 A」)或 1。

  • 數字牌(2-9)的值等於其數字。

玩家擁有手中牌的總和。玩家可以請求額外的牌(要牌),直到他們決定停止(停牌)或超過 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:初始版本發布