




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、随机数,枚举类型c+面向对象程序设计课程设计报告设计题目: 21点游戏 学生学号: 学生姓名: 专业班级: 学生成绩: 指导教师: 医药信息工程学院图像处理与多媒体教研室2011-5一、 设计任务分析1、21点游戏介绍21点游戏是一个古老的扑克游戏,游戏的规则是:各个参与者设法使自己的牌达到总分21而不超过这个数值。扑克牌的分值取它们的面值,a充当1或者11分,j,q和k人头牌都是10分。庄家vs17个玩家。在开局时,包括庄家在内的所有参与者都有两张牌。玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐藏的。接下来,只要愿意,各个玩家都有机会依次再拿一张牌。如果是玩家的总分超过了21(称
2、为引爆),那么这个玩家就输了。在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。只要庄家的总分等于或小于16,那么他就必须再拿牌。如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家打成平局。否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。如果二者的总分相同,则玩家与庄家打成平局中。2、实现以下功能: 1) 洗牌; 2) 发牌; 3) 隐藏或显示牌; 4) 计算总分; 5) 判断胜负。 二、 21点游戏流程给庄家发最初的三张牌隐藏庄家的第一张牌和总分向玩家发额外的牌并显示牌和总分显示庄家的牌玩家输给玩家发最初的三张牌并显示牌和总分玩家需要额外的牌?
3、庄家的总分庄家?洗牌nyynyynn玩家引爆?玩家输yn平局玩家赢三、 主要数据结构扑克版结构体:typedef enum/扑克牌面值:ace(a),two(2)ten(10),jack(j),queen(q),king(k)ace=1,two,three,four,five,six,seven,eight,nine,ten,jack,queen,kingranktype;typedef enum/扑克牌花色:clubs(梅花),diamonds(方块),hearts(红桃)和spades(黑桃)clubs,diamonds,hearts,spadessuittype;struct card/
4、扑克牌结构体ranktype rank;/扑克牌面值suittype suit;/扑克牌花色;四、 21点游戏类设计gameof21point类属性成员变量名数据类型意 义deckcard一副扑克牌dealposeint发牌位置namechar玩家改姓名方法成员函数名属 性函数功能shuffle()private洗牌gettotalscore()private返回总分值showstatus()private显示当前状态dealonecard()private发牌game()public运行游戏五、 源代码#ifndef _card_h_#define _card_h_#include/#inc
5、ludeusing namespace std;typedef enum/扑克牌面值:ace(a),two(2)ten(10),jack(j),queen(q),king(k)ace=1,two,three,four,five,six,seven,eight,nine,ten,jack,queen,kingranktype;typedef enum/扑克牌花色:clubs(梅花),diamonds(方块),hearts(红桃)和spades(黑桃)clubs,diamonds,hearts,spadessuittype;struct card/扑克牌结构体ranktype rank;/扑克牌面
6、值suittype suit;/扑克牌花色;ostream &operator(ostream &outstream,const card &card)/操作结果:重载运算符/输出花色if(card.suit=clubs) outstream梅花;/clubs表示梅花else if(card.suit=diamonds) outstream方块;/diamonds表示方块else if(card.suit=hearts) outstream 红桃;/hearts表示红桃else if(card.suit=spades) outstream黑桃;/spades表示黑桃/输出面值if (card.
7、rank=ace) outstreama;/ace表示aelse if(card.rank=jack) outstreamj;/jack表示jelse if(card.rank=queen) outstreamq;/jack表示qelse if(card.rank=king) outstreamk;/jack表示kelse cout(int)card.rank;return outstream;#endif#ifndef _game_of_21_point_h_#define _game_of_21_point_h_#includecard.h/扑克牌#include#define len_o
8、f_max_name 21/最大姓名长度using namespace std;/21点游戏类gameof21point声明class gameof21pointprivate:card deck52;/一副扑克牌int dealpos;/发牌位置card hands821;/hand0保存庄家的牌,hand17保存各玩家的牌int numofcard8;/庄家(numofcard0)及玩家numofcard17的牌数char name8len_of_max_name;/庄家及玩家姓名int numofplayer;void shuffle();/洗牌int gettotalscore(car
9、d hand21,int n);/返回一手牌的总分值void showstatus(int num,bool hidefirstcardandtotalscore=false);/显示庄家(对应num=0)或玩家(对应num0)的当前状态card dealonecard()return deckdealpos+; /发一张扑克牌public:/方法声明gameof21point();/无参构造函数virtual gameof21point();void game();/初始化扑克牌,发牌位置,庄家与各玩家手中的扑克牌数gameof21point:gameof21point()int curpo
10、s=0;/当前扑克牌位置for(int suitpos=0;suitpos4;suitpos+)/花色for(int rankpos=1;rankpos=13;rankpos+)/面值deckcurpos.suit=(suittype)suitpos;/花色deckcurpos.rank=(ranktype)rankpos;/面值curpos+;coutnumofplayer;while (numofplayer7) /限制人数在17之间coutnumofplayer;dealpos=0;/发牌位置int i=0;/临时变量/庄家numofcard0及玩家numofcard17手中的扑克牌张数
11、for(i=0;i=numofplayer;i+) numofcardi=0;strcpy(name0,庄家);/玩家姓名for(i=1;i=numofplayer;i+)cout输入第inamei;cout游戏开始0;curpos-)int pos=rand()%(curpos+1);/产生0curpos之间的随机数card temp;/定义一个临时变量用于交换牌temp=deckpos;deckpos=deckcurpos;deckcurpos=temp;int gameof21point:gettotalscore(card hand21,int n)int pos;int totals
12、core=0;for(pos=0;posten)totalscore+=10;/j,q,k的分值为10else totalscore+=(int)handpos.rank;/twoten分值为210/分值大于21时,将a的分值改为1for(pos=0;totalscore21&pos0,显示第num个玩家的当前状态,当/hidefirstcardandtotalscore为真时,将隐藏首张扑克牌与总分,否则将显示首/张牌与总分/*coutnamenum:;/显示庄家或玩家姓名/隐藏庄家首张牌if(hidefirstcardandtotalscore)cout;else couthandsnum
13、0;/显示庄家的首张牌for(int i=1;inumofcardnum;i+)couthandsnumi;if(!hidefirstcardandtotalscore)cout总分值gettotalscore(handsnum,numofcardnum);cout21)coutnamenum引爆!endl;/*不使用输出符重载时的代码*/coutnamenum:;/显示庄家或玩家姓名/根据庄家的状态隐藏或显示庄家首张牌的花色if(hidefirstcardandtotalscore)cout;/隐藏首张牌else if(handsnum0.suit=clubs) cout梅花;/clubs表
14、示梅花else if(handsnum0.suit=diamonds) cout方块;/diamonds表示方块else if(handsnum0.suit=hearts) cout 红桃;/hearts表示红桃else if(handsnum0.suit=spades) cout黑桃;/spades表示黑桃/输出庄家首张牌的面值if(hidefirstcardandtotalscore)cout;else if(handsnum0.rank=ace) couta;/ace表示aelse if(handsnum0.rank=jack) coutj;/jack表示jelse if(handsnu
15、m0.rank=queen) coutq;/jack表示qelse if(handsnum0.rank=king) coutk;/jack表示kelse cout(int)handsnum0.rank;for(int i=1;inumofcardnum;i+)if(handsnumi.suit=clubs) cout梅花;/clubs表示梅花else if(handsnumi.suit=diamonds) cout方块;/diamonds表示方块else if(handsnumi.suit=hearts) cout 红桃;/hearts表示红桃else if(handsnumi.suit=sp
16、ades) cout黑桃;/spades表示黑桃/输出面值if (handsnumi.rank=ace) couta;/ace表示aelse if(handsnumi.rank=jack) coutj;/jack表示jelse if(handsnumi.rank=queen) coutq;/jack表示qelse if(handsnumi.rank=king) coutk;/jack表示kelse cout(int)handsnumi.rank;if(!hidefirstcardandtotalscore)cout总分值gettotalscore(handsnum,numofcardnum);
17、cout21)coutnamenum引爆!endl; void gameof21point:game()shuffle();/洗牌int i,j;/为庄家发两张牌for(i=0;i2;i+)hands0numofcard0+=dealonecard();showstatus(0,true);/显示庄家状态,隐藏首张牌与总分/向各玩家发牌并显示for(i=1;i=numofplayer;i+)for(j=0;j2;j+)handsinumofcardi+=dealonecard();showstatus(i);coutendl;/依次向各玩家发额外的牌for(i=1;i=numofplayer;
18、i+)char ans;coutnameians;/玩家选择再要一张牌,如果玩家没有引爆则继续发牌/switch(ans)/while(ans!=y & ans!=n)cout你的输入不正确,请重新输入。endl;coutnameians;while (gettotalscore(handsi,numofcardi)21) break;coutnameians;/showstatus(0);/显示庄家/庄家总分小于等于16,必须再拿牌while(gettotalscore(hands0,numofcard0)=16)hands0numofcard0+=dealonecard();/为庄家发1张
19、牌showstatus(0);/显示庄家cout21)for(i=1;i=numofplayer;i+)/依次查看每位玩家if(gettotalscore(handsi,numofcardi)=21)coutnamei,恭喜你,你赢了!endl;/玩家没有引爆else coutnamei,唉,你打平局了!endl;/玩家引爆else/庄家没有引爆,依次查看每位玩家for(i=1;i=numofplayer;i+)/总分比庄家大if(gettotalscore(handsi,numofcardi)gettotalscore(hands0,numofcard0)/玩家未引爆,且总分比庄家大,玩家赢
20、coutnamei,恭喜你,你赢了!endl;else if(gettotalscore(handsi,numofcardi)=gettotalscore(hands0,numofcard0)/玩家总分与庄家相等,平局coutnamei,唉,你打平局了!endl;else/玩家引爆或总分比庄家小,玩家输coutnamei,对不起,你输了!endl;#endif#includegame_of_21_point.hint main()char againgame;dogameof21point objgame;/生成21点游戏对象objgame.game();coutendlagaingame; while(againgame=y);return 0;六、 测试情况七、 小结课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而c+语言又是最常见,功能最强大的一种高级语言,因此做好c+语言课程设计是十分必要的。通过几天的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论