斗地主论文-CX
- 格式:docx
- 大小:4.20 MB
- 文档页数:19
摘要随着科技的进步,计算机已经普及每个家庭,而计算机游戏也随之越来越多,越来越丰富。
网络游戏、单机游戏等休闲游戏让众多人喜欢,而斗地主也受广大群众的追捧。
本设计以一副牌规则为准,将整个游戏按照发牌,叫牌,拆牌,以及出牌的流程划分为4个部分,开始时由系统调用发牌函数每人随机分到17张牌,留存3张底牌,然后电脑AI根据自己手上牌值与牌型结合给定权值决定是否叫三张底牌当地主。
一旦叫牌成功,剩下两玩家就是农民,联合“斗地主”。
双方以是否出完牌来决定胜负。
如果地主的20张牌都出完了,则地主一方胜;如果两个农民中任何一人手中的17张牌出完了,则农民一方胜出。
本论文主要讲述了单机版斗地主的游戏算法的设计,以Visual C++语言编译的一个应用程序。
使用者可以简单方便的实现斗地主游戏。
本程序界面友好,操作简单,比较实用。
本程序在详细设计时不断地修正和完善,经过测试阶段反复调试和验证,最终形成达到设计要求的可行系统。
关键词: 斗地主;纸牌; Visual C++;游戏核心算法AbstractWith the progress of science and technology, computers have universal every family, and with more and more computer games, increasingly rich.The network game, LAN game and other casual games for many people like it, but Landlord also affected by the broad masses in both hands.This design will be subject to rules of a deck of cards, the entire game in accordance with the licensing, call, cards, as well as the process is divided into four parts.Licensing function is called by the system at the beginning, then 17 cards are randomly assigned to each person and three cards are also retained. After that, the computer AI decides whether to call cards based on it's own cards value and the cards type which all have a particular weight.Once the call is successful, the remaining two players is farmers, jointing "Landlords". Whether the two sides finish cards determine the winner. If the landlord's 20 cards are finished, the landlord side win; If any one of the two farmers finishes 17 cards , the farmers win.This paper tells the stand-alone Landlord game algorithm is designed to Visual c + + language compiled an application. Users can simple to realize Fight the Landlord game. This procedure friendly interface, the operation is simple, is more practical.This procedure in the detailed design constantly correction and perfect when, after testing phase repeated commissioning and validation, and finally form the feasible system to meet the design requirements.Key Words: Fight the landlord; Cards; Visual C++; Game core algorithm目录1 绪论1.1 课题背景 (1)1.2 研究现状 (1)1.3 研究项目及意义 (1)1.4 本文的结构安排 (1)1.5 系统开发工具及其介绍 (2)1.5.1 开发工具的选择 (2)1.6 Visual C++编程特点 (3)1.6.1 C++语言的发展 (3)1.6.2 Visual C++ 6.0简介 (3)1.6.3 Visual C++ 6.0的开发环境 (4)2 斗地主基本知识 (4)2.1 斗地主规则 (4)2.2游戏流程框架 (5)3 主要模块 (6)3.1发牌 (6)3.1.1 第一发牌方案 (6)3.1.2第二发牌方案 (7)3.1.3 发牌算法的代码实现 (8)3.2 叫牌 (10)3.2.1 叫牌判断 (10)3.2.2 牌型估值 (10)3.3 拆牌 (14)3.3.1拆牌原因 (14)3.3.2寻找拆牌方案 (15)3.3.3 拆牌实例 (22)3.4 出牌 (22)3.4.1 出牌方法产生 (22)3.4.2 产生方法 (23)3.4.3效率问题 (24)3.4.4逐个产生和全部产生 (24)3.4.5内存使用 (25)4 结论及展望 (25)致谢 (27)参考文献 (28)1 绪论1.1 课题背景“斗地主”起源于湖北,据传是一位叫吴修全的年轻人,根据当地流行的扑克玩法“跑的快”改编的。
《斗地主心得体会》欢乐斗地主游戏的心得体会(市场营销081)1.欢乐斗地主游戏简介斗地主是一项益智小游戏,它没有什么关卡,只要能打败对手就好,但假如你输太多那么很抱歉,您就出局了,这是它的规则。
许多人会说这种游戏有什么玩头,但请您注意,这项游戏的生命力比农场强,而且这项游戏为积累了不少人气,每次进我们那栋楼都能听到斗地主的声音。
再说斗地主有很强的可玩性——你的对手或盟友是可变动的,而且你的对手你手中能利用的资源是可变动的,这就有很大的挑战性,这也在很大程度上体现了玩家的智慧。
2.欢乐斗地主游戏的非对称性斗地主是非对称性游戏,它需要游戏人员的竞争与配合。
为了赢得一局牌局很多人采用二打一得战术,即两个人坐在一起相互看牌来调戏第三方,这是一种很没水平的斗法,也有人利用自己申请的小号给自己送分,这都是很没水准的做法。
斗地主讲求合作与竞争,二打一本来就是不公平的游戏,但某种程度上又是很公平的,因为两个农民是各打各也就是说地主在很大程度上比农民多三张牌和先发牌的机会,但农民可以相互合作,在很大程度上又有点公平的意味。
3.欢乐斗地主的的一些技巧第一打牌就是赌博,不赌哪知时运高,所以第一步就要学会赌(假如你手上的牌是个人都能打过那么那局也就没有一点意义了),赌底牌。
如果你牌差的要命那么你就别赌,因为赌还是有希望的,假如你手上的牌就送你王炸都过不了,那就过。
第二要学会算牌,你差什么牌,你需要什么牌,学会算对手的牌,算你怎样出牌别人接起的机会,算你怎么出牌好些,这样你的胜算就会大很多。
第三你要会等,等机会,有时候自己就一张大牌,而手上的牌很好,那么你就等,等另两个把大牌耗完,再一举消灭。
第四要学会做贡献,不给对手机会,不要让地主过小牌,除非你有必须要过的小牌。
尤其是在你牌超烂的时候要作死的顶牌。
第五要相信你的盟友,除非你能有把握自己一把打完或对手的牌快打完了,这些可能的危险。
尽量给对手以机会,只有地主一方不要。
第六要在适时的机会放下你的主动权给对手,让他发牌,以方便你以后的牌,这种方式一般是自己手中有几张必须出的牌,但不好出时。
斗地主的感悟第一篇:斗地主的感悟斗地主的感悟小王一出,基本上都会被大王拍死。
说明副职没有实权!没有一张大牌开路,再顺的小牌都出不去。
说明领导很重要!无论你多会记牌、打牌,都抵不过人家手中的一把好牌。
说明实力比能力重要!如果一堆小牌连不起来,即使拿个双王也未必会赢。
说明再牛逼的领导也需一个好团队!为了斗败地主,一会儿我们结成同盟,一会儿我们“反目成仇”。
说明没有永远的敌人,也没有永远的朋友!必要的时候,即使拆散自己的牌也要送走搭档。
说明在一个团队里关键时刻要懂得自我牺牲,才能取得大家最终的胜利!第二篇:斗地主为什么是“斗地主”?“斗地主”因何而起,又因何命名?据说“斗地主”发源于湖北十堰地区,是当地农民为了发泄对地主残酷剥削的极端不满而创造的一种游戏。
可谁也不曾料到,这种游戏竟然会在某个历史时期变成现实。
所谓地主,就是土地生产资料的所有者,处于生产链条的上端;所谓农民,就是土地生产资料的使用者,处于生产链条的下端。
俗话说,哪里有压迫,哪里就会有反抗。
然而,历史上农民反抗地主的斗争几乎都失败了,自己也因此遭受了无尽的苦难。
在万般无奈之下,人们自欺欺人的给自己创造一种“斗地主”的扑克游戏,因为也只有在娱乐中,“农民”才有可能取得最终胜利。
因此,“斗地主”其实就是桌面上的政治斗争。
在“斗地主”的游戏中,“土地生产资料”就是最后的三张底牌,谁拥有这些“土地,谁就是“地主”,就是其他三个“农民”联合反抗的对象。
至于谁会拥有这些“土地”,就要看谁摸到那个翻开了的牌了。
事实上,每个人摸到这个牌的概率是一样的,或许,在这一局游戏里我还是“农民”,是被联合的对象;在下一局里我也有可能成为“地主”,成为被斗的对象。
这也印证了一句政治哲言:没有永远的朋友,也没有永远的敌人,只有永远的利益。
无论如何,当几个“农民”联合起来对付势单力薄的“地主”,这个时候,“地主”就已经成了弱势个体,而“农民”就成了强势群体。
用不公平的手段实现公平,这本身就是个暴政,而且是多数人的暴政。
斗地主人生
时至今日,我依然喜欢玩斗地主。
可是我已经忘记是什么时
候开始玩这个游戏了,这个游戏是我的电脑上只有唯一存档超过
两年的游戏。
到现在为止,我仍然喜欢玩。
我这个人平时爱好不多,一不好赌,二不贪玩,三不抽烟,四不酗酒,五不闲逛,六
不买商。
多年以前,我曾经就对玩斗地主这个游戏写过一篇经验分享
文章。
可是数年以后,我对于斗地主这个游戏又多了一些感悟与
思考。
随着时间的推移,我觉得人生就像“斗地主”。
为什么这么
说呢?首先,地主这个名词就是古代旧社会很常见词语,形容富裕。
斗地主,顾名思义就是贫与富之间的斗争啊。
玩这个游戏的人都应该知道游戏规则:游戏分两派,地主与
农民。
地主拥有较多的牌,意味着他们手里有很多的资源能够跟
农民斗法。
而农民单枪匹马是很难斗得过地主的,只有依靠两名
甚至三名农民的合作才能够最终赢下地主。
斗地主不能够轻敌,就像我们人生不能够轻视他人一样。
假
如你轻视了对方,你往往要遭遇惨败。
斗地主不能够草率打牌,
就像人生要合理规划一样,我们不能够随意地做出人生选择,否
则人生将陷入困境。
斗地主不能太相信队友,就行我们人生不能
够全然依托朋友一样,否则我们会被出卖。
斗地主不能狂妄自大,
游戏中有明牌,如果你的牌只有一点优势,你还明牌,你就会陷入被动挨打的境地。
斗地主不能够过早出杀手锏,否则一旦没有成功,对手就将你打倒在地。
对于斗地主,谋定而后动,三思而后行,应该是给我们最好的启示了。
“斗地主”游戏中的“炸弹”概率问题学院:土木工程学院班级:***姓名:***学号:***“斗地主”游戏中的“炸弹”概率问题1153340102 马敏超导语:“斗地主”是一款普及度很广的纸牌游戏,它规则简单易学,趣味性强。
两个王叫“王炸”、“火箭”,四张同号的牌组成“炸弹”。
游戏中,是否有炸弹常常决定游戏的胜负。
因此,本文着重对抓到炸弹的概率进行讨论研究。
关键字:斗地主 概率 炸弹 游戏 数学应用 正文:一、理论计算设“抓到王炸(两个王)”为事件A ;“抓到普通炸弹(四个同号牌)”为事件B 。
1、抓到王炸的情况:首先不翻开底牌时,你手里的牌有1754C 种情况,其中抓到两个王的情况有1552C 种情况,则抓到两个王的概率应该是:2、抓到普通炸弹情况:分母依然是1754C 。
再从54张牌里选指定的4个一样的,比如说我抓到4个2,先来看看抓到4个2的情况,不考虑也抓到其他炸弹,这样有1350C 种情况。
那么抓到指定的2个牌(比如抓到4个2和4个A )是炸弹的情况(同样有可能抓到3个或是更多个炸弹)的组合数应该是946C ,同理抓到指定的3个牌是炸弹有542C 种情况,抓到指定的4个牌是炸弹有138C 种情况。
根据容斥原理,计算抓到普通炸弹概率为;3、既有王炸又有普通炸的情况:如果想求非王炸的概率,就要把既含王炸又有普通炸的情况减去,同理,先看看有王炸又有1个指定牌的普通炸的情况,组合数为1148C ,有王炸又有2个指定牌的普通炸的情况数为744C ,有王炸又有3个指定牌的普通炸的情况组合数为340C ,不用管有4个炸又有王炸的情况,因为那种情况是不可能的,那样手里就18张牌了。
同理,由容斥原理知,既有王炸又有普通炸的概率:()%5038.9A 17541552==C C P ()%6016.979704715335876938452749613117541384135423139462131350113==-+-=C C C C C C C C C P B()%6166.079704715335876602907514261AB 17543403137442131148113==+-C C C C C C C P4、仅抓到普通炸弹的情况:仅抓到炸弹的概率为:5、仅抓到王炸的情况:仅抓到王炸的概率为:6、抓到炸弹(普通炸弹或王炸)的情况:抓到炸弹(普通炸弹或王炸)的概率为:()()()()%4889.18%6616.0%6016.9%5038.9AB B A B A =-+=-+=P P P P 7、抓不到任何炸弹的情况:抓不到任何炸弹的概率为:二、实例计算斗地主寻觅炸弹概率的时候往往遇到与底牌相结合的情况,从而判断叫地主时候能拿到炸弹的概率,下面看一个真正的例子:三人斗地主,没拿3张底牌之前,抓到3个7、3个K ,三个8,如果这种情况下叫地主能拿到3副炸、2副炸、1副炸的概率是多少呢? 那就得结合到底牌情况数了,如果抓到3个7、3个K 、3个8,这种情况数为:()337334842C C C ;因为没叫地主前抓到17张牌,其中已确定3个7、3个K ,3个8,那么就有9张牌是属于7、8、K 中的牌,在54-12=42张牌中选择剩下17-9=8张牌的组合数就是842C ,因为7、8、K 各3张的花色不同,有()334C 种情况。
斗地主可行性分析1. 引言斗地主是一种中国流行的扑克纸牌游戏,通常由三个玩家参与。
游戏通过玩家出牌的策略和运气来确定胜负。
随着互联网的普及和智能手机的普及,斗地主游戏在线上平台上的受欢迎程度不断提高。
本文将对斗地主游戏进行可行性分析,探讨从技术、市场和用户角度考虑,斗地主游戏的开发和推广是否有前景。
2. 技术可行性分析2.1 游戏平台斗地主游戏可以在各种平台上进行开发和推广,包括PC平台、移动平台和Web 平台。
其中,移动平台如安卓和iOS平台是最主要的选择,因为智能手机的普及率较高,用户更方便轻松地进行游戏。
由于斗地主游戏的特点以及用户习惯,移动平台上的斗地主游戏是最有前景和可行的选择。
2.2 开发技术在开发斗地主游戏时,需要选择适合移动平台的开发技术。
目前,主流的移动应用开发技术包括原生开发、混合开发和Web开发。
原生开发可以提供最佳的性能和用户体验,但需要分别开发不同操作系统的应用程序。
混合开发和Web开发可以通过一套代码实现多个平台的覆盖,但性能和用户体验不及原生开发。
根据实际情况,可以选择合适的开发技术进行斗地主游戏的开发。
2.3 多人联机技术斗地主是一款多人游戏,所以需要实现多人联机的功能。
目前,常用的多人联机技术包括客户端-服务器架构和P2P架构。
客户端-服务器架构可以提供更好的稳定性和安全性,但需要建立服务器和维护服务器的成本。
P2P架构可以降低服务器的压力,但可能因为用户网络不稳定而造成游戏体验的下降。
根据实际需求和成本预算,选择合适的多人联机技术是重要的一步。
3. 市场可行性分析3.1 市场需求斗地主作为一款传统和经典的扑克纸牌游戏,在中国有广泛的用户群体。
随着互联网的发展,越来越多的用户开始选择在线游戏。
斗地主游戏因为规则简单、易于上手和对策略的要求,吸引了大量的玩家。
据统计,在国内市场,斗地主类游戏每月的下载量超过百万次,市场需求非常旺盛。
3.2 市场竞争由于斗地主游戏市场份额较大,因此存在较多的竞争对手。
[斗地主的心得体会范文]斗地主高手心得体会范文心得体会是指一种读书、实践后所写的感受性文字。
是指将学习的东西运用到实践中去,通过实践反思学习内容并记录下来的文字,近似于经验总结。
下面是关于斗地主的心得体会,希望对您有所帮助。
我先把自己斗地主的心得发表一下,说的不好请见谅,也欢迎你们来拍我,或者交流心得,无所谓啦!1、首先你要学会算牌,如果有些牌出了几张你都记不清楚的话,那么你至少要记得大、小鬼有哪个没出,小心有鬼炸!不要轻易出炸弹,地主往往会算外头有没有炸弹,他会惑你的炸再反炸一哈哦!2、其次你要记得底牌三张牌的花色,有的地主很马虎,牌一样的话他随便就出去了,而没有考虑花色,如果丢出切得牌花色不同就表明他还有那个牌。
3、很重要的一点,你必须相信自己的搭档,不要盲目的切管搭档的牌,如果你随意的管了搭档的牌,想想搭档对你的埋怨哈!就算输了也不要灰心,搭档本意也是想靠合作赢得胜利三。
4、你的上家叫了地主,出手先发了个小牌,请考虑好了再管,如果你牌够好,那你可以直接上大牌,如果你的牌很一般,那你最好也发小牌,你的下家会仔细考虑到底发不发大牌切顶地主,不要想到自己上手就发个说大不大说小不小的牌使得自己搭档无奈的PASS或者浪费牌切顶地主。
5、地主如果先出小对子,那么请你看一下他叫的三张牌里有没有比这个对子小的,如果有一或两张,那么他必定有顺子或者三耍一、炸弹、重对、双飞。
你要迅速封杀这个对子,然后出大单张顶地主或者留意自己能不能整理出好的顺子或者别的去管。
当然如果你是地主下家你可以把顶地主的机会留给队友,自己保持队形。
6、如果地主上来就放三耍一、重对、顺子的话,你和搭档都管不上,很有可能表明他牌面好。
他若再放个小单张时,很有可能自己出大牌封死然后再出牌,所以你不要等地主出牌了迅速封死,然后出地主前期出的比较多的如对子等等再测试一下,同时也为搭档创造机会。
7、有的地主喜欢上来就拼大牌,想好了,地主是在惑你们的大牌,然后迅速一个顺子或者飞机出去,如果你的下家是地主,就尽量把自己的牌保持在都是对子或者三耍一的情况的下,当搭档炸了地主后,放个单张,你必须用最大的牌管上然后出对子,当然你得考虑地主最后是报单还是报双。
初中生数学小论文范文推荐16篇5初中生数学小论文范文第一篇在这几天中,我天天都看着我哥玩“欢乐斗地主”,我发现了一个非常奇怪的问题,有时赢得多,有时赢得少。
输的时候也是这样,我非常好奇,经过我哥的讲解,我才明白这其中的奥妙,这个也跟数学有关。
那一天,我坐在旁边看我哥玩,看了一会儿,就发现了个问题。
我就问:“哥,我问你一个问题。
”“哦,有什么问题。
”“你玩游戏时有没有觉得不对劲,欢乐豆和积分一会儿赢得少,一会赢多,这是为什么?”我哥笑着对我说:“你这个问题可真有趣,你有没有发现牌下有一个‘倍字码’。
”我一看,真的,有一个“倍”字。
哥哥说:“你看这个‘倍’字旁有个数字,一开始是15,表示是15倍,叫地主时,每叫一个就乘2,明牌时有乘2,翻牌时有大王就乘3,有小王就乘2,每出一个炸弹也是乘2,一会我打一副牌,你看是多少,在看赢的是多少。
”接着打牌时我看到:有一个人是明牌,又叫了地主,又有大王,又有炸弹,倍数是15*2*2*2*2*3*2*2*2*2*2=23040,好多啊!我哥又说:“欢乐豆是倍数除以50,积分是在乘10。
”我又算了一算:积分赢了46080,欢乐豆赢了2304,我在一对照,还真是的,我很高兴,因为我终于明白了这个令我好奇了很久的问题。
生活中,真的处处都存在着数学的知识呢!初中生数学小论文范文第二篇在教学活动中,师生交流的主要场所是课堂,课堂教学的氛围和效果,直接关系着学生的学习效果.在课堂中,教师可以通过某种生活情境的模拟,将数学问题融贯其中,与学生展开思想的沟通,引导学生自然利用数学知识解决实际问题.通过师生之间的交流互动,引导学生认真思考,共同学习,改变学生被动学习的传统教学方法,让学生主动地、积极地思考问题,主动学习.同时,营造了良好的课堂教学氛围,增进了师生感情,提高了学生的深入思考和研究的能力.互动式教学方法在初中数学教学中的应用,首先要求数学教师具备成熟的互动式教学的能力,每一节课都根据教课内容,有效地、恰当地结合实际问题,教学准备充分,能够让学生从日常的生活中发现数学问题,思考数学问题,并设法解决数学问题,学生的感性认识也在教学的过程中得到提高.例如,在学习角平分线的性质时,首先指导学生认识角的平分线,并画出角的平分线;然后任意选择角平分线的几点,引导学生观察每一个点到角两边的距离,总结规律,得出角平分线的任意一点到角两边的距离相等这一结论.知道这一性质以后,让学生与日常生活想联系,寻找相似问题的应用,并举例说明,如风筝的制作过程中,需要利用角平分线的这一性质.这样,可以激发学生的学习兴趣,活跃课堂氛围的同时,提高学生的思维推理能力,以及实际动手能力.在互动式教学模式下,教师不但要做好充分的准备,同时还需要具备充足的教学设备供课堂使用.在互动式教学方法的应用过程中,要实现其应用效果,在教学中要从多个角度进行启发,引导学生联系初中数学的内容能够与实际问题相结合,寻找学生的兴趣点,并与课堂教学知识点内容相结合,确立教师在课堂教学活动中的主导地位.另外,在数学教学的过程中,除了传统的板书授课方式以外,教师要积极主动地使用新媒体技术,通过声音或者图像等媒介描述数学知识点,让数学问题更形象、更生动,为课堂的互动教学营造氛围.例如,二次函数的教学过程中,可以利用多媒体技术,制作二次函数的平移、旋转,立体效果让学生能够更直观地看到二次函数的性质,深刻理解教学内容,不但能够提高学生的学习能力,学生的思维空间更广,互动教学方式得到有效的发挥.在初中数学教学中应用互动式教学方法的过程中,首先教师要根据教学内容、联系实际进行问题设置,引导学生根据日常生活,结合提出的问题进行思考,给学生留出思考和讨论的空间.鼓励学生拓宽思维,多角度看问题,并能够和大家交流,互相探讨.在自由讨论的时候,教师要做好引导和纠错,控制课堂互相交流氛围,帮助学生做好总结,取长补短,发现问题,并解决问题.通过学生讨论,教师搜集学生们的各种观点,将其中的新思维、新观点拿出来,让大家展开讨论,引导学生用新的方法进行问题的解决,并掌握研究的思路,解决实际问题,培养学生课堂数学思维训练,理论联系实际,将新知识与实践相结合,牢固地掌握课堂教学内容.初中生数学小论文范文第三篇在森林的深处住着一只小熊,它叫琳琳。
“斗地主”人生智慧论文摘要:人生就像斗地主,不管怎样,都要打好人生中的每一张牌。
去成长,去体验,去感受,去生活,去战斗,打一场执着、精彩、过瘾、无怨无悔的好牌!此次过年回家,与亲朋友好友在酒足饭饱之后摆开牌局,开始学着斗地主。
作为一个新手,当然是连连败北,输的一塌糊涂。
但在郁闷之余,深思之下,却发现这简单的斗地主牌局中有着丰富的人生智慧。
人生就像斗地主,要想打赢每一局,你不仅需要运气-上帝分给你一副好牌,还得需要实力-你对整幅牌资源的整合利用能力,两个因素缺一不可。
有能力没运气,像唐代大才子王勃,才华横溢却不幸英年早逝,空怀报国之志,没有机会施展。
有运气没能力,上帝赋予了你一副好牌,却没有好好珍惜利用,最终被对手翻盘。
三国时的曹操赤壁之战前夕,拥兵百万,上将千员,天时地利人和,条件俱佳,可谓是好牌在手,却因为一时失误考虑不周,被实力弱小的吴蜀联盟打的落花流水,谈笑间樯橹灰飞烟灭。
人生就像斗地主。
你不可能一直好运连连,也不可能一直阴霾缠身。
有时牌会连差好多局,但不可能一直差下去,风水轮流转,物极必反,否极泰来。
在背运时要沉得住气,山重水复疑无路,柳暗花明又一村,笑到最后才是真正的赢家。
即使是尽了全力,仍无望扭转败局,也要有足够的耐心去等待下一场胜利的到来,如果在此时灰心意冷一蹶不振,破罐子破摔,只会令局面更加恶化,那么你的积分会一直负下去。
如果史玉柱在巨人集团倒闭负债两亿的情况下选择彻底放弃,也就不会有今天的脑白金和更为辉煌的成就。
在好运时也要沉着冷静,戒骄戒躁,稳扎稳打,走好每一步,去赢取胜利。
人生就像斗地主。
有时你明明看到手中一副好牌,胜券在握,成功触手可及,却因一招不慎满盘皆输,一场志在必得的战斗命丧己手。
于是懊恼不已,悔恨遗憾。
如果就此耿耿于心,难以释怀,不能原谅自己犯下的细小错误,那么你输下的不仅是上一场牌局,也许还有这场的好牌,悔恨的心情已经扰乱了你的正常情绪,让你把又一场本赢的胜利给错失了。
斗地主的散文斗地主的散文1现在有很多人都喜欢玩一种游戏,“斗地主”,可又有多少人见过真正的“斗地主”?那可是荒唐年代的荒唐事,饱含着多少人的辛酸泪,多少无奈。
记得小时候,我才五岁,大队老是开会,全村的人都去。
到了会场,人声鼎沸,高高的会台上,放了一条长板凳,一个干部模样的人,手拿一个用硬纸板卷成的话筒喊到:“把带上台来”!这时人群一阵骚动,有个人被几条大汉,连拖带拽地弄上了会台。
那人一脸的茫然与惊恐。
人们把他弄到长板凳上,让他站得高高的。
那个干部声色俱厉地喝到:“你老不老实的!”他唯唯诺诺地说:“我老实,老实。
”又问一句:“你老不老实?”答:“老实,老实。
”再问一句:“你究竟老不老实?”那人以为说错了(那时候的人读书的很少),诚惶诚恐的地说:“我——我——不老实。
”他哪知犯了天大的错误,怎能说不老实呢!于是乎几条大汉对他一阵毒打,好半天都趴在地上起不来。
我吓得不敢再看,我问妈妈:“这人怎么了,做了什么错事?”妈妈说:“他家是地主,富农,所以要斗他。
小孩子不要多说话。
”那时的我很是迷惑,怎么也想不通,什么是地主?什么是富农?为什么要斗?只知道我不喜欢,一点也不喜欢,一想起来就会觉得难受。
这也是许我至今从不玩“斗地主”的缘因吧。
斗地主的散文2在网上玩“斗地主”和在电视上看“弈棋耍大牌”,可以发现一些有趣的现象,值得“斗地主”选手们深思。
不管是地主还是农民,输赢的主要决定因素是牌运:上的牌好不好?上的底牌好不好?对手的牌好不好?对于地主来说,农民的牌是不是会送邮包?这些常常是十分关键。
许多时候,“门板”的出牌最重要,往往因为“门板”一张牌出错而放走地主。
有的时候,因为“门板”有KKKK,没有顶一住地主一张K而使地主得胜。
“斗地主”中出牌权是十分重要的,尤其是“先手”问题。
从地主出第一手牌开始,争夺出牌权是十分激烈的。
地主出第一手牌往往想保持出牌权,例如:地主出“对子”,常常是手中有大“对子”;地主出“单张”,常常是手中有大“单张”;地主出“付掳”,常常是手中有大“付掳”;地主出“三张”,常常是手中有大“三张”经常看到:地主出小“付掳”,农民有222者先压小“付掳”,放走地主的中“付掳”或者被地主的2“付掳”压住。
基于C#的斗地主游戏设计与实现福州第三中学组长:刘纪源指导老师:宋立林组员:刘心灵、卓超【摘要】本文详细论述了如何使用C#编程语言以WPF用户界面框架,运用面向对象的编程思想实现三个玩家在三个不同的终端进行斗地主游戏。
对于斗地主游戏,小组首先对其基本构造进行分析,抽象得到进行斗地主游戏所需的基本元素,然后分析其规则,得到游戏的基本模型。
根据分析结果,将游戏所需的基本元素在程序上表达出来,封装入类库(存储所有基本元素在程序中的表达的文件)。
接着根据分析出的算法,实现游戏的基本运行,完成第一阶段。
第二阶段参考了Karli Cards(在《C#入门经典》中的一个的简单纸牌游戏)的界面设计出游戏界面。
第三阶段着重实现不同客户端间的通讯,首先分析了游戏进行时需要的信息,建立起了通讯模型,然后实现了各基本元素在各个终端间的传输,最后实现模型,调试后得到成果。
【关键词】斗地主算法设计 C# WPF(Windows Presentation Foundation) 【正文】一、课题的选择在选择课题时,小组成员讨论提出多个方案,如数独游戏、计算器、斗地主等。
在综合考虑后,小组最终决定以斗地主作为研究方向,理由如下:1. 斗地主作为一种结构相对鲜明的游戏,在抽象完成后的许多组件都可以再利用,有利于之后的再创造;2. 斗地主作为常见的纸牌游戏,组员的熟悉程度较高,可行性较强;3. 图形界面的实现有实际例子可以参考,程序的界面实现不会成为之后工作的阻碍。
二、小组分工在第一阶段,组员刘心灵负责收集斗地主相关规则以及整理部分游戏逻辑,组长刘纪源负责构造游戏模型并以控制台的形式实现基本程序;在第二阶段,组员刘心灵、卓超负责搜集相关界面素材,组长刘纪源负责构造界面模型并实现基于图形界面的程序;在第三阶段,组员卓超负责构造通讯模型,组长刘纪源实现程序通讯功能并进行相关调试。
三、 研究过程(一) 游戏本身的实现1. 游戏基本元素的分析与实现斗地主游戏如同大多数纸牌游戏,具有多个基本元素。
根据常识,进行一次斗地主游戏需要一副完整的54张牌,以及三个玩家,因此首先需要表达54张扑克牌的基本元素——牌。
每张牌由Card 类实现,包含三个字段:Suit (花色)、Rank(大小)、Joker (大小鬼)。
每张牌生成后不可改变,根据构造函数的不同为Suit ,Rank 或Joker赋值,每张牌仅有一种属性,例如这张牌为红桃A 时,Joker 属性为空;这张牌为大鬼时,Suit和Rank 属性为空。
这个类重载了 ”>” , ”<” 两个运算符,实现了两张牌之间的大小比较,重写了GetHashCode()方法使得每张不同的牌都能用1-54之间的数字表示。
Equals()方法通过比较前一个方法得到的数字实现了判断两张牌是否为同一张牌的功能。
有了基本元素——牌,就可以开始构造更复杂的牌组了。
这里就需要一个集合来表达多张牌,从玩家的手牌,他们出的牌,到一整副牌就都可以表示了。
多张牌的集合由Cards 类实现。
它由系统的List<Card>类(一个大小可变的高级集合)继承而来,可以表示多张牌(一张或没有牌也是可以表示的)已拥有绝大多数集合方法,在这里自定义了一个新方法:Shuffle(),实现了洗牌。
实现了Cards 类,就可以实现一副牌了。
Deck 类可以获取一副54张的牌。
它是一个静态类,意味着他不需要初始化(多用一行代码生成新的一副牌)直接可以调用。
Deck 类有三个属性。
调用Full 可以获取一个顺序的有54张牌的Cards 实例(一副牌组),调用Shuffle 可以获取一个打乱顺序的有54张牌的Cards 实例,而DDZOrdered则可获取一个按照斗地主规则洗好的含四个Cards 实例的简单数组。
元素[1][2][3]为三组玩家的原始手牌,各17张;元素[0]为地主牌,有三张。
图 A-1 Card 类的构造 图 A-2 Cards 类的构造 图 A-3 Deck 类的构造至此为止我们就已经实现了斗地主游戏中的牌组的基本表示。
接下来实现玩家。
首先玩家需要有名字以及一副牌,这已经可以实现。
然后,每个玩家还具有一个状态,来表示此时此玩家是否正处在可以出牌的活跃状态。
接着按照游戏规则,在抢地主之前,玩家尚未获得地主或农民的身份,身份待定。
抢地主过后,每个玩家都具有了对应的身份:地主或农民。
在某个玩家出尽手中的牌之后,该玩家成为赢家,若其为农民则另一名农民也为赢家,其余为输家。
总之,玩家在整场游戏中有五种身份——待定、地主、农民、赢家、输家。
在程序中,这五种身份分别对应Null, LandOwner,Peasant, Winner, Loser 。
在Player 类中,手牌由_hand 字段储存。
_hand 字段不可直接读取和修改,通过AddCard()及AddCards()方法可加牌入手牌,ClearHand()方法清空手牌,GetCards()获取当前手牌的一个副本(对其作出的修改不会影响_hand )。
玩家名及玩家状态由_name,isActive 字段存储,外部可用PlayerName,IsActive 属性读取和更改。
玩家身份由State 属性储存,外界具有读写权限。
lastDiscardCards 字段,LastDiscardCards 属性用于存储最后一次出的牌,作用“游戏逻辑的分析与实现”中详细说明。
Index 属性存储当前玩家的内部索引,作用将在第三阶段说明。
QiangDiZhu(),DiscardCard()方法、CardDiscarded, PlayerHasWon , QiangDiZhuResultSet 事件将在“游戏逻辑的分析与实现”中详细说明。
多个玩家的集合由Players 类实现,由系统的List<Card>类继承而来,可以存放多个玩家。
在此自定义了一个新方法:GetPlayer()方法,可通过玩家内部索引在数组中获得玩家。
至此总结,我们将牌抽象为Card 类,多张牌抽象为Cards 类,一副牌抽象为Deck 类,玩家抽象为Player 类,三个玩家抽象为Players 类,完成了游戏基本元素的分析与实现,下文进入游戏逻辑的分析及实现。
图 A-4 Player 类的构造 图 A-5 Players 类的构造2. 游戏逻辑的分析及实现斗地主游戏的主要过程如图A-6。
a) 抢地主在研究过程中,我们遇到的第一个难点是抢地主的过程。
因为这个过程逻辑较为复杂,所以我们决定先采用穷举的办法得出所有结果再进行分析。
在抢地主过程中,我们需要获取每个玩家的选择,结果可以表示为真或假的逻辑值,因此我们首先对抢地主过程进行穷举,穷举结果如图 A-7所示:依照穷举结果,我们可以知道,我们需要从每个玩家手中获得至少一个输入,在输入取得之后,根据原始地主的选择,我们可以进一步决定获取输入还是定下地主开始游戏。
根据分析结果以及穷举结构,我们完成了抢地主的算法设计,主要如图A-8(附表中)所示。
图 A-6 斗地主的主要流程图 A-7 斗地主的过程穷举 用Y 表达真,N 表示假,表示原始地主的选择, 表示另外两个玩家的选择,表示最终结果,后跟玩家代号,”RESTART”表示重新洗牌。
b) 牌型的识别和比较游戏逻辑的第二个难点在于实现斗地主牌型的识别和比较。
在三人斗地主规则中,玩家被允许出的牌型如下:1. 单牌;2. 对子,两张相同大小的牌;3. 三张牌,可带;4. 炸弹,单独出可带;5. 王炸,不可带;6. 飞机,连续两组以上三张牌,有连续几组就可带几个对子或单牌,主体不带2;7. 顺子,一连串连续的单牌,五张或以上,不带2;8. 连对,三组或以上连续对子,不带2;而根据规则,王炸>炸弹>其余牌型。
其余牌型间,必须为同牌型且格式一致才有可比性,满足时主体中最小的牌决定该牌组的大小。
但是我们只实现了多张牌的表示,并没有实现识别多张牌的牌型的功能,并且无法比较同牌型间的大小,因此为了实现斗地主牌型的识别和比较,我们引入一个新的类ComparableCards 类,结构如图A-9。
表格 1 TypeCs 枚举的含义 类型 主体 Empty 空的(尚未设置) Single单牌 Double 对子Triple三牌 Boom炸弹 KBoom 王炸Plane飞机 Shunzi 顺子CDouble 连对None不出 ComparableCards 类的主体由一个元素为Cards 的长度为6的简单数组container 字段和类型为TypeCs 的type 字段组成。
前者作用见表格2,后者表示该实例的牌型,详细释义见表格1。
Clear()方法可以清空当前实例并将类型改为Empty ;GetCards()获取当前实例Container 中的所有牌,Set()和IsValid()实现了将识别Cards 牌型以及牌型间比较的功能,下文将着重解释这两个方法。
图 A-9 ComparableCards 类的构造 [0] 存储带的单牌 [1] 存储单牌,顺子 [2] 存储对子,王炸,连对 [3] 存储三张牌,飞机 [4] 存储炸弹 [5] 存储带的对子Set()方法定义:public bool Set(Cards ocards, bool isFirst)Set()方法需要输入一组牌ocard以及是否为本轮第一人的isFirst,返回一个逻辑值表示输入的牌合法或非法。
下面开始介绍其算法。
为了对牌组进行分析,我们首先将其排序,然后需要将牌组中不同长度的连续同大小的牌分离,将其分为单张、双张、三张、四张四个类别,然后再根据类别中的牌判别是否符合规则。
但是在分类前,几种特殊情况可以单独考虑。
1. (图中对应①)不出牌,即牌组内没有牌,那么可以通过isFirst判断此玩家输入是否合法;2. (图中对应①)牌组长度仅为1,那么可直接判定其合法;3. (图中对应①)牌组长度为2且两张牌大小一致,那么也可直接判定其合法;4. 牌组中存在大小鬼,那么合法的存在有大小鬼的情况仅有两种:王炸(图中对应④)或单牌,若不符合这两者的可直接判为非法输入;分类之后,有几种情况牌可能会混淆:1. (图中对应⑤)将四张一样大小的牌作为飞机的一部分;2. (图中对应①)在飞机主体大于2时将一个对子视作两张单牌带进飞机。
Set()的完整算法如附表中图A-10以及图A-11:IsValid()方法定义:public bool IsValid(ComparableCards B)IsValid()方法需要输入上家出的一个ComparableCards实例B,返回一个逻辑值表示当前的牌相对于上家合法或非法。