- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
毕业,课程,设计,数据结构,算法,斗地主毕业,课程,设计,数据结构,算法,斗地主
PAGE \* MERGEFORMAT7
一、题目及要求
名称:斗地主
内容:该游戏由三人玩一副牌,地主为一方,其余两家为另一方,双方对战,先出完手中牌的一方胜。
要求:
1.发牌
一副牌 54 张,地主20张,剩下二人每人 17 张。
2.出牌
地主首先出牌,然后按玩家ID顺序依次出牌,轮到用户跟牌时,用户可以选择 “ 不出 ” 或出比上一个玩家大的牌。某一玩家出完牌时结束本局。
3.牌型
王炸:即双王(大王和小王),最大的牌。
炸弹:四张同数值牌。
单牌:单个牌。
对牌:数值相同的两张牌。
三带一:数值相同的三张牌 + 一张单牌。
顺子:五张或更多的连续单牌。
4.牌型的大小
王炸最大,可以打任意其他的牌。
炸弹比王炸小,比其他牌大。都是炸弹时按牌的分值比大小。
除王炸和炸弹外,其他牌必须要牌型相同且总张数相同才能比大小。
单牌按分值比大小,依次是 大王 小王 2AKQJ109876543 ,不分花色。
对牌按分值比大小。
顺牌按最大的一张牌的分值来比大小。
三带一按其中的三顺部分来比,带的牌不影响大小。
5.胜负判定
任意一家出完牌后结束游戏,若是地主先出完牌则地主胜,否则另外两家胜。
程序分析
2.1 意义
随着计算机的普及,各种各样的游戏在人们的生活中扮演越来越重要的角色。很多人都把一些小游戏作为工作之余的休闲活动,斗地主就在其中扮演了相当重要的角色,在紧张的工作之余给人带来最大程度的放松,增进了人们之间的交流,沟通。
2.2 程序功能
该程序要实现以下功能:
(1)定义landcars类:牌的逻辑大小,牌上的数字,牌的颜色。
(2)定义landplayer类:玩家标识符,玩家身份的判断,玩家手中剩余牌数,玩家手中发到的牌。
(3)定义playrule 类:出牌玩家的ID,出牌张数,出牌的类型,当前用户出牌后不要牌的玩家。
(4)牌的初始:定义一副牌生成六种花色:红桃,方块,美化,黑桃,小王,大王(A-K每13张为一色,大王小王各一色),且逻辑值大小为大王小王2AKQJ109876543 。
(5)洗牌:再定义一副牌,将牌中数值赋值为“0”,用随机函数指向第一副牌中的某一张牌,若新定义的牌中没有与这张牌相等的牌,则将第一副牌的牌面大小及其逻辑值赋值给新定义的牌,直到新定义的牌都被赋值且不重复;之后将打乱顺序的新牌重新复制给原来的牌。
(6)发牌:先对每个玩家的牌进行初始化,并将玩个玩家的次序定为1,2,3;先扣除最后的三张牌,并按照123的次序给三个玩家依次发牌,记录每个玩家手中的牌数;用随机函数产生地主,与三个玩家依次判断ID确定地主是哪一个玩家,并将之前扣留的三张底牌给地主记录地主手中牌数。
(7)理牌:三个玩家都试用同一个理牌的函数,先定义一副牌将一个玩家的牌采用冒泡函数依次比较直到牌按逻辑顺序由小到大排好,再复制给玩家手中。
(8)牌型的判断:
定义nowCar[],为玩家所要出的牌的缓冲区。
1. 单牌:先判断牌的数量是否为单牌,如果是单牌则继续判断玩家手中的牌是否有这张要发出的牌,如果有这张牌就将这张牌与前一个玩家所出的单牌比较牌的逻辑大小,若牌的逻辑大小大于前一个玩家,就把这个牌赋值给要出的牌,并且将玩家手中原有的牌置为“0”并要把玩家手中牌的数量减去1;如果不是单牌或者玩家手中不存在该牌或是该玩家所出牌比前一个玩家出牌的逻辑大小要小,就将玩家出的牌置为0,由下一个玩家出牌。
2. 对子:先判断玩家要出的前两张牌是否相等,如果相等则继续出的牌数是否为两张,如果是两张牌就和玩家手中的牌进行比较,如果有这张牌就将这张牌就将数量加1,如果数量为2,继续与玩家手中牌比较,若存在就比较其中一张牌与前一个玩家所出牌中的一张,若逻辑大小大于前一个玩家所出牌,就将这个玩家所出牌复制给前一个玩家出的牌,玩家手中原有的牌置为“0”并要把玩家手中牌的数量减去2,如果不是出的牌不相等,出的牌不是双牌,玩家手中不存在该牌或者玩家要出的牌小于前一个玩家出的牌,就将玩家出的牌置为0。
3. 三带一:定义存放的牌的数组长度为4,把数组置为“0”;定义两个数,分别放相同的牌和不同的牌。首先判断要出的牌的长度是否为4,如果长度为4,则定义temp,并将其置为“0”,采用冒泡排序将4张牌按从小到大的顺序排好,经过排序的牌的数值复制给存放的牌的数组中,比较后把是前三个数相同还是后三位数相同,相同牌赋值给temp1,带的牌赋值给temp2,之后判断玩家手中要出的4张牌中相同的前三张牌在玩家手中牌中是否存在,有一张count3加1,如果count3等于3,flag置为“1”,如果相同牌在玩家手中牌中存在,就把玩家手中牌的逻辑大小赋值给相同牌,如果相同牌的逻辑大小比前一个玩家出的相同牌大,就把现
文档评论(0)