1、C+程序课程设计报告21点游戏随机数,枚举类型?C+面向对象程序设计课程设计报告设计题目: 21点游戏 学生学号: 学生姓名: 专业班级: 学生成绩: 指导教师: 医药信息工程学院图像处理与多媒体教研室2011-一、 设计任务分析1、21点游戏介绍21点游戏是一个古老的扑克游戏,游戏的规则是:各个 参与者设法使自己的牌达到总分21而不超过这个数值。扑克牌的分值取它们的面值,A充当1或者11分,J,Q和K人头牌都是10分。庄家VS17个玩家。在开局时,包括庄家在内的所有参与者都有两张牌。玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐藏的。接下来,只要愿意,各个玩家都有机会依次再拿一张牌
2、。如果是玩家的总分超过了21(称为引爆),那么这个玩家就输了。在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。只要庄家的总分等于或小于16,那么他就必须再拿牌。如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家打成平局。否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。如果二者的总分相同,则玩家与庄家打成平局中。2、实现以下功能: 1) 洗牌; 2) 发牌; 3) 隐藏或显示牌; 4) 计算总分; 5) 判断胜负。 二、 21点游戏流程三、 主要数据结构扑克版结构体:typedef enum /扑克牌面值:ACE(A),TWO(2)TEN(10)
3、,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; /扑克牌面值 SuitType suit; /扑克牌花色;四、 21点游戏类设计GameOf21Point类属性成员变量名数据
4、类型意 义DeckCard一副扑克牌dealPoseint发牌位置Namechar玩家改姓名方法成员函数名属 性函数功能Shuffle()private洗牌GetTotalScore()private返回总分值ShowStatus()private显示当前状态DealOneCard()private发牌Game()public运行游戏五、 源代码#ifndef _CARD_H_#define _CARD_H_#include/#includeusing namespace std;typedef enum /扑克牌面值:ACE(A),TWO(2)TEN(10),JACK(J),QUEEN(Q)
5、,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; /扑克牌面值 SuitType suit; /扑克牌花色;ostream &operator(ostream &outStream,const Card &ca
6、rd)/操作结果:重载运算符 /输出花色 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.rank=ACE) outStreamA; /ACE表示A else if(card.rank=JACK) outStrea
7、mJ; /JACK表示J else if(card.rank=QUEEN) outStreamQ; /JACK表示Q else if(card.rank=KING) outStreamK; /JACK表示K else cout(int)card.rank; return outStream;#endif#ifndef _GAME_OF_21_POINT_H_ #define _GAME_OF_21_POINT_H_#includecard.h /扑克牌#include#define LEN_OF_MAX_NAME 21 /最大姓名长度using namespace std;/21点游戏类Gam
8、eOf21Point声明class GameOf21Point private: Card deck52; /一副扑克牌 int dealPos; /发牌位置 Card hands821; /hand0保存庄家的牌,hand17保存各玩家的牌 int numOfCard8; /庄家(numOfCard0)及玩家numOfCard17的牌数 char name8LEN_OF_MAX_NAME; /庄家及玩家姓名 int numOfPlayer; void Shuffle(); /洗牌 int GetTotalScore(Card hand21,int n); /返回一手牌的总分值 void Sh
9、owStatus(int num,bool hideFirstCardAndTotalScore=false); /显示庄家(对应num=0)或玩家(对应num0)的当前状态 Card DealOneCard()return deckdealPos+; /发一张扑克牌 public: /方法声明 GameOf21Point(); /无参构造函数 virtual GameOf21Point(); void Game(); ;/初始化扑克牌,发牌位置,庄家与各玩家手中的扑克牌数GameOf21Point:GameOf21Point() int curPos=0; /当前扑克牌位置 for(int
10、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手中的扑克牌张数 for
11、(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
12、; int totalScore=0; for(pos=0;posTEN)totalScore+=10; /J,Q,K的分值为10 else totalScore+=(int)handpos.rank; /TWOTEN分值为210 /分值大于21时,将A的分值改为1 for(pos=0;totalScore21&pos0,显示第num个玩家的当前状态,当/hideFirstCardAndTotalScore为真时,将隐藏首张扑克牌与总分,否则将显示首/张牌与总分 /*coutnamenum:; /显示庄家或玩家姓名 /隐藏庄家首张牌 if(hideFirstCardAndTotalScore)
13、cout; else couthandsnum0; /显示庄家的首张牌 for(int i=1;inumOfCardnum;i+) couthandsnumi; if(!hideFirstCardAndTotalScore) cout总分值GetTotalScore(handsnum,numOfCardnum); cout21) coutnamenum引爆!endl; /*不使用输出符重载时的代码*/ coutnamenum:; /显示庄家或玩家姓名 /根据庄家的状态隐藏或显示庄家首张牌的花色 if(hideFirstCardAndTotalScore)cout;/隐藏首张牌 else if(
14、handsnum0.suit=CLUBS) cout梅花; /CLUBS表示梅花 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表示A else if(ha
15、ndsnum0.rank=JACK) coutJ; /JACK表示J else if(handsnum0.rank=QUEEN) coutQ; /JACK表示Q else if(handsnum0.rank=KING) coutK; /JACK表示K else 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(handsnu
16、mi.suit=HEARTS) cout 红桃; /HEARTS表示红桃 else if(handsnumi.suit=SPADES) cout黑桃; /SPADES表示黑桃 /输出面值 if (handsnumi.rank=ACE) coutA; /ACE表示A else if(handsnumi.rank=JACK) coutJ; /JACK表示J else if(handsnumi.rank=QUEEN) coutQ; /JACK表示Q else if(handsnumi.rank=KING) coutK; /JACK表示K else cout(int)handsnumi.rank; i
17、f(!hideFirstCardAndTotalScore) cout总分值GetTotalScore(handsnum,numOfCardnum); 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+)
18、handsinumOfCardi+=DealOneCard(); ShowStatus(i); coutendl; /依次向各玩家发额外的牌 for(i=1;i=numOfPlayer;i+) char Ans; coutnameiAns; /玩家选择再要一张牌,如果玩家没有引爆则继续发牌 /switch(Ans) / while(Ans!=y & Ans!=n) cout你的输入不正确,请重新输入。endl; coutnameiAns; while (GetTotalScore(handsi,numOfCardi)21) break; coutnameiAns; / ShowStatus(0
19、); /显示庄家 /庄家总分小于等于16,必须再拿牌 while(GetTotalScore(hands0,numOfCard0)=16) hands0numOfCard0+=DealOneCard(); /为庄家发1张牌 ShowStatus(0); /显示庄家 cout21) for(i=1;i=numOfPlayer;i+) /依次查看每位玩家 if(GetTotalScore(handsi,numOfCardi)=21) coutnamei,恭喜你,你赢了!endl;/玩家没有引爆 else coutnamei,唉,你打平局了!endl;/玩家引爆 else /庄家没有引爆,依次查看每
20、位玩家 for(i=1;i=numOfPlayer;i+) /总分比庄家大 if(GetTotalScore(handsi,numOfCardi)GetTotalScore(hands0,numOfCard0) /玩家未引爆,且总分比庄家大,玩家赢 coutnamei,恭喜你,你赢了!endl; else if(GetTotalScore(handsi,numOfCardi)=GetTotalScore(hands0,numOfCard0) /玩家总分与庄家相等,平局 coutnamei,唉,你打平局了!endl; else /玩家引爆或总分比庄家小,玩家输 coutnamei,对不起,你输了
21、!endl; #endif#includegame_of_21_point.hint main() char AgainGame; do GameOf21Point objGame; /生成21点游戏对象 objGame.Game(); coutendlAgainGame; while(AgainGame=y); return 0;六、 测试情况七、 八、 小结课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说
22、掌握程序开发技术是十分重要的,而C+语言又是最常见,功能最强大的一种高级语言,因此做好C+语言课程设计是十分必要的。通过几天的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次真真的做程序设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。我做的
23、课程设计,虽然是很简单的一个小的程序,但对我来说却是一个很大的困难。更加是第一次做课程设计,所以在机房做了一个下午却丝毫没有进展,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,可我还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C+语言的一次实践作业,自己进步的证明。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!九、 参考文献C程序设计教程 谭浩强 著 清华大学出版社C+面向对象程序设计 陈维兴 林小茶 编著 中国铁道出版社
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1