扑克牌游戏 设计报告.docx
《扑克牌游戏 设计报告.docx》由会员分享,可在线阅读,更多相关《扑克牌游戏 设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
扑克牌游戏设计报告
VC++课程设计报告
(扑克牌游戏难度等级:
A)
程序设计者:
指导教师:
1.课程设计的解答说明
创建一副扑克,并完成洗牌、发牌、显示、花色排序、面值排序、删除一张牌、删除一轮牌等操作。
本程序新建了PerDeck和PlayDeck两个类,类PerDeck表示某个人拿的牌,类PlayDeck表示四个人玩牌的过程,对原程序的修改较小。
程序中用到了包含在头文件stdlib.h中的函数srand(),用来初始化随机数种子,以使每次执行程序时函数rand()产生不同的随机数,从而使程序每次产生不同的运行结果,用到了包含在头文件time.h中的函数time(),用到了包含在头文件conio.h中的函数getch()用来接收用户从键盘键入的任意键,以起到暂停程序供用户查看运行结果的作用,还用到了包含在头文件stdlib.h中的函数system(),其参数为字符串,字符串cls代表清屏操作。
2.课程设计的任务分解
为了完成要求
(1)增加大小王,须将类Deck中的成员数据m_cardarray[]由52增加到54,用来创建一副包含大小王在内54张牌的扑克,并在创建扑克时为大小王重新赋值,如果num=52,则这张牌为小王并将这张牌的花色赋为1,面值赋为S,实际面值赋为14。
如果num=53,则这张牌为大王并将这张牌的花色赋为2,面值赋为B,实际面值赋为15。
为了完成要求
(2)删去一张牌后显示余牌,需先定义intDeleteAll(int,int,int,int)、intDeleteOne(int,int)、intDelete(int)和voidPerDeck:
:
Show()、voidPlayDeck:
:
Show()函数,并在程序执行期间调用intDeleteAll(int,int,int,int)、intDeleteOne(int,int)、intDelete(int)函数后调用voidPerDeck:
:
Show()、voidPlayDeck:
:
Show()函数。
为了完成要求(3)显示一副扑克,需在原来的基础上把函数ShowDeck()改成显示54张牌,洗牌函数也应改成对54张牌进行洗牌,用函数voidPlayCard(Deck&)来给玩家发牌,并调用函数voidPerDeck:
:
Show()、voidPlayDeck:
:
Show()显示玩家牌面。
3.课程设计的新增函数
voidPerDeck:
:
MakeperDeck(Deck&,int)
函数用来给每个玩家发牌,给第一个玩家和第二个玩家发14张牌,第三和第四个玩家发13张牌,其整型参数是发给玩家牌的张数,另一个引用参数是洗好的那副牌的对象,用来给玩家发牌。
voidPerDeck:
:
Show()
函数用来显示当前玩家手中的牌。
intPerDeck:
:
Delete(int)
函数用来删除一张牌
voidPerDeck:
:
SortFace()
函数用来把玩家手中的牌进行面值排序
voidPerDeck:
:
SortSuit()
函数用来把玩家手中的牌进行花色排序
PerDeck:
:
PerDeck(){}
类PerDeck的构造函数
voidPlayDeck:
:
PlayCard(Deck&)
函数用来调用函数MakeperDeck(Deck&,int)给玩家发牌,参数为洗好的那副牌的对象的引用。
voidPlayDeck:
:
Show()
用来显示四个玩家手中的牌。
intPlayDeck:
:
DeleteAll(int,int,int,int)
用来删除一轮牌,参数分别为四个玩家的第几张牌。
intPlayDeck:
:
DeleteOne(int,int)
用来删除一张牌,参数分别为第几个玩家的第几张牌。
voidPlayDeck:
:
SortDeckFace()
完成对四个玩家手中的牌按面值排序。
voidPlayDeck:
:
SortDeckSuit()
完成对四个玩家手中的牌按花色排序。
PlayDeck:
:
PlayDeck(){}
类PlayDeck的构造函数
4.课程设计的源代码实现及详细注解
#include
#include
#include
#include
#include
#include
classPlaying_Card/*扑克牌类,表示一张扑克牌的面值、花色和与之相联系的操作*/
{
private:
intm_Value;//扑克的实际面值,用整型值表示,从1开始,1~13
charm_Face[3];/*扑克的数字大小,用字符串的形式表示,为
A,2,3,…,10,J,Q,K*/
charm_Suit;//扑克的花色(黑、红、梅、方)
public:
Playing_Card();//构造函数,初始化扑克对象,实际上是将对象清零
voidshowcard();//显示扑克牌对象的面值,花色
voidCard_Make(int);//为一张扑克牌对象赋予特定的面值和花色
friendclassPerDeck;//定义类PerDeck为类Playing_Card的友元类
};
classDeck//一副扑克(54张)类
{
private:
Playing_Cardm_cardarray[54];//一副扑克由54张扑克牌构成
intm_lastdelt;//标记这副扑克牌删除的张数
public:
Deck();/*构造函数,初始化一副扑克牌对象,实际上是将其内的
54张扑克牌清零*/
voidMakeDeck();/*生成一副扑克,即对其内的54张扑克赋予正确
的面值及花色*/
voidShowDeck();//依次逐张显示这副牌
voidDeckShuff(int);//洗牌,其参数是洗牌的次数
voidRemove_Card();/*将删除的那张扑克牌的内容清零,使这张牌在
屏幕上显示不出来*/
friendclassPerDeck;//定义类PerDeck为类Deck的友元类
};
classPerDeck
{
Playing_Cardm_Card[20];//最多有20张牌
intnNum;//实际张数
public:
PerDeck(){}
voidMakeperDeck(Deck&,int);/*对象初始化,参数为指定的那副牌
及实际赋值个数*/
voidShow();//显示
voidSortFace();//按面值排序
voidSortSuit();//按花色排序
intDelete(intn);//删除序号为n的那一张
};
voidPerDeck:
:
MakeperDeck(Deck&deck_3,intn)
{
nNum=n;//初始化当前对象的实际张数
staticinti=0;//标记为每个人发牌的其始位置
for(intk=0;k//用创建好的那副牌为当前对象发牌
i+=nNum;//为一个人发牌后起始位置向后跳nNum个
}
voidPerDeck:
:
Show()//显示玩家的牌面
{
intj=0;
if(nNum==0)cout<<"已无牌!
"<else
{
for(inti=0;i{
if(j%11==0)cout<m_Card[i].showcard();
j++;
}
}
}
intPerDeck:
:
Delete(intn)
{
if(n>=nNum)return0;//判断是否删牌
else
{
for(inti=n;inNum--;//删除一张牌后将实际张数减1
return1;
}
}
voidPerDeck:
:
SortFace()//按面值排序
{
Playing_Cardrecord;//产生一个临时对象
for(intj=0;jfor(inti=j+1;iif(m_Card[j].m_Value>m_Card[i].m_Value)
{record=m_Card[i];m_Card[i]=m_Card[j];m_Card[j]=record;}
}
voidPerDeck:
:
SortSuit()//按花色排序
{
Playing_Cardrecord;//产生一个临时对象
for(intj=0;jfor(inti=j+1;iif(m_Card[j].m_Suit>m_Card[i].m_Suit)
{record=m_Card[i];m_Card[i]=m_Card[j];m_Card[j]=record;}
}
classPlayDeck
{
PerDeckm_deck[4];//一共是四个人玩牌
public:
PlayDeck(){}
voidPlayCard(Deck&);//用指定的那副牌对四个人分别赋值
voidShow();//显示
intDeleteOne(introw,intcolumn);/*删除一张,参数为第row个人的第
column张牌*/
intDeleteAll(int,int,int,int);/*删除一轮,参数分别代表四个人删
除哪一张*/
voidSortDeckFace();//对整副牌面值排序
voidSortDeckSuit();//对整副牌花色排序
};
voidPlayDeck:
:
PlayCard(Deck&deck_2)//给四个人发牌
{
for(inti=0;i<2;i++)m_deck[i].MakeperDeck(deck_2,14);
//前两个人发14张牌
for(intj=2;j<4;j++)m_deck[j].MakeperDeck(deck_2,13);
//后两个人发13张牌
}
voidPlayDeck:
:
Show()//显示四个玩家的牌
{
for(inti=0;i<4;i++)
{
cout<cout<<"玩家"<
";
m_deck[i].Show();
}
cout<}
intPlayDeck:
:
DeleteOne(introw,intcolumn)/*删除一张,参数为第row
个人的第column张牌*/
{returnm_deck[row-1].Delete(column-1);}
intPlayDeck:
:
DeleteAll(inta,intb,intc,intd)/*删除一轮,参数分
别代表四个人各删除哪一张*/
{
returnm_deck[0].Delete(a-1)+m_deck[1].Delete(b-1)
+m_deck[2].Delete(c-1)+m_deck[3].Delete(d-1);
}
voidPlayDeck:
:
SortDeckFace()//将四个人的牌按面值排序
{
m_deck[0].SortFace();
m_deck[1].SortFace();
m_deck[2].SortFace();
m_deck[3].SortFace();
}
voidPlayDeck:
:
SortDeckSuit()//将四个人的牌按花色排序
{
m_deck[0].SortSuit();
m_deck[1].SortSuit();
m_deck[2].SortSuit();
m_deck[3].SortSuit();
}
voidProgram_Init();//程序初始化,输出初始化信息
intmain();
voidCenter_Text(char[]);/*将参数(字符串)在屏幕上显示在一行的中
间位置*/
voidGet_Key();//接收用户键入的字符
voidDeckMakeDriver();/*程序的主要算法,内部调用多个函数,包括生成
扑克牌,洗牌,删除,排序等主要操作*/
intgetRandInt(intmin,intmax);//取得在两参数间的整型随机值
voidprog_close();//暂停程序运行,供用户查看中间运行结果
intmain()
{
srand((unsigned)time(NULL));//初始化随机数种子
Program_Init();//显示程序初始化提示信息
DeckMakeDriver();//调用程序的主要算法,包含程序的主要操作过程
prog_close();//暂停程序运行,供用户查看运行结果
return1;
}
Playing_Card:
:
Playing_Card()//扑克牌对象的构造函数
{
inti;
for(i=0;i<3;)//初始化扑克牌的面值,清零
{
m_Face[i]='';
i++;
}
m_Suit='';//初始化扑克牌的花色,清零
m_Value=0;
}
voidProgram_Init()//程序一开始运行的提示信息
{
Center_Text("扑克牌游戏\n");
Center_Text("程序设计:
");
cout<Get_Key();
}
voidGet_Key()//从键盘接收用户键入的字符
{
cout<Center_Text("单击任意键继续...");
getch();
cout<}
voidPlaying_Card:
:
showcard()//在屏幕上显示一张扑克牌的面值及花色
{
cout<<"";
cout<cout.width
(1);
cout<cout<<"";
}
voidCenter_Text(charShellText[80])/*将函数参数(字符串)在屏幕上
居中显示*/
{
intlength;
intcenter;
length=strlen(ShellText);//取得欲显示字符串的大小
center=(80-length)/2;/*整个屏幕的列数为80,取得字符串在该
行的其始位置*/
for(;center!
=0;center--)//在字符串前输出空格
{
cputs("");
}
cputs(ShellText);
}
voidPlaying_Card:
:
Card_Make(intnum)/*根据参数num生成一张扑克
牌,num不同,生成的面值或花色不同*/
{
inti=0;
charj;
intface_num=num%13;//扑克牌的面值,从0到12
if(num==52)strcpy(m_Face,"S");//大王花色赋为S
elseif(num==53)strcpy(m_Face,"B");//小王花色赋为B
else
{
switch(face_num)//当面值大于10时,用J,Q,K代替,面值为0,用A代替
{
case0:
strcpy(m_Face,"A");break;
case9:
strcpy(m_Face,"10");break;
case10:
strcpy(m_Face,"J");break;
case11:
strcpy(m_Face,"Q");break;
case12:
strcpy(m_Face,"K");break;
default:
j=char(face_num+49);//其它的面值,用对应的ASCII码表示
if(i<3)
{
m_Face[i]='';i++;
m_Face[i]=j;i++;
m_Face[i]=NULL;
break;
}
}
}
//扑克牌的花色,分别用红桃,黑桃,梅花,方块的ASCII码替代
if(num<=12)m_Suit=6;//红桃
if(num>12&&num<=25)m_Suit=3;//黑桃
if(num>25&&num<=38)m_Suit=5;//梅花
if(num>38&&num<=51)m_Suit=4;//方块
if(num==52)m_Suit=1;//小王
if(num==53)m_Suit=2;//大王
if(num==52)m_Value=14;//小王面值赋为14
elseif(num==53)m_Value=15;//大王面值赋为15
elsem_Value=face_num+1;/*A的面值实际上用1表示,其余面值
依次加1*/
}
voidDeckMakeDriver()/*主要程序操作部分,调用多个函数,完成生成一副
牌,洗牌,显示,删除等操作*/
{
Deckdeck_1;/*生成一副扑克牌对象,内有54张牌,此时所有的扑
克牌均未赋值*/
PlayDeckman;//产生一局牌
deck_1.MakeDeck();//对54张扑克牌赋值
deck_1.ShowDeck();//逐一显示这54张牌
Get_Key();//暂停运行,供用户查看显示结果
system("cls");//清屏
deck_1.DeckShuff(250);//对生成的这副牌洗牌250次
deck_1.ShowDeck();//逐一显示这洗好的54张牌
Get_Key();//暂停运行,供用户查看显示结果
system("cls");//清屏
man.PlayCard(deck_1);//发牌
intMemory=0;
for(;;)
{
man.Show();//显示四个人的牌
Center_Text("******菜单******\n");
Center_Text("*1:
删除一张牌*\n");
Center_Text("*2:
删除一轮牌*\n");
Center_Text("*3:
花色排序*\n");
Center_Text("*4:
面值排序*\n");
Center_Text("*5:
退出程序*\n");
Center_Text("****************\n");
cout<<"请选择菜单里对应功能的一个整数:
\n";
intn;
charstr[30];
aa:
cin>>n;
cin.getline(str,30);
if(strlen(str)>=1)
{
cout<<"输入错误,请重新输入:
"<gotoaa;
}
if(!
cin)
{
charstr[30];
cin.clear();
cin.getline(str,30);
cout<<"输入错误,请重新输入:
"<gotoaa;
}
switch(n)//判断执行的操作
{
case1:
//执行删除一张牌的操作
inta,b;
charstr[30];
bb:
cout<<"请输入删除第几个人的第几张牌"<cin>>a>>b;
cin.getline(str,30);
if(strlen(str)>=2)
{
cout<<"输入错误,请重新输入:
"<gotobb;
}
while(!
cin)
{
charstr[30];
cin.clear();
cin.getline(str,30);
cout<<"输入错误,请重新输入:
"<gotobb;
}
Memory+=man.DeleteOne(a,b);
break;
case2:
//执行删除一轮牌的操作
intc,d,e,f;
charstr1[30];
cc:
cout<<"请依次输入删除四个人的第几张牌"<cin>>c>>d>>e>>f;
cin.getline(str1,30);
if(strlen(str1)>=2)
{
cout<<"输入错误,请重新输入:
"<gotocc;
}
while(!
cin)
{
charstr[30];
cin.clear();
cin.getline(str,30);
cout<<"输入错误,请重新输入:
"<gotocc;
}
Memory+=man.DeleteAll(c,d,e,f);
break;
case3:
man.SortDeckSuit();//执行按花色排序
break;
case
4:
man.SortDeckFace();//执行按面值排序
break;
case5:
exit(0);//执行退出程序
default:
cout<<"输入错误,请重新输入:
"<gotoaa;
}
system("cls");//清屏
if(Memory==54)break;//判断循环结束条件
}
cout<}
voidDeck:
:
Mak