德州扑克游戏

哇,好久好久没写东西啦。。。

这两天实现了一个简单的游戏引擎,可以发牌,可以比较两手牌的大小

由于最近都在倒腾Golang,所以用GO实现的。这阶段过后准备用这个引擎来实现一个简单的AI对战,现在先记录一下

接下来我假设你已经懂游戏规则和俗语了

首先是牌的储存,2~~A,一共13张牌,我用的是一个14位的二进制区间来储存的,比如2-A,将表示为:11111111111110,辣么第一位是干啥的呢,请继续看下面

这样的储存方式除了省空间外还有什么优势呢?我们顺子的判断为例:
例如顺子10JQKA,在二进制区间将表示为11111000000000,叫它S
现在我们有手牌2 3 10 J Q K A,那么它的二进制表示是11111000000110,叫它T
那么T&S==S的话,就可以说明T包含一个顺子,并且顺子是10JQKA
S转化为10进制的话是15872
类似的我们将所有可能的顺子预先保存好,如下表(10用T表示):

----------------------------------------------------------------------------------------------------

TJQKA | 9TJQK | 89TJQ | 789TJ | 6789T | 56789 | 45678 | 34567 | 23456 | A2345 |

15872 | 7936   | 3968  |  1984  | 992    |  496    | 248     | 124    |  62     |   31     |

-----------------------------------------------------------------------------------------------------

由于德州扑克里面A 2 3 4 5是最小的顺子,现在你可以明白二进制区间里第0位的作用了,和最高位一样也是保存A

我们维护一个容量为4的int数组straight,它表示四个花色中每种花色的牌,储存原理见开头,它将被用来快速的判断同花顺,同时还可以用来判断是否为同花

再维护一个int变量hand,它表示所有手牌的并集,不分花色。它将被用来快速的判断是否为顺子

最后维护一个容量为13的int数组count,它用于对每种牌值出现的次数计数

我们将所有牌型做一个分级:
皇家同花顺:10
同花顺 :9
四条 :8
葫芦 :7
同花 :6
顺子 :5
三条 :4
两对 :3
一对 :2
高牌 :1

比较的时候先比较两手牌的等级,等级相同的情况下,我们进一步分析每一副手牌的value值。
我的value的算法如下:
对你的手牌进行排序,排序规则是出现次数多的优先,次数相同的则值大的优先,比如:
7 8 4 2 2 A K,排序后为:22AK874,可以理解为16进制:0x22AD874。
需要注意的是,顺子和同花不适应此算法,顺子的value就是该顺子的最高牌;同花的value是该花色的牌并集(具体读者可以自己思考)

各种牌型的判断以及比较:
1、皇家同花顺 royal flush
这个最简单了,直接用四个花色的牌集(详见straight数组),去和15872相与即可(原理见上)
一场牌局只可能出现唯一皇家同花顺,所以只需要记录等级即可,因为只可能win or tie(五张公牌)

2、同花顺straight flush
和皇家同花顺类似,从大到小遍历所有可能的顺子,和它们做与操作。value值是该顺子中最大的高牌

3、四条 four of a kind
维护一个数组count []int用于对每一种牌值进行计数即可。
还有一种方法是将四种花色的牌集相与,最后二进制区间内还是1的那些就是我们要的。

4、葫芦 full house
通过count数组先遍历有没有出现三次的,有的话,再遍历有没有出现2次的

5、同花 flush
有两个方法,一个是对每一个花色的牌集进行遍历,看看二进制集合里有没有5个1
第二个方法详见代码,判断同花的逻辑处

6、顺子 straight
取所有花色牌的集合,去和所有可能的顺子做与操作

7、三条 three of a kind;两对 two pairs; 一对 one pair
运用count数组计数器

源码开源在github上:https://github.com/SongLiangChen/TexasHoldem.git

时间: 2024-10-25 18:50:45

德州扑克游戏的相关文章

德州扑克AI WEB版

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

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

德州扑克是一种技巧性非常强的扑克游戏,有一定的运气成分,但玩家之间主要还是要靠斗智力.耍手腕.动脑筋.其规则非常简单,比较容易掌握,但是要达到精通的境界却有一定的难度. 我们可以定义一个枚举来罗列出所有的牌型: [cpp] view plain copy //牌的类型枚举 enum CardTypeEnum { ctNoneCard = 0, ctHighCard,      //高牌 ctDouble_OneCard,//一对 ctDouble_TwoCard,//二对 ctThreeCard

模拟德州扑克对战游戏

================================================================ 注意:本文参考"巧妙的Python数据结构玩法|实战德州扑克"的相关内容,并在此基础之上完成模拟扑克对战游戏. 原文网址:http://mp.weixin.qq.com/s/JQ0zJGf7Tz49Xn78x7Z40g ================================================================ 我们写了两

德州扑克输赢判断-C#

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

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

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

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

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

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月开始,要设置环境,设计框架,任务分工,以及各个模块代码的编写.从我个人的感觉来看,整个过程能够说是一个比較艰辛的历程. 德州扑克是一种棋牌类游戏.属于一种博弈过程,起先我对这个游戏没有不论什么的了解,最多的也仅仅是在影视题材里面见过,可是详细的游戏规则并不懂.而正是在这种

2015华为德州扑克参赛总结——软件工程

直到6月2号晚上零点,为期一个月的华为德州扑克比赛也算告一段落了.我们团队总共有3人,其中,一个同学(吴晓东)负责算法的设计,一个同学(宋振兴)负责消息的解析,而我则负责整个框架的设计以及具体决策算法的实现.从5月份初报名开始,到环境的搭建,框架的设计,任务的分工,算法的设计以及各个模块代码的编写,从我个人的感觉来看,整个过程可以说是一个比较艰辛的历程. 德州扑克是一种棋牌类游戏,属于一种博弈过程,起先我对这个游戏没有任何的了解,最多的也只是在影视题材里面见过,但是具体的游戏规则并不懂.而正是在