模拟德州扑克对战游戏

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

注意:本文参考“巧妙的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)

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

时间: 2024-12-27 00:35:03

模拟德州扑克对战游戏的相关文章

一场改变你投资生涯的讨论:职业德州扑克手看交易

各位投友大家好. 校长今天花时间仔细读了一篇长文,叫做<职业德州扑克手看交易:没犯任何错误照样输个精光>,非常棒的文章. 可惜不知道作者是谁,但看得出来,文中讲到的他自己在德州扑克上的经验是真实的. 这篇文章提出了两个非常有价值的概念. 第一个叫盈亏同源.有一些亏损是你在追求盈利道路上必须要支付的成本,这是不可避免也是不应该避免的.因为你一旦避免了这些亏损,你同时也就失去了盈利的机会. 而另外一些亏损择时可以避免也是应该避免的.所谓高手就是在这个部分发挥功力. 第二个概念是把风险分成了三层:系

德州扑克游戏

哇,好久好久没写东西啦... 这两天实现了一个简单的游戏引擎,可以发牌,可以比较两手牌的大小 由于最近都在倒腾Golang,所以用GO实现的.这阶段过后准备用这个引擎来实现一个简单的AI对战,现在先记录一下 接下来我假设你已经懂游戏规则和俗语了 首先是牌的储存,2~~A,一共13张牌,我用的是一个14位的二进制区间来储存的,比如2-A,将表示为:11111111111110,辣么第一位是干啥的呢,请继续看下面 这样的储存方式除了省空间外还有什么优势呢?我们顺子的判断为例:例如顺子10JQKA,在

华为软件精英挑战赛【德州扑克】心得体会

这是华为举办的一个软件竞赛,华为提供一个德州扑克台桌的server,我们要根据牌型等因素,给出出牌的策略,类似模拟牌手的程序.从知道挑战的题目到提交最终版本的程序中间只有一个月的时间,刚看到这个题目一点头绪没有,看了论文有用蒙特卡洛模拟,决策树等,各种没听过的词汇,感觉写出这个程序会很难,和我一个教研室的小伙伴们看到这个题目的时候陆续都放弃了. 思考了半天我也放弃了,因为接下来几个星期还有实习的面试和小论文等着我完成,就这样过了2个星期,期间我把小论文与实习面试都完成了,在一天早晨无意中又点开了

[swustoj 1088] 德州扑克

德州扑克(1088) 问题描述 德州扑克是一款风靡全球的扑克游戏.德州扑克一共有52张牌,没有王牌.每个玩家分两张牌作为“底牌”,五张由荷官陆续朝上发出的作为公共牌.开始的时候,每个玩家会有两张面朝下的底牌.经过所有押注圈后,若仍不能分出胜负,游戏会进入“摊牌”阶段,也就是让所剩的玩家亮出各自的底牌以较高下,持大牌者获胜.因技巧性强,易学难精又被称为“扑克游戏中的凯迪拉克”. 现在有N个玩家进入摊牌阶段(编号为1到N),摊牌阶段比大小的规则是,用自己的2张底牌和5张公共牌结合在一起,选出5张牌,

德州扑克AI(译)

前言: 最近在研究德州扑克的AI, 也想由浅入深的看下, 在网上找了一圈, 发现很多文章都提到了一篇文章: Programming Poker AI. 仔细拜读了一下, 觉得非常不错. 这里作下简单的翻译工作, 可能加些自己的一些理解, 权当做一回大自然的搬运工, ^_^. 扑克数据模型抽象(Poker Data Type): 本文的作者倾向于使用位/字节级别来描述牌的数据模型(Hand=玩家手牌+公共牌), 也算一种高阶的抽象. 花色(Suit), 其值范围为0..3, 并假定梅花(Clubs

德州扑克输赢判断-C#

首先讲一下思路吧. 德州扑克一把有7张牌,可能组成10种牌型,所以,在网络游戏中,不可能是两两比较,然后排序,最简单的做法就是对每个玩家的手牌计算一个权值,然后对最终玩家的权值进行排序即可得到最终的输赢顺序. 其实这个是我的毕业设计,在大三的时候,我曾在一位学长王总的带领下做过一个德州扑克的记录软件,那个软件比较简单,只是有记录员记录现实世界中正在进行的游戏,然后把玩家的牌,叫牌操作和游戏结果记录下来,以供将来重放时做教学使用.当时的项目并没有输赢判断的功能,而是由记录员自己输入输赢的玩家顺序.

德州扑克AI WEB版

继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼.哈哈,估计只有自己能玩了 这两天重构了一下界面,基于web服务器和浏览器来交互. 服务器和客户端之间用websocket通信,这种全双工长连接更方便服务器及时的将整个游戏数据向客户端推送. 这篇随笔主要记录一下做前端界面的时候遇到的一些坑,至于德州扑克游戏的具体逻辑以及AI的逻辑可以查看我前两篇随笔 说道web服务器,go语言对这方面封装的非常好,用起来太爽了.而使用websocket,我们需要用到google提供的一个w

java和h5 canvas德州扑克开发中(二)

德州扑克网页源码在github上分享 https://github.com/lxr1907/pokers 感兴趣的可以上去看下. 1.通讯使用websocket,主要在message.js中. 2.用canvas画界面的代码主要在view.js中. 3.游戏逻辑控制代码在controll.js中. 4.poker.min.js是github上的一个开源画扑克牌的js,在drawCards.js中进行了简单的封装. 5.music.js主要负责音效播放. 6.texasIndex.html是游戏的

2015华为德州扑克入境摘要——软体project

直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是. 我们的团队一直共同拥有3民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细的决策算法.离5报名早年1月开始,要设置环境,设计框架,任务分工,以及各个模块代码的编写.从我个人的感觉来看,整个过程能够说是一个比較艰辛的历程. 德州扑克是一种棋牌类游戏.属于一种博弈过程,起先我对这个游戏没有不论什么的了解,最多的也仅仅是在影视题材里面见过,可是详细的游戏规则并不懂.而正是在这种