利用业余时间做了个Qt版单机斗地主(下载地址:http://download.csdn.net/detail/dowithsmiles/6415855),比较粗糙,还有很大改进空间。不过还是想趁现在把思路总结一下。

一、 牌型判断

斗地主中的牌型有:单张、对子、三个、三带一、三带二、飞机(如555 666)、飞机带两单、飞机带两对、连对(44 55 66...)、顺子(34567...)、炸弹、炸弹带一张、炸弹带一对、炸弹带两单、王炸、双王带一张、双王带一对、双王带两单。应该就这些了,可能某些玩法的牌型会有细小的差别。

我们构造四个数组,分别记录含有一张、两张、三张、四张牌的点数集合(以下都是伪代码):

vector<point> oneArray;
vector<point> twoArray;
vector<point> threeArray;
vector<point> fourArray;

比如有一手牌为55 6 77 888 999 KKKK,那么oneArray 有{ 6 },twoArray有{ 5, 7 },threeArray有{ 8, 9 },fourArray有{ K }。这样一来,牌型是不是很好判断了呢?挑几个例子吧。

oneArray.count == 1 &&
twoArray.isEmpty &&
threeArray.isEmpty &&
fourArray.isEmpty

这是单张。

oneArray.isEmpty &&
twoArray.count == 1 &&
threeArray.count == 1 &&
fourArray.isEmpty

这是三带二。

oneArray.sort(ASC);   // 按点数大小升序排列
oneArray.count == 4 &&
oneArray[0] != oneArray[1] &&
oneArray[2] == Small_Joker &&
oneArray[3] == Big_Joker &&
twoArray.isEmpty &&
threeArray.isEmpty &&
fourArray.isEmpty

这是双王带两单。

oneArray.sort(ASC);   // 按点数大小升序排列
oneArray.count >= 5 &&
oneArray.first >=3 &&
oneArray.last < 2 &&
(oneArray.last - oneArray.first == oneArray.count - 1) &&
twoArray.isEmpty &&
threeArray.isEmpty &&
fourArray.isEmpty

貌似挺复杂,其实很容易理解。看出来了吗?这是顺子。

好了,其他的以此类推吧,所有牌型都可以用这样的方式判断出来。

二、 判断是否大过另一手牌

定义一手牌,光确定牌型不够的。我还引用了两个变量basePoint和extraValue,basePoint为一手牌的主要点数。对于单牌,它为单牌点数;对于三带一,它是三张相同牌的点数;对于顺子和连对,它是最小点数。而extraValue仅用于确定顺子、连对和飞机的长度,下表是一些例子:

牌型 basePoint    extraValue
5 单张 5 0
66    对子 6 0
77722   三带二  7 0
456789   顺子      4 6
33445566    连对 3 4
555666777 飞机  5 3

对于非炸弹的普通牌型,B大过A的条件为

B.type == A.type && B.basePoint > A.basePoint

若A是顺子、连对、飞机,除了上面判断条件外,还有一个条件:B.extraValue == A.extraValue

若A是普通牌型,而B是炸弹或王炸(不带牌),则B可以大过A。

若A、B都是炸弹,B大过A的条件同样为 B.basePoint > A.basePoint

若B是王炸,那么不管A是什么,直接打翻在地。

好了,按这个逻辑去完善吧。

三、洗牌

关于洗牌网上有很多算法可以借鉴。我使用的是最简单的随机抽牌法,就是从原始的牌序列中随机抽出一张,依次放到另一个序列中,原始牌抽完,新序列就是洗好的牌了。

四、出牌策略

如何出牌是最核心的部分,也是主观性最强的部分,每个人都有自己的出牌方式,我说说自己的思路吧。出牌分为主动出牌和接牌两种情况,主动出牌我的大致步骤是:

1. 如果当前只剩一手牌,直接出完获胜。

2. 不是一手牌,则计算是否有较好的顺子,有的话出顺子。

3. 没有顺子的话,挑出飞机打出。

4. 没有飞机,挑出三带打出。

5. 没有三带,挑出连对打出。

6. 没有连对,就老老实实从最小的牌开始打起。

可能有人会问,第2点里,怎样才算“较好的顺子”?下面具体说明一下。

如果我们手上的牌是3 4 5 66 77 88 9 10 J,你会怎么出?大部分人应该都会先出345678,再出6789(10)J,无剩牌,这就是最优的顺子。如何用算法找出这组解呢?我用的是深度优先递归法,即先挑出一个顺子,除去,在剩下的牌中再挑出一个顺子,直到剩牌中无法构成顺子,然后记录顺子和最后的单牌。这样遍历出所有的顺子策略以及它们的剩牌,为了选出最优策略我们要比较一下剩牌的情况,我的计算方式是剩牌越少越好,剩牌一样多的情况下,单牌点数之和越大越好。

接牌策略相对简单,根据上家的牌型,挑出来打就是了,但仍然有许多要顾虑的情况。比如上家打了88,而你手上有AAA,如果上家是对家而且仅剩一张牌,那你肯定会打的。如果上家剩牌,可能你会先不急着去打。类似这样的情况很多,因此策略因人而异,要多做判断。

Qt单机版斗地主游戏相关推荐

  1. 单机版斗地主游戏源代码,纯JS编写的斗地主单机版小游戏源代码

    单机版斗地主游戏源代码,纯JS编写的斗地主单机版小游戏源代码,下载游戏后,直接运行index.html即可. 完整代码下载地址:单机版斗地主游戏源代码 index.html <!DOCTYPE ...

  2. 单机版游戏 linux,[基于linux系统图形单机版农场游戏.ppt

    [基于linux系统图形单机版农场游戏 07届毕业设计论文答辩 基于linux系统图形单机版农场游戏 通信xxxx xxxx 指导老师:XX 专业:通信工程 院系:计算机与通信工程 姓名:XXX 学号 ...

  3. C++开发网络版斗地主游戏,附完整源码

    单机版斗地主扑克牌游戏.这款游戏拥有强大的AI以及智能的提示功能.玩家的对手是高度智能的电脑玩家,其特点是智能的提示机制和免费获得实用的记牌器功能,玩家不用记所出的牌.此外,此款游戏还拥有精美的界面, ...

  4. 基于linux的游戏论文,基于linux系统的图形单机版农场游戏——毕业论文.doc

    基于linux系统的图形单机版农场游戏--毕业论文 基于linux系统的图形单机版农场游戏 摘要 随着社会的发展,人们的生活越来越丰富多彩,特别是网络的飞速发展,让人们可以在工作之余享受更多的乐趣和缓 ...

  5. Java 编写斗地主游戏 窗体程序 完整源码

    今天为大家分享斗地主游戏的开发与制作,目前是单机版游戏,后续时间空了,会给大家分享下联机版本的开发与制作.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步 开 ...

  6. QT实现maroon游戏

    QT实现maroon游戏 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 一款适用于触摸设备的Qt Quick游戏,该游戏使用SpriteSequence,Parti ...

  7. java斗地主随机发牌_使用Java实现斗地主游戏的发牌过程

    package com.review.test; import java.util.ArrayList; import java.util.Collections; import java.util. ...

  8. qt实现扫雷游戏一:算法实现

    qt实现扫雷游戏一:算法实现 说明 问题总结 目录 算法文件 头文件 源文件 说明 借助qt写了一个扫雷程序,记录一下. 这是这两天用qt写扫雷所做的一些事情,在这里总结一下,另外,源代码和整个工程已 ...

  9. java案例-实现斗地主游戏案例

    java案例-实现斗地主游戏案例 1.需求分析: 模拟斗地主游戏,利用集合,Map实现斗地主的逻辑,并且可以看分派好的牌 2.具体实现: (1)在牌盒(字符串数组)存储四个花色: String[] c ...

最新文章

  1. 服务器测速,php在线测速
  2. 用Leangoo管理你的项目
  3. 一种消息和任务队列——beanstalkd
  4. 《Ossim应用指南》入门篇
  5. 【Scratch】青少年蓝桥杯_每日一题_8.03_飞猫
  6. 公司用的 MySQL 团队开发规范,非常详细,建议收藏!
  7. 查php源码授权后门,PHP授权系统+支持盗版入库+一键黑页后门注入+卡密授权
  8. Tomcat环境开发技巧
  9. 李航:做本质的、严谨的、有意思的研究,纪念我的导师长尾真教授
  10. Repeater绑定数据库
  11. hdu 3501(欧拉函数)
  12. 木疙瘩动画效果视频学习
  13. rpm -ivh *rpm 是什么意思
  14. android mediastore参数,从 mediastore Android获取全屏幕缩略图
  15. Unity判断物体相对位置
  16. 19 款国产手机无一幸免:15 分钟破解人脸识别,打印眼镜让刷脸形同虚设
  17. java74-GUL面板
  18. Notepad++的字体设置加Consolas和微软雅黑混合字体转载
  19. PL/SQL 入门学习(二)
  20. 【打卡功能实现思路】

热门文章

  1. 新版iTunesConnect应用撤销后重新上传二进制代码。
  2. Python | 数据匹配+统计
  3. 其实人间尽耳聋丨黄霑:和金庸齐名的鬼才 一代风流词作家!
  4. andriod sdk 模拟器的安装以及root
  5. 【fraud detection】点击量作弊——互联网广告业的附骨之蛆!
  6. 基于PCE的SDN演进方式
  7. 【地图册制作】ArcGIS分幅制图——以深圳地铁线路图为例
  8. 答题抽奖活动小程序运营注意事项
  9. 更新BIOS翻车的进来查看解决方案
  10. 浙大计算机教授闹不植入芯片,浙江大学正式宣布:“意念”控制,不再是传说...