二十一點

../../../_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: 初始版本釋出