模拟德州扑克对战游戏

Posted 君以沫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟德州扑克对战游戏相关的知识,希望对你有一定的参考价值。

================================================================

注意:本文参考“巧妙的Python数据结构玩法|实战德州扑克”的相关内容,并在此基础之上完成模拟扑克对战游戏。

原文网址:http://mp.weixin.qq.com/s/JQ0zJGf7Tz49Xn78x7Z40g

================================================================

 

    我们写了两个模块:poker_game.py和comparing_cards.py。其中模块comparing_cards.py主要实现的功能是手牌类型的识别,等级划分,以及大小的比较。该模块的实现,主要是参考上面提到的文章里的内容,根据需要进行了一定的改动。可以参考该文章进行理解和阅读,我们主要关注第二个模块poker_game.py,也就是实现模拟对战的模块。

    模块comparing_cards.py的代码如下:

"""手牌排序"""
def card_ranks(cards):
    ranks = [0123456789TJQKA.index(r) for r,s in cards]
    ranks.sort(reverse=True) #reverse实现降序排序
    return ranks
"""判读顺子""" #注意,用set(ranks)实际上执行了一次唯一化操作,在将列表转换为集合的过程中,相同的元素只保留了一个,下同 def judge_straight(cards): ranks = card_ranks(cards) return ( max(ranks)-min(ranks) ) == 4 and len( set(ranks) )==5 """判断是否为同花""" def judge_flush(cards): hand_flush = [s for r,s in cards] return len( set(hand_flush) ) == 1 """判断炸弹,三带二""" #因为return会终止函数,所以如果在判断成对(即n=2)的时候,如果ranks中含有两对,结果只返回第一对,这也是后面判断成对的时候,为什么还出现lowpair的原因 def judge_kind(n,ranks): for r in ranks: if ranks.count(r) == n: return r return None """判读两对""" #reversed()函数是返回序列seq的反向访问的迭代子。参数可以是列表,元组,字符串,不改变原对象。 #list(reversed(ranks))返回列表的反向排序的列表 #map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。 def two_pair(ranks): pair = judge_kind(2,ranks) lowpair = judge_kind(2,list(reversed(ranks))) if pair and lowpair!=pair: return (pair,lowpair) else: return None
"""对九种牌型的总的排序""" def hand_rank(hand): if type(hand)==tuple: hand = hand[1] ranks = card_ranks(hand) if judge_straight(hand) and judge_flush(hand): #同花顺 cards_type = "同花顺" return (9,max(ranks)),hand,cards_type elif judge_flush(hand): #同花 cards_type = "同花" return (8,ranks),hand,cards_type elif judge_kind(4,ranks): #炸弹 cards_type = "炸弹" return (7,judge_kind(4,ranks),judge_kind(1,ranks)),hand,cards_type elif judge_kind(3,ranks) and judge_kind(2,ranks): #三带二 cards_type = "三带二" return (6,judge_kind(3,ranks),judge_kind(2,ranks)),hand,cards_type elif judge_straight(hand): #顺子 cards_type = "顺子" return (5,max(ranks)),hand,cards_type elif judge_kind(3,ranks): #三条 cards_type = "三条" return (4,judge_kind(3,ranks),ranks),hand,cards_type elif two_pair(ranks): #两对 cards_type = "两对" return (3,two_pair(ranks),ranks),hand,cards_type elif judge_kind(2,ranks): #一对 cards_type = "一对" return (2,judge_kind(2,ranks),ranks),hand,cards_type else: #单张 cards_type = "单张" return (1,ranks),hand,cards_type """判断扑克大小""" #命名参数key,其为一个函数,用来指定取最大值的方法 def poker(hands): return(max(hands,key=hand_rank))

    模块poker_game.py的代码如下:

import random #生成随机数
import comparing_cards

"""随机生成己方手牌"""
def drawing_cards():
    #获取手牌数字
    str_tool1 = 0123456789TJQKA
    num1 =  [random.randint(2,13) for _ in range(5)]
    poker_number = [str_tool1[x] for x in num1]
    #获取手牌花色
    str_tool2 = 0SCDH
    num2 = [random.randint(1,4) for _ in range(5)]
    poker_suit = [str_tool2[x] for x in num2]
    #生成手牌组合(列表)
    cards = [poker_number[x]+poker_suit[x] for x in range(5)]
    return cards
    
    
#生成四个人的手牌
P1 = drawing_cards()
P2 = drawing_cards()
P3 = drawing_cards()
P4 = drawing_cards()
#判断牌面等级、类型
P1_type = comparing_cards.hand_rank(P1)
P2_type = comparing_cards.hand_rank(P2)
P3_type = comparing_cards.hand_rank(P3)
P4_type = comparing_cards.hand_rank(P4)

print("每个人的手牌是:")
print(P1,P1_type)
print(P2,P2_type)
print(P3,P3_type)
print(P4,P4_type)

winner = comparing_cards.poker((P1_type,P2_type,P3_type,P4_type))
print("获胜的人的手牌是:")
print(winner)

    在这里,随机生成四副手牌,判断每副手牌的类型并比较大小,选出在四副手牌中获胜的一方。这里使用了一个很简单的模拟,并没有进行更为复杂的设计,当然可以结合德州扑克的游戏规则,进一步设定条件要求,完善该游戏。

以上是关于模拟德州扑克对战游戏的主要内容,如果未能解决你的问题,请参考以下文章

团队项目----基于德州扑克的数据结构分析

java和h5 canvas德州扑克开发中

德州扑克AI WEB版

棋牌平台搭建教程-德州扑克算法详解

德州扑克AI

德州扑克AI(译)