C++课程设计实验报告
1、程序名称:扑克牌游戏
2、程序设计功能:创建一副扑克牌,并完成洗牌等相关操作。
3、程序设计要求:
(1)增加大小王。
(2)删去一张指定的牌后,余牌显示。
(3)创建一副扑克,显示一副扑克牌,洗牌,一次分发给四个人并显示。
程序设计过程中根据设计思想添加功能:
(1)根据洗牌参数,添加入可以让玩牌者控制洗牌次数的功能。
(2)在可以完成每人删除一张牌的功能基础上,增加可以删除一轮牌(也就是同时每人删除一张牌)的功能。
4、对题目的分析与注释
总体分析:根据题目的设计要求,增加满足要求所需要的函数,实现相应功能,通过合理安排调用过程,实现题目要求的功能。
注释:(已在程序设计过程中指出)
5、增加功能的设计思路
(1)增加大小王实现函数:Deck::MakeDe ck()
Playin gCard::CardMa ke()
Deck::MakeDe ck()将参数nLastDel t由51增加到53,生成一副扑克牌的54张牌(0~54),实际上是多分配了两张大小王的空间,控制参数nLastDe lt 的变化,再通过调用函数PlayingCa rd::CardMa ke()将参数传递给n Num,为每张牌(包括大小王)赋予正确的面值和花,由此生成一副完整的牌。其中对大小王的赋值是添加的功能,具体实现过程如下:
void Playin gCard::CardMa ke(int nNum)//跟据nNum生成一张扑克牌,nNum不同,生成的面值花
{
int i = 0;
char j;
if(nNum==53) //生成大王
{
strcpy(achFac e," B");
chSuit=2;
nValue=15;
}
if(nNum==52) //生成小王
{
strcpy(achFac e," S");
chSuit=1;
nValue=14;
}
由此段程序可知,参数nLastDelt是由大到小变化的,所以54张牌中首先生成大小王,至于其他牌的生成,是课本源程序上自带的,牌的花由相应的ASC II码来赋值。
(2)删去一张指定的牌后,余牌显示。实现函数: Deck::DelOne() PlayingCard::ShowCa rd() Deck::Delete()
通过swit ch语句满足case的条件后,开始进行删除一张牌(调用函数Deck::DelOne()),系统会询问要删除第几个人的第几张牌,在这里考虑到用户可能会误输入大于人数或大于个人牌数的错误数字,因此设计了如果参数不符合要求就返回选择菜单这一步。之后调用De lete()函数将牌删除。
Delete()函数为新增函数,具体如下:
void Deck::Delete(int m,int n) //删除一张,n指删除排的位置(第几张牌)
{ for(int i=n;i<13;i++)
card[m][i]=card[m][i+1];
card[m][13]=Playin gCard(); //将删除的后面的牌依次向前移,并为
最后一张赋空,虽然最后一张赋空但其
空间仍存在,因此运行时会显示问号。
}
将牌删除以后,调用ShowCard()显示删除的那张牌,并显示剩余的那张牌以及未删除的人的所有牌。
(2)创建一副扑克,显示一副扑克牌,洗牌,一次分发给四个人并显示。
实现函数:DeckMa keDri ver() Deck::MakeDe ck()
Playin gCard::CardMa ke()Deck::ShowDe ck()
Deck::DeckSh uff() Deck::SendDe ck()
Playin gCard::ShowCa rd()
主函数中直接调用函数D eckMa keDri ver()来实现,其中发牌函数
SendD eck()为新增函数,具体实现过程如下:
void Deck::SendDe ck() //为四个玩家分牌并显示
{
int m=0,n=0,p=0,q=0;
for(int i=0;i<54;i++)
{
switch(i%4)
{ case 0: card[0][m]=m_card array[i];m++;break;
case 1: card[1][n]=m_card array[i];n++;break;
case 2: card[2][p]=m_card array[i];p++;break;
case 3: card[3][q]=m_card array[i];q++;break;
}
}
for(int a=0;a<2;a++)
{
cout<<endl;
cout<<" 第"<<a+1<<"个人的牌为:";
for(int j=0;j<14;j++)
{
card[a][j].ShowCa rd() ;
}
cout<<endl;
}
for(int b=2;b<4;b++)
{
cout<<endl;
cout<<"第"<<b+1<<"个人的牌为:";
for(int k=0;k<13;k++)
{
card[b][k].ShowCa rd() ;
}
cout<<endl;
}
Center Text("按enter键进行删牌部分......");
}
此发牌方法为,第一张牌给第一个人,第二只张给第二个人……第五
张再给第一个人,如此循环(运用swit ch语句实现),而因为有五十
四张牌,所以第一第二个人有十四张牌,另外两个人有十三张,因此
分两种情况分牌。
再者,在显示一副扑克牌时,将每行设置为显示四张牌,这样,第一
竖行就是第一个人的牌,以此类推,方便查编程错误。
另外,添加了洗牌次数的功能,课本的源程序规定了只能洗250次
牌,经过修改以后,将times改为一个可变参数,这样,由用户自己来决定要怎样洗牌,洗几次牌,这样的话,增加了洗牌的均匀性。可
变性更高了。
(3)删除一张牌与删除一轮牌
实现函数:DeckMa keDri ver() Deck::DelRou nd() Deck::DelOne() DeckMa keDri ver()函数提供了选择菜单,即删除一张牌o r删除一轮牌,
删除一张牌上面已经提到过,以下为删除一轮牌:
void Deck::DelRou nd() //删除指定一轮牌并显示余牌
{ if(checkd el())
{ cout<<"请分别输入要删除的四个玩家的牌:"<<endl;
for(int i=0;i<4;i++)
{ int j;
cout<<"请输入删除玩家"<<i+1<<"的第几张牌:";
cin>>j;
if(j>14){cout<<"此人不存在";break;}
cout<<"将要删除的牌为:";
card[i][j-1].ShowCa rd() ;
Delete(i,j-1);
cout<<endl<<endl<<endl;
}
}
cout<<endl<<endl<<endl;
for(int i=0;i<2;i++) //显示余牌
{
cout<<endl;
cout<<" 第"<<i+1<<"个人的牌为:";
for(int j=0;j<13;j++)
c++课程设计报告{
card[i][j].ShowCa rd() ;
}
cout<<endl;
}
for(int a=2;a<4;a++) //显示余牌
{
cout<<endl;
cout<<" 第"<<a+1<<"个人的牌为:";
for(int b=0;b<12;b++)
{
card[a][b].ShowCa rd() ;
}
cout<<endl;
}
}
同删除一张牌类似,删除一轮牌也设置了如果用户输入错误信息所
采用的处理办法。及重新返回选择菜单。也同样是因为前两人与后两
人的牌数不一样,分成了两个f o r语句来区分及实现。
在完成所有功能之后,可以通过提示操作来退出扑克牌游戏。
6、设计中遇到的主要问题及解决方法
(1)、大小王的花
开始的时候,大小王的花总是显示1和2,而其他同学则是显示相
应的黑白两个笑脸。
解决办法:经过询问和查阅资料,发现解决方法竟然只需要将’1’和‘2’改为1和2即可,因为花都是用ASCI I来表示的,用字符形式自然
不对。
(2)、问题:每次分牌都是四个人全部是每人十二张
解决办法:
空间不足,将第一第二个人的牌数调整为十四张,即(int j=0;j<14;
j++),而第三四个人仍为(int j=0;j<13;j++),这就就将问题解
决了。
(3)、源程序中的删除一张牌的操作是任意删除一张,课程设计要求删除指定张,并输出显示剩余的牌,怎样输入并执行该操作?
解决办法:
首先用Che ck函数检查是否有玩家的牌被删除完。显示提示语
“cout<<"输入要删除第几个人的牌: "<<endl;”,用户输入数据;
再提示“cout<<"输入要删除第几张牌: "<<endl;”,用户再输入
数据。用ShowC ard函数、Change函数处理,然后用for语句显示剩
余的牌。
(4)、课程设计要求,洗牌并分牌之后,删除牌和显示牌的操作都要在新生成的牌中进行,怎样进行该操作?
解决办法:
将洗好的牌分给玩家是用一个二维数组PlayingCa rd card[4][13];装
四个玩家的牌,在操作时直接对二维数组进行操作。
7、设计中尚存的不足
删除牌后,最后一张的地方总是会显示一个问号。
8、程序设计过程的心得体会
通过本次C++程序设计,虽然各种错误总是层出不穷,可是解决问题的过程真的就是一个不断学习、不断进步的过程。经过上学期对C++的初步学习,了解到了关于计算机编程方面的一些初步知识,一个细微的地方便会导致一大堆的错误,不管是一个英文大小写,还是一个分号没有加,又或者是中英文的标点符号,总之,C++的编程,除了掌握扎实全面的专业知识外,最最重要的就是两个字,细心了。
从一开始的一步步将课本上的源程序及原始注释敲进电脑,到后来却哑然发现课本管盘中本来就有源程序,到最后慢慢发现问题,然后一个一个的解决,再到后来,能利用自己的知识为程序添加新的功能,我感觉得到自己真的学到了很多。很多程序部分自己读不懂,就一遍一遍的问同学,去图书馆查资料。好像困难越大自己就越有斗志和欲望一定将困难解决,内心就一直
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论