您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > c++课程设计-扑克牌游戏
C++课程设计实验报告1、程序名称:扑克牌游戏2、程序设计功能:创建一副扑克牌,并完成洗牌等相关操作。3、程序设计要求:(1)增加大小王。(2)删去一张指定的牌后,余牌显示。(3)创建一副扑克,显示一副扑克牌,洗牌,一次分发给四个人并显示。程序设计过程中根据设计思想添加功能:(1)根据洗牌参数,添加入可以让玩牌者控制洗牌次数的功能。(2)在可以完成每人删除一张牌的功能基础上,增加可以删除一轮牌(也就是同时每人删除一张牌)的功能。4、对题目的分析与注释总体分析:根据题目的设计要求,增加满足要求所需要的函数,实现相应功能,通过合理安排调用过程,实现题目要求的功能。注释:(已在程序设计过程中指出)5、增加功能的设计思路(1)增加大小王实现函数:Deck::MakeDeck()PlayingCard::CardMake()Deck::MakeDeck()将参数nLastDelt由51增加到53,生成一副扑克牌的54张牌(0~54),实际上是多分配了两张大小王的空间,控制参数nLastDelt的变化,再通过调用函数PlayingCard::CardMake()将参数传递给nNum,为每张牌(包括大小王)赋予正确的面值和花色,由此生成一副完整的牌。其中对大小王的赋值是添加的功能,具体实现过程如下:voidPlayingCard::CardMake(intnNum)//跟据nNum生成一张扑克牌,nNum不同,生成的面值花色{inti=0;charj;if(nNum==53)//生成大王{strcpy(achFace,B);chSuit=2;nValue=15;}if(nNum==52)//生成小王{strcpy(achFace,S);chSuit=1;nValue=14;}由此段程序可知,参数nLastDelt是由大到小变化的,所以54张牌中首先生成大小王,至于其他牌的生成,是课本源程序上自带的,牌的花色由相应的ASCII码来赋值。(2)删去一张指定的牌后,余牌显示。实现函数:Deck::DelOne()PlayingCard::ShowCard()Deck::Delete()通过switch语句满足case的条件后,开始进行删除一张牌(调用函数Deck::DelOne()),系统会询问要删除第几个人的第几张牌,在这里考虑到用户可能会误输入大于人数或大于个人牌数的错误数字,因此设计了如果参数不符合要求就返回选择菜单这一步。之后调用Delete()函数将牌删除。Delete()函数为新增函数,具体如下:voidDeck::Delete(intm,intn)//删除一张,n指删除排的位置(第几张牌){for(inti=n;i13;i++)card[m][i]=card[m][i+1];card[m][13]=PlayingCard();//将删除的后面的牌依次向前移,并为最后一张赋空,虽然最后一张赋空但其空间仍存在,因此运行时会显示问号。}将牌删除以后,调用ShowCard()显示删除的那张牌,并显示剩余的那张牌以及未删除的人的所有牌。(2)创建一副扑克,显示一副扑克牌,洗牌,一次分发给四个人并显示。实现函数:DeckMakeDriver()Deck::MakeDeck()PlayingCard::CardMake()Deck::ShowDeck()Deck::DeckShuff()Deck::SendDeck()PlayingCard::ShowCard()主函数中直接调用函数DeckMakeDriver()来实现,其中发牌函数SendDeck()为新增函数,具体实现过程如下:voidDeck::SendDeck()//为四个玩家分牌并显示{intm=0,n=0,p=0,q=0;for(inti=0;i54;i++){switch(i%4){case0:card[0][m]=m_cardarray[i];m++;break;case1:card[1][n]=m_cardarray[i];n++;break;case2:card[2][p]=m_cardarray[i];p++;break;case3:card[3][q]=m_cardarray[i];q++;break;}}for(inta=0;a2;a++){coutendl;cout第a+1个人的牌为:;for(intj=0;j14;j++){card[a][j].ShowCard();}coutendl;}for(intb=2;b4;b++){coutendl;cout第b+1个人的牌为:;for(intk=0;k13;k++){card[b][k].ShowCard();}coutendl;}CenterText(按enter键进行删牌部分......);}此发牌方法为,第一张牌给第一个人,第二只张给第二个人……第五张再给第一个人,如此循环(运用switch语句实现),而因为有五十四张牌,所以第一第二个人有十四张牌,另外两个人有十三张,因此分两种情况分牌。再者,在显示一副扑克牌时,将每行设置为显示四张牌,这样,第一竖行就是第一个人的牌,以此类推,方便查找编程错误。另外,添加了洗牌次数的功能,课本的源程序规定了只能洗250次牌,经过修改以后,将times改为一个可变参数,这样,由用户自己来决定要怎样洗牌,洗几次牌,这样的话,增加了洗牌的均匀性。可变性更高了。(3)删除一张牌与删除一轮牌实现函数:DeckMakeDriver()Deck::DelRound()Deck::DelOne()DeckMakeDriver()函数提供了选择菜单,即删除一张牌or删除一轮牌,删除一张牌上面已经提到过,以下为删除一轮牌:voidDeck::DelRound()//删除指定一轮牌并显示余牌{if(checkdel()){cout请分别输入要删除的四个玩家的牌:endl;for(inti=0;i4;i++){intj;cout请输入删除玩家i+1的第几张牌:;cinj;if(j14){cout此人不存在;break;}cout将要删除的牌为:;card[i][j-1].ShowCard();Delete(i,j-1);coutendlendlendl;}}coutendlendlendl;for(inti=0;i2;i++)//显示余牌{coutendl;cout第i+1个人的牌为:;for(intj=0;j13;j++){card[i][j].ShowCard();}coutendl;}for(inta=2;a4;a++)//显示余牌{coutendl;cout第a+1个人的牌为:;for(intb=0;b12;b++){card[a][b].ShowCard();}coutendl;}}同删除一张牌类似,删除一轮牌也设置了如果用户输入错误信息所采用的处理办法。及重新返回选择菜单。也同样是因为前两人与后两人的牌数不一样,分成了两个for语句来区分及实现。在完成所有功能之后,可以通过提示操作来退出扑克牌游戏。6、设计中遇到的主要问题及解决方法(1)、大小王的花色开始的时候,大小王的花色总是显示1和2,而其他同学则是显示相应的黑白两个笑脸。解决办法:经过询问和查阅资料,发现解决方法竟然只需要将’1’和‘2’改为1和2即可,因为花色都是用ASCII来表示的,用字符形式自然不对。(2)、问题:每次分牌都是四个人全部是每人十二张解决办法:空间不足,将第一第二个人的牌数调整为十四张,即(intj=0;j14;j++),而第三四个人仍为(intj=0;j13;j++),这就就将问题解决了。(3)、源程序中的删除一张牌的操作是任意删除一张,课程设计要求删除指定张,并输出显示剩余的牌,怎样输入并执行该操作?解决办法:首先用Check函数检查是否有玩家的牌被删除完。显示提示语“cout输入要删除第几个人的牌:endl;”,用户输入数据;再提示“cout输入要删除第几张牌:endl;”,用户再输入数据。用ShowCard函数、Change函数处理,然后用for语句显示剩余的牌。(4)、课程设计要求,洗牌并分牌之后,删除牌和显示牌的操作都要在新生成的牌中进行,怎样进行该操作?解决办法:将洗好的牌分给玩家是用一个二维数组PlayingCardcard[4][13];装四个玩家的牌,在操作时直接对二维数组进行操作。7、设计中尚存的不足删除牌后,最后一张的地方总是会显示一个问号。8、程序设计过程的心得体会通过本次C++程序设计,虽然各种错误总是层出不穷,可是解决问题的过程真的就是一个不断学习、不断进步的过程。经过上学期对C++的初步学习,了解到了关于计算机编程方面的一些初步知识,一个细微的地方便会导致一大堆的错误,不管是一个英文大小写,还是一个分号没有加,又或者是中英文的标点符号,总之,C++的编程,除了掌握扎实全面的专业知识外,最最重要的就是两个字,细心了。从一开始的一步步将课本上的源程序及原始注释敲进电脑,到后来却哑然发现课本管盘中本来就有源程序,到最后慢慢发现问题,然后一个一个的解决,再到后来,能利用自己的知识为程序添加新的功能,我感觉得到自己真的学到了很多。很多程序部分自己读不懂,就一遍一遍的问同学,去图书馆查资料。好像困难越大自己就越有斗志和欲望一定将困难解决,内心就一直有一个信念,不管付出多大的精力,我一定会将问题解决。一开始的时候,走了很弯路,本来想按课本上给的提示来做,可最后发现实在是很复杂,怎么改都是错,最后还是选择了直接做课本要求的那部分,按自己的方法来做。最终,在完成了课本上的要求之外,我还通过自己的能力添加了新的功能,当程序完成以后,自己内心的那份成就感,似乎胜过了一切。另外,通过这次的学习,我激发了对编程学习的兴趣,我相信从今以后,我会将C++的学习当成今后学习的一部分,而不会因为作业的完成将他丢弃,在以后的学习中,我会找到一些好的方法去探究。
本文标题:c++课程设计-扑克牌游戏
链接地址:https://www.777doc.com/doc-4907076 .html