cloudthink / TexasPoker

德州扑克的仿真引擎,用于强化学习算法实验优化。含API接口说明。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Texas Poker Project

Version 1.0

概述

主要实现了一定设定下的德克萨斯扑克的游戏环境,并使用强化学习进行策略学习与优化。

一、游戏设定

基本设定

人员设定:游戏为6人,其中有3人为特殊身份,顺时针连续3人分别为庄家D、小盲SB、大盲BB,其中庄家D由随机生成。因此,顺时针6人分别记作D、S、R、A、B、C。

牌局设定:每轮牌局独立进行,即每次发牌为一局,玩家的金额在牌局之间各自独立。玩家的目标的是使在牌局后自己的金额最大化。

金额设定:设定各局之间以0.5倍的大盲注为统一单位,定义0.5倍的大盲注为“分数”,每位玩家每轮牌局初始有100个分数值。即固定大盲注为2分,小盲注为1分。

规则设定

盲注轮&第一轮:每位玩家发2张牌。小盲注下1分、大盲注下2分后,从大盲注的下家(即A)开始下注。每个玩家有call、raise、fold三种选择。其中call指下与上家的注相同的注;raise为加注,下限是call,上限是剩余的全部分数;fold是弃牌,退出游戏,本局收益为剩余分数。结束第一轮的条件是每个人都下注了同样的分数。

第二轮:翻开3张公共牌,从SB开始下注,最小为2分。每个玩家同样是上述三种选择。但特殊的是,SB第一次可以选择check,即不下注也不弃牌。结束第二轮的条件是每个人都下注了同样的分数。

第三轮:再翻开1张公共牌,规则与第二轮相同。

第四轮:再翻开1张公共牌,规则与第二轮相同。

结算:根据牌型规则,场上剩余玩家中牌型最大的获得下注的所有分数。

需要注意的是,如果剩余分注不足,则只能fold。

游戏目标

单局游戏最大化自身得分,多局游戏最大化平均自身得分。

分数设定

每局玩家分数产生分为三种情况。

1.提前fold

分数为fold时的剩余分数。

2.进入结算阶段但牌型不是最大

分数为结算时的剩余分数。

3.进入结算阶段且牌型是(并列)最大的

平分或者获得注池中的分数。

牌型大小

以下牌型大小依次递减

1.同花大顺 2.同花顺 3.4+1 4.3+2 5.同花

6.顺子 7.3+1+1 8.2+2+1 9.2+1+1+1+1 10.剩余牌型

二、接口定义

1.TexasPoker类

用于定义每一局的牌局环境。

成员变量

agentList[6]:智能体数组,类型为Agent对象。保存玩家智能体的对象。

debug:Debug开关,类型为布尔。True为输出牌局信息。

publicList[5]:公共牌数组,类型为Card对象。按照顺序保存五张公共牌。

cardPool:卡牌池,类型为CardPool对象。用于发牌。

scorePool:分数值,类型为整型值。用于记录当前分数池的值。

DPosition:庄家位置,类型为整型值。

roundScoreList:用于保存当前轮的各玩家下注数值。

foldNum:用于保存当前轮已经fold的玩家数。

agentCompetList[6]:智能体的牌面大小。类型为二元tuple。

foldWinner:当所有玩家全部fold时,最后fold的获胜玩家。类型整型值。

成员函数

init(agent[6])

初始化函数,传入6个智能体。

game()

进行一局游戏。返回值为列表score[6],代表本局游戏各个玩家的得分。

依次调用函数reset、prepare、round1-5()、win()。

返回值为本局的分数列表。

reset()

重置牌局变量和智能体的牌局变量。返回值为空。

prepare()

确定各个玩家身份。返回值为空。

round1()

盲注轮和第一轮。包括如下动作:玩家发牌、下大小盲注、下第一轮注。返回值为空。

round2()

第二轮。翻开三张公共牌。返回值为空。

round3()

第三轮。翻开一张公共牌。返回值为空。

round4()

第四轮。翻开一张公共牌。返回值为空。

win()

结算阶段。确定各位玩家的分数。返回值为整型的分数列表。

printEnv()

输出牌局环境。

printAgents()

输出各智能体当前情况。

2.Agent类

用于定义玩家智能体。

成员变量

name:智能体名称。类型为字符串。

identity:智能体的牌局身份。类型为单字符。

hand[2]:智能体的牌局手牌数组。类型为Card对象。

score:智能体的牌局剩余分数。类型为整型值。

final:智能体的牌局终止标志。0为未fold,1为已经fold。

成员函数

reset()

重置牌局情况。

setIdentity(identity)

设置本局身份。

setHand(HanList)

设置本局手牌。

bet(score)

下注,减去对应分数,同时返回值为该分数。

action(last,lowerbound)

智能体决策。输入为之前的下注金额和最小下注金额,返回实际下注金额。是算法实现需要重写的接口。

actionAllowCheck(last,lowerbound)

当玩家为S角色时,使用check代替fold。其他与action函数相同。

call(score)
raising(lowerbound)
fold()
check()
allin()
print()

3.CardPool类

卡牌池,包括除去大小王的52张牌。

成员变量

bin[52]:为卡牌池中剩余卡片的编码,类型为整型。

成员函数

getCard()

从剩余卡牌池中抽取一张牌。改变bin数组并返回一个Card类的对象。

reset()

重置bin数组。返回值为空。

print()

输出信息。

4.Card类

定义单张牌。

成员变量

suit:花色标识,类型为1-4的整型值。分别代表黑桃、红桃、梅花、方块。

point:数值标识,类型为1-13的整型值。代表牌点。

成员函数

print()

输出信息。

5.utils包的工具函数

关于位置计算

S(Dposition)

返回小盲的标号。

R(Dposition)

返回大盲的标号。

A(Dposition)

返回大盲下家的标号。

关于牌面计算

牌面由二元组(index,subindex)组成,其中index是指牌型,subindex是指相同牌型之间的大小。index越小,subindex越大,牌面越大。

getCompet(publicList,hand)

返回当前牌面的二元组。

Top系列函数

返回(index,subindex,True/False),True为符合条件。

convertSubindex(subindex)

将数组的subindex使用康托展开转换为整型数。

三、策略定义

随机策略

为均匀采样。

Call

固定概率。

Raise

固定。具体数额为(上限-下限)的百分比,该百分比服从均匀分布。

Fold/Check

固定。有check时不进行fold。

四、开发环境与依赖库

Python 3.7

numpy

五、有关版权

项目为本作者独立开发,版权所有。

联系方式:wfzhangzeyu@163.com

About

德州扑克的仿真引擎,用于强化学习算法实验优化。含API接口说明。


Languages

Language:Python 100.0%