编写一段C++程序编写,将一副扑克牌随机发给三个玩家,并显示三个玩家手中的牌

没有更多推荐了,
不良信息举报
举报内容:
java 枚举举例:poker牌类
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!已解决问题
急求C++编程高手解决问题,谢谢
我现在想设计一个21点纸牌游戏,大致内容如下,希望能有好心人帮忙解答,分不多,我全部送上了~~谢谢了
&21点&是一个古老的扑克牌游戏,游戏规则是:各个参与者设法使自己的牌达到总分21而不超过这个数值.扑克牌的分值取他们的面值.A充当1分或者11分(由玩家自己选择一种分值),J、Q和K人头牌都是10分。
庄家对付1~7个玩家,在一局开始时,包括庄家在内的所有参与者都有两张牌。玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐藏的。接下来,只要愿意,各个玩家都有机会依次再拿一张牌。如果某个玩家的总分超过了21(称为&引爆&,)那么这个玩家就输了。在所有玩家都拿了额外的牌后,庄家就显示隐藏的牌。只要庄家的总分等于或小于16,那么他就必须再拿牌。如果庄家引爆了,那么还没有引爆的所有玩家就将获胜,引爆的玩家成为平局。否则,将余下的各玩家的总分与庄家的总分比较,如果玩家的总分大于庄家的总分,则玩家货胜。如果二者的总分相同,则玩家与庄家打成平局。
1.2 课程设计的要求
编写程序实现游戏,计算机作为庄家,1~7个人作为普通玩家参与游戏,游戏程序运行输出如下所示。
多少人参加游戏?(1~7):2
输入第一位玩家的姓名:张三
输入第二位玩家的姓名:李四
庄家:&隐藏&梅花7
张三:红桃7方块J总分值 17
李四: 红桃J红桃3总分值 13
张三,你想再要一张牌吗(y,n)?n
李四,你想再要一张牌吗(y,n)?y
李四: 红桃J红桃3梅花10 总分值 23
庄家:方块10 梅花7总分值 17
张三,唉,你打平局!
李四,对不起,你输了!
你想再玩一次吗 (y,n)?
拜托高手们按照以上要求设计程序,(别画蛇添足,也别偷工减料哦~)乱设计的我不会给分,也别耽误你我的时间了吧~
顺便说下,此程序要支持牌的花色,可能确实有点麻烦,但还是先谢谢了!!!!!
回答得好我再追加20分,谢谢了!朋友们 问题补充:朋友,感谢你的解答,不过你能补上类么?作业要求要用到C++最大的特色-类 来解答,我不太懂,不过没怎么看到CLASS总不太踏实啊,呵呵,能改改么?谢谢了,改好了就把分给你了,感谢你的帮助!
浏览次数:484
用手机阿里扫一扫
最满意答案
可以了#pragma&warning(disable:4786)#include&&iostream&#include&&string&#include&&ctime&#include&&vector&using&namespace&#define&Random4&(rand()&%&4)#define&RandomN&(rand()&%&13)const&string&varity[4]&=&{&黑桃&,&&红桃&,&&草花&,&&方块&};const&string&Num[13]&=&{&A&,&&2&,&&3&,&&4&,&&5&,&&6&,&&7&,&&8&,&&9&,&10&,&&J&,&&Q&,&&K&};class&Games{private:&int&P&vector&string&&P&vector&vector&int&&&&each_&int&*S&string&*N&int&i;&&public:&Games()&{&&srand((unsigned)time(NULL));&&cout&&&&&多少人参加游戏?(1~7):&;&&cin&&&&P&&Poke.resize(Players+1);&&Sum&=&new&int[Players+1];&&Name&=&new&string[Players+1];&&Name[0]&=&&庄家&;&&for(i&=&0;&i&&=&P&i++)&&{&&&Sum[i]&=&0;&&}&&&for(i&=&1;&i&&=&P&i++)&&{&&&cout&&&&&输入第&&&&&i&&&&位玩家的姓名:&&;&&&cin&&&&Name[i];&&}&}&&~Games()&{&&delete&[]S&&delete&[]N&}&&void&InitFirst()&{&&&int&fir,&&&vector&int&&row_&&for(i&=&0;&i&&=&P&i++)&&{&&&row_num.erase(row_num.begin(),&row_num.end());&&&fir&=&RandomN+1;&&&sec&=&RandomN+1;&&&row_num.push_back(fir);&&&row_num.push_back(sec);&&&each_num.push_back(row_num);&&&string&Col&=&varity[Random4];&&&Poke[i].append(Col);&&&cout&&&&Name[i]&&&&&:&&;&&&i&==&0&?&(cout&&&&&&隐藏&&)&:&(cout&&&&Col&&&&Num[fir-1]);&&&Poke[i].append(Num[fir-1]);&&&Col&=&varity[Random4];&&&Poke[i].append(Col);&&&Poke[i].append(Num[sec-1]);&&&cout&&&&&,&&&&&Col&&&&Num[sec-1];&&&if(fir&&&10&||&sec&&&10)&&&{&&&&if(fir&&&10)&&&&&fir&=&10;&&&&else&&&&&sec&=&10;&&&}&&&Sum[i]&+=&fir+&&&if(i&!=&0)&&&&cout&&&&&&总分值:&&&&&&Sum[i];&&&cout&&&&&&}&&&}&&void&AddPoint()&{&&for(i&=&1;&i&&=&P&i++)&&{&&&char&&&&cin.sync();&&&cin.clear();&&&while(1)&&&{&&&&for(vector&int&::iterator&it&=&each_num[i].begin();&it&!=&each_num[i].end();&it++)&&&&{&&&&&if(*it&==&1)&&&&&{&&&&&&cout&&&&Name[i]&&&&&,你牌中的A是否要作为11(y,n)?&;&&&&&&cin&&&&&&&&&&if(sel&==&'y'&||&sel&==&'Y')&&&&&&{&&&&&&&Sum[i]&+=&10;&&&&&&&cout&&&&Name[i]&&&&&:&&&&&&Poke[i]&&&&&总分值:&&&&&&Sum[i]&&&&&&&&&&}&&&&&}&&&&}&&&&cout&&&&Name[i]&&&&&,你想再要一张牌吗(y,n)?&;&&&&cin&&&&&&&&if(sel&==&'n'&||&sel&==&'N')&&&&&&&&&else&&&&{&&&&&int&add&=&RandomN+1;&&&&&string&Col&=&varity[Random4];&&&&&Poke[i].append(Col);&&&&&Poke[i].append(Num[add-1]);&&&&&if(add&&&10)&&&&&&add&=&10;&&&&&each_num[i].push_back(add);&&&&&Sum[i]&+=&&&&&}&&&&cout&&&&Name[i]&&&&&:&&&&&&Poke[i]&&&&&总分值:&&&&&&Sum[i]&&&&&&&&if(Sum[i]&&&21)&&&&{&&&&&cout&&&&Name[i]&&&&&引爆!&&&&&&&&&&&&&&}&&&}&&}&}&&void&Resault()&{&&for(vector&int&::iterator&it&&=&each_num[0].begin();&it&!=&each_num[0].end();&it++)&&{&&&if(*it&==&1)&&&{&&&&if(Sum[0]+10&&&21)&&&&{&&&&&Sum[0]&+=&10;&&&&}&&&}&&}&&&&while(Sum[0]&&=&16)&&{&&&int&add&=&RandomN+1;&&&string&Col&=&varity[Random4];&&&Poke[0].append(Col);&&&Poke[0].append(Num[add-1]);&&&if(add&&&10)&&&&add&=&10;&&&Sum[0]&+=&&&&}&&cout&&&&Name[0]&&&&&:&&&&&&Poke[0]&&&&&总分值:&&&&&&Sum[0]&&&&&&if(Sum[0]&&&21)&&{&&&cout&&&&&庄家引爆!&&&&&&&&for(i&=&1;&i&&=&P&i++)&&&{&&&&if(Sum[i]&&&21)&&&&&cout&&&&Name[i]&&&&&:&唉,你打平局!&&&&&&&&&else&&&&&cout&&&&Name[i]&&&&&:&你赢了!&&&&&&&&}&&}&&else&&{&&&for(i&=&1;&i&&=&P&i++)&&&{&&&&if(Sum[i]&&&21&||&Sum[i]&&&Sum[0])&&&&&cout&&&&Name[i]&&&&&:&对不起,你输了!&&&&&&&&&else&if(Sum[i]&&&Sum[0])&&&&&cout&&&&Name[i]&&&&&:&你赢了!&&&&&&&&&else&&&&&cout&&&&Name[i]&&&&&:&唉,你打平局!&&&&&&&&}&&}&}};int&main(){&Games&&one.InitFirst();&one.AddPoint();&one.Resault();&return&0;}&
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is ok&nbsp&nbsp &
&nbsp&nbsp
&nbsp&nbsp &
&nbsp&nbsp
多人在线扑克游戏源码带服务端完整版,本项目源码是一套网络版的扑克牌项目源码,带服务器端源码,服务器端也是用java做的,打开游戏以后需要配置IP服务器端的IP和端口,服务端默认监听9999端口,客户端ip填写10.0.2.2,端口信息不用管直接点连接就可以连接到电脑上的服务端。项目源码注释比较丰富,可以研究一下里面的算法之类的。搭建这个服务端环境废了我半天劲,不知道是不是我运行的方法不对,打开前两个游戏客户端没有问题,打开第三个就开始直接强制退出。游戏没玩成所以没有截那部分的
importjava.util.ArrayLimportjava.util.Cimportjava.util.HashMimportjava.util.HashSimportjava.util.Limportjava.util.Mimportjava.util.R/***(c)2010华润(集团)有限公司版权所有.保留所有权利.**文件名称:Chains.java*程序说明:*创建日期:Jun18,2010*
经常遇到这个问题,自己做了一下,随机发52张牌,分给4个人,每个人手中的牌是13张无重复,花色S代表黑桃,H代表红桃,D代表方块,C代表梅花。发完牌后4组牌由小到大排序(依数字的大小从1-13)。若有同一数字牌出现则依照S、H、D、C顺序。1.Puke.javapackagepack3;importjava.util.*;publicclassPuke{intpoke[]=newint[52];intpoke_a1[]=newint[13];intpoke_a2[]=newi
最近看到javaEye上有一位仁兄帖出来取扑克牌乱序算法。看过还是有问题,都没有人想到而纠正过来,本想直接回复的,可以已经结帖了。我又最近比较空,所以自己博客里也写写,算是给一些新手和老手一点新的算法思路。packagecom.importjava.util.Eimportjava.util.H/***乱序扑克牌洗牌方法**@authorvirture**/publicclassCards{HashtablehtMember
packagecom.tengfei.lesson06;&&&importjava.util.V&&importjava.util.LinkedL&&importjava.util.R&&importjava.util.ListI&&&publicclassDealCards{&&&
扑克发牌算法是棋牌游戏中常用的基础算法,也是游戏开发人员需要熟悉的基础算法之一。下面介绍一下该算法的一种实现方式。首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下:u红桃按照从小到大依次为:1-13u方块按照从小到大依次为:14-26u黑桃按照从小到大依次为:27-39u梅花按照从小到大依次为:40-52u小王为53,大王为54算法实现如下:u首先按照以上编号规则初始化一个包含108个数字的数组u每次随机从该数组中抽取一个数字,分配给保存玩家数据的数组实现该功能的
前一段时间找实习,腾讯面试中一轮面试官被问到这个题目,我回答了下面解法中的第一种,太搓了,直接遭面试官鄙视了,回来搜了搜,发现一种更好的解法(下面解法中的第二种),今天偶尔发现解法2其实有毛病,于是改进了,有了算法3和算法4.前提:一副扑克牌有54张,因此我们可以一个整型数组array[54]或者map来存储,&A&用0~3,&2&用4~7,&3&用8~11......&K&用48~51,小鬼用5
程序中常常会用到常量值来定义一些相对固定的有实际意义值。比如,你要定义一个扑克牌的类,扑克牌有花色和数字两种属性,然而花色只有红桃(红心)、方块、黑梅、黑桃四种,这时你就可以定义四个常量分别表示这四种花色,这样定义的好处是:每次给花色赋值时只用到常量值的名称就可以,不易出错;如果某一天扑克出现新玩法需增加一个花色,只有增加一个常量值就可以,扩展性强;Java中常量的定义Java中常量的定义,最常见的就是以下形式:publicstaticfinalT[CONSTNAME]=[V
小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:他手里握着一叠扑克牌:A,2,....J,Q,K一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;......如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K请你计算一下
趁着过年这段时间,我将算法导论这本书看了一遍,感觉受益匪浅。着这里也根据算法导论中所涉及到的算法用java实现了一遍。第一篇我们就从排序开始,插入排序的原理很简单,就像我们玩扑克牌时一样。如果手里拿的牌比他前一张小,就继续向前比较,知道这张牌比他前面的牌打时候就可以插在他的后面。当然在计算机中我们相应的也需要将对比过的牌向后移一位才可以。这里直接给出算法,相信很多程序员都感觉有些程序比我们的自然语言都要好理解。publicclassSort{publicvoidsort(in
一.概念&&&&&&&基数排序也不是基于比较和元素移位的,又称桶子法;数据结构课本上首先由扑克牌的排序引入,继而引出多关键字比较。&&&&&&&本文是基于计数排序的基数排序,只介绍最低位优先(LeastSignificantDigitFirst),谷歌之发现就几乎没有介绍MSD的,所谓LSD就是从数字的最低位逐个比较,比较的趟数就是最大数
罗大佑有歌云:“无聊的日子总是会写点无聊的歌曲......”,我不是歌手,我是程序员,于是无聊的日子总是会写点无聊的程序。程序不能太大,不然没有时间完成;程序应该有趣,不然就达不到消磨时间的目的;程序应该有那么一点挑战性,不然即使写完了也没有进步。金钩钓鱼游戏是我儿时经常玩的一种扑克牌游戏,规则非常简单,两个玩家,一旦牌发到手里之后,接下来每个人出什么牌基本上已经就定了,玩家没有自己做决策的机会,所以这个游戏很容易用程序自动模拟出来。(一)关于金钩钓鱼游戏基本规则(简化版):
&摘要:A.扑克发牌算法是棋牌游戏中常用的基础算法,也是游戏开发人员需要熟悉的基础算法之一。下面介绍一下该算法的一种实现方式。首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下:u红桃按照从小到大依次为:1-13u方块按照从小到大依次为:14-26u黑桃按照从小到大依次为:27-39u梅花按照从小到大依次为:40-52u小王为53,大王为54算法实现如下:u首先按照以上编号规则初始化一个包含108个数字的数组u每次随机从该数组中抽取一个数字,分配给保存玩家
2012年,哪些开发商的收入最多?AppAnnie整理了2012年全年的收入数据,并以扑克牌的方式展现给各位,作为您的参考。RevenueTop52的开发商,找到你了么?2个中国开发商、11个日本开发商、3个韩国开发商、23个美国开发商......&&&来源:appannie&
前几天在闲逛的时候,突然看到了一个关于扑克牌的题目,感觉还挺有意思,就试着分析了一下并用Python实现了一下。贴出原题:手中一幅扑克牌,假设顺序为ABCDEF,把第一张放到桌面上,第二张挪到最后,第三张放到桌面,第四张挪到最后,一直到所有牌都在桌面BCDEFACDEFBDEFBACEFBD…把最后在桌面上的这副牌给你,求出原始牌的顺序分析一下:1.排序牌面获得原始牌面排序牌面:ACEBFD桌面扑克牌原始扑克牌说明ACEBFD拿出末尾最后一个DACEBFD拿出末尾最后一个F,
现在我们开始一个一个例子学习,把学习到的正则表达式进行综合使用。这个例子使用正则表达式来检查5张扑克牌是否有效,为了显示更好看,先写一个输出函数:def&displaymatch(match):&&&&if&match&is&None:&&&&&&&&return&print(None)&&
&版权所有野比2012原文地址:点击查看作者:NazmiAltun&&下载源代码-148.61KB&下载demo-3.1MB&介绍(图片上的字:方块4,方块J,黑桃2)用机器人配上扑克牌识别系统,就可以在二十一点一类的扑克游戏中扮演荷官或是人类玩家的角色。实现这样的程序同样也是学习计算机视觉和模式识别的好途径。本文涉及到的AForge.NET框架技术有二值化、边缘检测、仿射变换、BLOB处理和模板匹配算法等。需要注意的是,这篇
UITypeEdit“我要红桃”假如,你现在在做一个“扑克”控件,扑克牌有个属性--花色,你想在用户选择花色这个属性后,属性窗口呈现的不仅仅是文字,还有一个小小的花色图标来表示花色,“红桃”就有个小“红桃”图标在前面显示,“黑桃”就有个“黑桃”图标在前面显示,就像你选择其它控件的BackColor时,颜色前还有个小方色块来表示选定的颜色,多体贴人的设计啊。现在,我们就来做这件事:publicclassSqueezer{.publicCardTypesCardType{}}[E
更详细的讲解和代码调试演示过程,请点击链接上一节我们完成了右边扑克牌向左边扑克牌发出冲击波后的动画特效,现在我们接着完成余下的动画效果,接下来左边扑克牌将向右边扑克牌发出冲击波,然后右边扑克牌也要展现颤动效果。在template标签中添加如下代码:我们要增加三个变量:cardAShake,cardBShake,cardCShake,当某个变量的值设定为true时,对应的div元素其class属性会添加上shake,这样的话,他就会像左边的扑克牌一样,产生左右摇摆的颤抖效果。在
&!DOCTYPEhtmlPUBLIC&-//W3C//DTDXHTML1.0Transitional//EN&&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&&htmlxmlns=&http://www.w3.org/1999/xhtml&&&head&&metahttp-equiv=&Conte
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供信息,所有相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International豆丁微信公众号
君,已阅读到文档的结尾了呢~~
模拟人工发牌说明:用计算机模拟发牌程序。假设一副扑克牌有52张,共4个玩家,编写程序统计出各玩家手里拿的牌的牌面(牌面包括纸牌的大小和花色)。题目难度:一般设计要求:要求使用C语言编程,定义合适的数据结构。最后,需要说明设计思想,同时给出能够运行的源程序,并给出对应的程序流程图。设计提示:定义一个4行13列的整数类型的二维数组,每一行分别表示一种花色:黑桃、红桃、草..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
模拟人工发牌课程设计报告
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口博客分类:
2天时间敲了一个斗地主代码,觉得自己代码极不规范,决定重构,目标是用严格的面向对象思维、规范的代码风格、规范的命名方式重写一份。原以为这只是1小时的工作,终却断断续续花了好几天查重写后的bug。虽然代码还是很挫,但相比之前已经有了一点点可读性。大学时学了c++就以为懂了面向对象,现在回想学到的都是些渣渣,面向对象重要的是思维而不是语言规则。为提高自己代码质量不断努力。
#include &iostream&
#include &vector&
#define PLAYERCOUNT 3
#define CARDSCOUNT 54
#define CURRENTPLAYER 0
#define VALUECOUNT 17
#define ERROR -1
const char toFigure[]="JQKA 2YZ";
enum COLOR{
//花色显示ASCII: 3~6
eHEART=3,//红桃
eDIAMOND,//方片
class CardsT
class CardG
class LastC
bool makeChoice(string tip);
bool cmp(Card* a,Card* b);
class Card{
Card(char _figure,COLOR _color){
value=calValue();
int calValue(){
for(int i=0;toFigure[i];i++){
if(toFigure[i]==figure){
return ERROR;
void print(){
assert(value!=ERROR);
if(figure=='Z'){
cout&&"ZZ";
}else if(figure=='Y'){
cout&&"YY";
cout&&figure&&(char)
cout&&' ';
class CardsType{
//为了规范查找对应牌的方法
//统一为3个参数cnt1、isContinuous、cnt2
int typeId;
string typeS
int cnt1,cnt2;
CardsType(){
typeId=ERROR;
bool operator ==(const CardsType& other)const{
return this-&typeId==other.typeId;
void init(char* _typeStr,int _typeId,int _cnt1,bool _isContinuous,int _cnt2){
cnt1=_cnt1;
isContinuous=_isC
cnt2=_cnt2;
typeStr=_typeS
typeId=_typeId;
class CardGroup{
vector&Card*&
void calType(){
int i,n=cards.size();
//init(typeStr,typeId,cnt1,isContinuous,cnt2)
type.init("不出",14,0,0,0);
if(n==2&&cards[0]-&value==15&&cards[1]-&value==14){
type.init("王炸",0,0,0,0);
//统计同点数牌有多少张
int cntFlag[VALUECOUNT]={0};
for(i=0;i&n;i++){
cntFlag[cards[i]-&value]++;
//统计点数最多和最少的牌
int maxCnt=0,minCnt=4;
for(i=0;i&VALUECOUNT;i++){
if(maxCnt&cntFlag[i]){
maxCnt=cntFlag[i];
if(cntFlag[i]&&minCnt&cntFlag[i]){
minCnt=cntFlag[i];
if(n==4&&maxCnt==4){
type.init("炸dan",1,4,0,0);
type.init("单牌",2,1,0,0);
if(n==2&&maxCnt==2){
type.init("对子",3,2,0,0);
if(n==3&&maxCnt==3){
type.init("三张 ",4,3,0,0);
if(n==4&&maxCnt==3){
type.init("三带一",5,3,0,1);
if(n==5&&maxCnt==3&&minCnt==2){
type.init("三带一对",6,3,0,2);
if(n==6&&maxCnt==4){
type.init("四带二",7,4,0,1);
if(n==8&&maxCnt==4&&minCnt==2){
type.init("四带二",8,4,0,2);
if(n&=5&&maxCnt==1&&cards[0]-&value==cards[n-1]-&value+n-1){
type.init("顺子",9,1,1,0);
if(n&=6&&maxCnt==2&&minCnt==2&&cards[0]-&value==cards[n-1]-&value+n/2-1){
type.init("连对",10,2,1,0);
int fjC//统计连续且大于3三张的牌
for(i=0;i&VALUECOUNT &&cntFlag[i]&3;i++);
for(fjCnt=0;i&VALUECOUNT &&cntFlag[i]&=3;i++,fjCnt++);
if(fjCnt&1){
if(n==fjCnt*3)
type.init("飞机",11,3,1,0);
else if(n==fjCnt*4)
type.init("飞机",12,3,1,1);
else if(n==fjCnt*5&&minCnt==2)
type.init("飞机",13,3,1,2);
void init(string inputStr, vector&Card*& &cardsHolded){
this-&cards.clear();
if(inputStr=="N"){
this-&calType();
//输入合法性判断
for(i=0;i&inputStr.size();i++){
bool find=
for(j=0;toFigure[j];j++){
if(inputStr[i]==toFigure[j]){
if(find==false){
//输入字符不在toFigure中
//查找手中有没有这些牌
int visitFlag[20]={0};
for(i=0;i&inputStr.size();i++){
Card *find=NULL;
for(j=0;j&cardsHolded.size();j++){
if(!visitFlag[j]&&cardsHolded[j]-&figure==inputStr[i]){
visitFlag[j]=1;
find=cardsHolded[j];
this-&cards.push_back(find);
cout&&inputStr[i];
cout&&"没有找到\t";
this-&cards.clear();
}//end for(i=0;i&inputStr.size();i++)
this-&arrange();
void init(vector&Card*& newCards){
this-&cards=newC
this-&arrange();
bool isCanBeat(CardGroup &cardGroup){
if(cardGroup.type.typeStr=="王炸"){
}else if(this-&type.typeStr=="王炸"){
}else if(cardGroup.type==this-&type &&this-&type.typeStr=="炸dan"){
return value()&cardGroup.value();
}else if(cardGroup.type.typeStr=="炸dan"){
}else if(this-&type.typeStr=="炸dan"){
}else if(cardGroup.type==this-&type &&this-&cards.size()==cardGroup.cards.size()){
return this-&value()&cardGroup.value();
int value(){
//计算牌组权值
if(type.typeStr=="三带一"||type.typeStr=="三带一对"||type.typeStr=="飞机"){
for(i=2;i&cards.size();i++){
if(cards[i]-&value==cards[i-2]-&value){
return cards[i]-&
if(type.typeStr=="四带二"){
for(i=3;i&cards.size();i++){
if(cards[i]-&value==cards[i-3]-&value){
return cards[i]-&
return cards[0]-&
void arrange(){
//整理:排序、计算类型
sort(this-&cards.begin(),this-&cards.end(),cmp);
this-&calType();
class LastCards{
static LastCards *lastC
CardGroup cardG
static LastCards* inst(){//单例模式
if(lastCards==NULL){
lastCards=new LastCards();
return lastC
vector&Card*& findCanBeatFrom(vector&Card*& &cardsHolded){
//查找能打得过的牌
int i,j,k,n=cardsHolded.size(),m=cardGroup.cards.size();
string typeStr=cardGroup.type.typeS
vector&Card*&
if(typeStr=="王炸"||n&m){
//打不过,返回空数组
int value=cardGroup.value();
//统计各点牌出现的次数
int cntFlag[VALUECOUNT]={0};
for(i=0;i&n;i++){
cntFlag[cardsHolded[i]-&value]++;
int continuousCount=1;
if(cardGroup.type.isContinuous){
continuousCount=m/(cardGroup.type.cnt1+cardGroup.type.cnt2);
bool findFirstF
//cout&&"continuousCount="&&continuousCount&&
for(i=value+1;i&VALUECOUNT;i++){
findFirstFigure=
for(j=0;j&continuousCj++){
if(cntFlag[i-j]&cardGroup.type.cnt1){
findFirstFigure=
if(findFirstFigure){
ret.clear();
int firstFigure=i;
//cout&&"查找"&&cardGroup.type.cnt1&&"个"&&firstFigure+3&&
for(k=0,j=0;k&cardsHolded.size() &&j&continuousCk++){
if(cardsHolded[k]-&value==firstFigure-j){
for(int kk=0;j&=0&&kk&cardGroup.type.cnt1;kk++){
ret.push_back(cardsHolded[k+kk]);
if(cardGroup.type.cnt2&0){
int SecondFigures[5];
int SecondCount=continuousC
if(cardGroup.type.typeStr=="四带二")
SecondCount=2;
bool findSecondFigure=
for(j=0,k=-1;j&SecondCount &&findSecondFj++){
findSecondFigure=
for(k++;k&VALUECOUNT;k++){
SecondFigures[j]=k;
if(cntFlag[k]&=cardGroup.type.cnt2 &&cntFlag[k]&cardGroup.type.cnt1){
findSecondFigure=
if(findSecondFigure){
//cout&&"查找SecondFigure "&&cardGroup.type.cnt2&&"个"&&SecondFigures[0]+3&&
//cout&&"SecondCount= "&&SecondCount&&
//for(i=0;i&SecondCi++)cout&&"SecondFigures["&&i&&"]="&&SecondFigures[i]&&
for(i=0;i&SecondCi++){
for(j=0;j&cardsHolded.size();){
if(cardsHolded[j]-&value==SecondFigures[i]){
for(k=0;k&cardGroup.type.cnt2;k++){
//cout&&"添加"&&cardsHolded[j]-&value+3&&
ret.push_back(cardsHolded[j+k]);
}while(j&cardsHolded.size()&&cardsHolded[j]-&value==SecondFigures[i]);
}//if(findSecondFigure)
}//end if(cardGroup.type.cnt2&0)
}//end if(findFirstFigure)
}//end for(i=value+1;i&VALUECOUNT;i++)
ret.clear();
//没牌打得过时查找有没有炸dan
if(typeStr!="炸dan"){
for(i=cardsHolded.size()-1;i&=3;i--){
if(cardsHolded[i]-&value==cardsHolded[i-3]-&value){
for(j=0;j&4;j++){
ret.push_back(cardsHolded[i-j]);
}//end vector&Card*& findCanBeatFrom()
LastCards* LastCards::lastCards = NULL;
class Player{
vector&Card*&
void arrange(){
sort(cards.begin(),cards.end(),cmp);
void print(){
cout&&this-&name&&":\t";
for(int i=0;i&cards.size();i++){
cards[i]-&print();
cout&&"["&&cards.size()&&"]\n";
vector&Card*& tip(){
//提示功能,使自己最小一张连最长
int j,k,m=cards.size();
for(j=0;j&m;j++){
for(k=j;k&m;k++){
temp+=cards[k]-&
ret.init(temp,cards);
if(ret.type.typeId!=ERROR){
return ret.
ret.cards.clear();
return ret.
void chupai(CardGroup &cardGroup){
cout&&this-&name&&":\t";
cout&&cardGroup.type.typeStr&&' ';
for(int i=0;i&cardGroup.cards.size();i++){
cardGroup.cards[i]-&print();
this-&cards.erase(find(this-&cards.begin(),this-&cards.end(),cardGroup.cards[i]));
cout&&"\t["&&this-&cards.size()&&"]\n";
if(cardGroup.type.typeStr!="不出"){
//记录到 LastCards 中
LastCards::inst()-&player=
LastCards::inst()-&cardGroup.init(cardGroup.cards);
class Landlords{
Player *player[PLAYERCOUNT];
bool finished,youWin,landlordW
int landlordI
Card *cards[CARDSCOUNT];
Landlords(){
int i,j,k;
for(i=0;i&PLAYERCOUNT;i++){
this-&player[i]=new Player();
//54张牌初始化
for(k=i=0;i&14;i++){
if(toFigure[i]==' '){
for(COLOR color=eHEART;color&=eSPADE;color=(COLOR)(color+1)){
this-&cards[k++]=new Card(toFigure[i],color);
this-&cards[k++]=new Card('Y',eSPADE);
this-&cards[k]=new Card('Z',eHEART);
~Landlords(){
for(int i=0;i&PLAYERCOUNT;i++){
delete this-&player[i];
for(int i=0;i&CARDSCOUNT;i++){
delete this-&cards[i];
void init(){
player[CURRENTPLAYER]-&name="Bice";
player[1]-&name="玩家2";
player[2]-&name="玩家3";
landlordWin=
landlordIndex=ERROR;
while(landlordIndex==ERROR){
srand((int)time(0));
shuffle();
landlordIndex=chooseLandlord();
cout&&player[landlordIndex]-&name&&"\t成为地主\n\n";
this-&add3Cards();
LastCards::inst()-&player=player[landlordIndex];
void startGame(){
string inputS
CardGroup inputC
for(int iTurns=landlordI!iTurns++){
if(iTurns&=PLAYERCOUNT){
if(iTurns==CURRENTPLAYER){
player[iTurns]-&print();
cout&&"输入提示:Z=大王 Y=小王 0=10 输入可无序 例如:JKQ0A9\n请出牌:\t";
cin&&inputS
inputCards.init(inputSrt,player[iTurns]-&cards);
}while(check(&inputCards)==false);
if(player[iTurns]==LastCards::inst()-&player){
//若是上次出牌的是自己,启用提示功能
inputCards.init(player[iTurns]-&tip());
//查找能打得过上家的牌
inputCards.init(LastCards::inst()-&findCanBeatFrom(player[iTurns]-&cards));
player[iTurns]-&chupai(inputCards);//出牌
if(player[iTurns]-&cards.size()==0){
//玩家手中没牌了,游戏结束
landlordWin=iTurns==landlordI
if(landlordWin){
youWin=landlordIndex==CURRENTPLAYER;
youWin=landlordIndex!=CURRENTPLAYER;
cout&&"\n_________________________ "&&(youWin?"You Win!":"You Lose!")&&" _________________________\n\n";
void add3Cards(){
cout&&"地主3张牌:\t";
for(int i=PLAYERCOUNT*17;i&CARDSCOUNT;i++){
this-&cards[i]-&print();
player[landlordIndex]-&cards.push_back(cards[i]);
player[landlordIndex]-&arrange();
int chooseLandlord(){
cout&&"\n_________________________ 抢地主 _________________________\n\n";
int first=-1,last,cnt=0,i,j=rand()%PLAYERCOUNT;
for(i=0;i&PLAYERCOUNT;i++,j==2?j=0:j++){
if(j==CURRENTPLAYER){
decision=makeChoice("是否抢地主?(Y=抢/N=不抢):");
decision=rand()%2;
if(decision){
if(first==-1){
cout&&this-&player[j]-&name&&"\t抢地主\n";
cout&&this-&player[j]-&name&&"\t没有抢\n";
if(cnt==0){
cout&&"没人抢,重新发牌\n";
return ERROR;
if(cnt==1){
//第一轮只有一人抢地主
//最后一次争抢
if(first==CURRENTPLAYER){
decision=makeChoice("是否抢地主?(Y=抢/N=不抢):");
decision=rand()%2;
if(decision){
cout&&this-&player[first]-&name&&"\t抢地主\n";
cout&&this-&player[first]-&name&&"\t没有抢\n";
void shuffle(){
int i,j,k;
for(i=0;i&CARDSCOUNT;i++){
swap(this-&cards[i],this-&cards[rand()%CARDSCOUNT]);
for(k=i=0;i&PLAYERCOUNT;i++){
this-&player[i]-&cards.clear();
for(j=0;j&17;j++){
this-&player[i]-&cards.push_back(this-&cards[k++]);
this-&player[i]-&arrange();//整理
this-&player[i]-&print();
bool check(CardGroup *cardGroup){
if(cardGroup-&type.typeId==ERROR){
cout&&"出牌错误,重新输入\n";
}else if(cardGroup-&type.typeStr=="不出"){
}else if(LastCards::inst()-&player!=player[CURRENTPLAYER]&&!cardGroup-&isCanBeat(LastCards::inst()-&cardGroup)){
cout&&"打不过,重新输入\n";
int main(){
Landlords *landlords=new Landlords();
landlords-&init();//发牌、抢地主
landlords-&startGame();//游戏开始
}while(makeChoice("\n是否继续游戏?(Y=继续/N=结束): "));
bool makeChoice(string tip){
return input=="Y"||input=="y";
bool cmp(Card* a,Card* b){
//比较两张牌大小
if(a-&value==b-&value){
return a-&color&b-&
return a-&value&b-&
xingbinice
浏览: 9963 次
来自: 海南
记录一下有bug的版本:majiang.isPu = func ...
你好,您的斗地主源码写的非常棒!可以跟您沟通学习下吗?
要是把程序代码附带一下,有个参照,就更好了
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 木马程序编写 的文章

 

随机推荐