主要实现了一定设定下的德克萨斯扑克的游戏环境,并使用强化学习进行策略学习与优化。
人员设定:游戏为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.剩余牌型
用于定义每一局的牌局环境。
agentList[6]:智能体数组,类型为Agent对象。保存玩家智能体的对象。
debug:Debug开关,类型为布尔。True为输出牌局信息。
publicList[5]:公共牌数组,类型为Card对象。按照顺序保存五张公共牌。
cardPool:卡牌池,类型为CardPool对象。用于发牌。
scorePool:分数值,类型为整型值。用于记录当前分数池的值。
DPosition:庄家位置,类型为整型值。
roundScoreList:用于保存当前轮的各玩家下注数值。
foldNum:用于保存当前轮已经fold的玩家数。
agentCompetList[6]:智能体的牌面大小。类型为二元tuple。
foldWinner:当所有玩家全部fold时,最后fold的获胜玩家。类型整型值。
初始化函数,传入6个智能体。
进行一局游戏。返回值为列表score[6],代表本局游戏各个玩家的得分。
依次调用函数reset、prepare、round1-5()、win()。
返回值为本局的分数列表。
重置牌局变量和智能体的牌局变量。返回值为空。
确定各个玩家身份。返回值为空。
盲注轮和第一轮。包括如下动作:玩家发牌、下大小盲注、下第一轮注。返回值为空。
第二轮。翻开三张公共牌。返回值为空。
第三轮。翻开一张公共牌。返回值为空。
第四轮。翻开一张公共牌。返回值为空。
结算阶段。确定各位玩家的分数。返回值为整型的分数列表。
输出牌局环境。
输出各智能体当前情况。
用于定义玩家智能体。
name:智能体名称。类型为字符串。
identity:智能体的牌局身份。类型为单字符。
hand[2]:智能体的牌局手牌数组。类型为Card对象。
score:智能体的牌局剩余分数。类型为整型值。
final:智能体的牌局终止标志。0为未fold,1为已经fold。
重置牌局情况。
设置本局身份。
设置本局手牌。
下注,减去对应分数,同时返回值为该分数。
智能体决策。输入为之前的下注金额和最小下注金额,返回实际下注金额。是算法实现需要重写的接口。
当玩家为S角色时,使用check代替fold。其他与action函数相同。
卡牌池,包括除去大小王的52张牌。
bin[52]:为卡牌池中剩余卡片的编码,类型为整型。
从剩余卡牌池中抽取一张牌。改变bin数组并返回一个Card类的对象。
重置bin数组。返回值为空。
输出信息。
定义单张牌。
suit:花色标识,类型为1-4的整型值。分别代表黑桃、红桃、梅花、方块。
point:数值标识,类型为1-13的整型值。代表牌点。
输出信息。
返回小盲的标号。
返回大盲的标号。
返回大盲下家的标号。
牌面由二元组(index,subindex)组成,其中index是指牌型,subindex是指相同牌型之间的大小。index越小,subindex越大,牌面越大。
返回当前牌面的二元组。
返回(index,subindex,True/False),True为符合条件。
将数组的subindex使用康托展开转换为整型数。
为均匀采样。
固定概率。
固定。具体数额为(上限-下限)的百分比,该百分比服从均匀分布。
固定。有check时不进行fold。
Python 3.7
numpy
项目为本作者独立开发,版权所有。
联系方式:wfzhangzeyu@163.com