C++开发斗地主(QT)第一篇之数据结构

斗地主,是一种在中国流行的纸牌游戏。游戏最少由3个玩家进行,用一副54张牌(连鬼牌),其中一方为地主,其余两家为另一方,双方对战,先出完牌的一方获胜。如今已风靡整个中国,并流行于互联 上!

从今天开始,我将会一步步详细讲解单机斗地主游戏开发过程。该游戏以C++为主,QT做为界面(包括显示 动画 声音等)的Window平台,没有用到第三方面库如CoCo2d 等,至于为什么要用QT,主要是自己得心应手(QT动画 透明 图像处理太简单了),比VS简单,而且还能跨平台,本游戏在最后开源。 上的斗地主算法 源码很多,如果写的不好,欢迎批评 探讨。为了提起大家的兴趣,我给我做好的游戏功能和界面简单给大家看一下:

该游戏的大部分资源都是人 上下载的,如有侵权,请及时通知,我将会删除。本软件主要算法用的是 宽立斗地主AI设计与实现

我在此基础上用QT在Windows上进行了详细开发,主要是为了研究算法,我在此基础上对算法做了适当修改。

游戏主要功能:音效开关  机器人模式  记牌器窗口 退出 功能按键,还有出牌控制 音效  警等,以后会更加完善,加一些设置,如声音大小  游戏难度 人物选取 等功能。

现在开始来讲游戏的开发过程:

一、数据结构,任何软件开发都离不开数据结构和数据处理。

1.牌型枚举(CardTypes):

 

我给他们定义了15种牌型:

⒈错误牌型:不能出的牌型

⒉单牌:例一张A

⒊对子:例AA

⒋三张:AAA

⒌三带一:AAAB

⒍三带二:AAABB

⒎单顺:也叫连子3,4,5,6,7,8,9…A一直到A为止

⒏连对:33,44,55,66

⒐飞机:333,444或444,555,666

⒑飞机带单:33344458

⒒飞机带双:3334447799

⒓四带单:88889J 四张可以带2单

⒔四带双:88883377 四张可以带2个对子

⒕炸弹:7777

⒖王炸:又称火箭 大小王一起出,是最大牌型

牌型的大小:

火箭是最大的牌。

炸弹,除火箭和比自己大的炸弹外,比其它牌型都大。

对一般牌型而言,只有当牌型相同和总张数相同的牌,才可比较大小。

其中像三带一、三带二、飞机带翅膀等组合牌型,只要比较其牌数最多牌值就行。只有比当前出的牌(场牌)大的牌才能出。

2.牌值枚举(CardValue):

 

我把牌分成了54种类,即牌面大小(3,4,5,6,7,8,9,10,J(11),Q(12),K(13),A(14),2(15))13种,和四种花色(梅花,方块,黑桃,红桃),再加上小王(16),大王(17)。13*4+2=54;

3.牌型结构体( CardNode):

这里先对几个定义的数据变量时行解释一下,构造函数不用讲,其它函数后其用到的时候再讲

cardType是牌型,只有三种,王炸,单纯,连续;
value 是牌型的值(3-17),单纯类型为牌的面值,连续类型为起始牌的面值,相同牌型以此比较大小;
mainNum是主牌张数,比如三带二和飞机里mainNum=3, 连对时, mainNum=2;
seralNum是连续张数,seralNum=1是单纯牌型,顺子时seralNum>=5;
subNum是副牌数目,三带一和四带二时subNum=1,三带二和四带两对时,subNum=2;
cards是牌型里包括的牌的牌值(1-54),比如三带一时,可能就是[3, 16, 42, 4], 连对时,可能就是 [3, 16, 4, 17, 5, 18, 6, 19]等等
aggregate是权重,根据不同的情况求出权重,再按照权重排序所有牌型。可以是本牌型的权重,也可以是手牌里除了本牌型外剩下所有牌加在一起的权重。

这里要注意的是 value 的是牌的面值:3-17,cards里的值是(1-54);在调用的时候要用一个转换函数,获取牌的面值:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年3月22日
下一篇 2020年3月22日

相关推荐