南京理工大学C++课程设计扑克游戏.docx
《南京理工大学C++课程设计扑克游戏.docx》由会员分享,可在线阅读,更多相关《南京理工大学C++课程设计扑克游戏.docx(23页珍藏版)》请在冰豆网上搜索。
南京理工大学C++课程设计扑克游戏
南京理工大学C++课程设计—扑克游戏
C++课程设计实验报告
姓名郑星鑫学号913104210332班级9131042103任课教师赵琦时间4月12日
选择题目扑克牌游戏难易级别A级
实验报告成绩
一、程序功能简介
创建一副扑克牌,并完成洗牌等操作。
二.课程设计要求和目的
1.增加大王和小王。
2.删去一张指定的扑克后,余牌显示。
3.创建一副扑克,显示一副扑克,洗牌,依次发给四个人并显示。
4.需要对原程序做一些修改,保留生成牌和洗牌的部分,主要是修改main函数的结构,依次为:
生成牌,洗牌,发牌,然后循环显示菜单,询问是否删除一张,删除一轮,面值排序,花色排序等,在main函数中定义所生成的那副牌,并将其作为参数(对象引用),所有新增类的操作均以那副牌作为数据进行运算。
三.课程设计中要解决的问题分析和调试
1.首先,去掉源程序的注释,以免修改程序时自己的注释与源文件注释混淆,便于找出修改程序时可能产生的错误。
2.添加大小王:
修改类Deck,将一副扑克牌对象内的扑克牌个数增加两张,对这两张牌的面值及花色分别赋值“S”1(小王),“B”2(大王)。
3.游戏中四个人玩牌,要新建两个类:
Per_Deck类表示某个人拿的牌,Play_Deck类表示四个人玩牌的过程。
Perdeck是Deck和PlayDeck的友元类。
classPer_Deck
{
public:
Playing_Cardm_Card[20];//最多有20张牌
intnNum;//实际张数
Per_Deck();//构造函数
voidMakePerDeck(Deck&,int,int);//对象初始化
voidShow();//显示
voidSortFace();//按面值排序
voidSortSuit();//按花色排序
intDelete(intn);//删除牌号为n的那张
};
//**************************四个人玩牌的过程*******************
classPlay_Deck
{
public:
Per_Deckm_deck[4];//一共是四个人玩牌
Play_Deck();//构造函数
voidPlayCard(Deck&);//用指定的那副牌对四个人分别赋值
voidShow();//显示
intDeleteOne(introw,intcolumn);//删除参数为第row个人的第column张牌
voidSortDeckFace();//对整副牌面值排序
voidSortDeckSuit();//对整副牌花色排序
ints(inta);//用于调用私有数据来显示排序后的牌
};
4.添加人性化界面,初始运行程序时加了一个友好的界面,用p,u,k,e这四个字母拼成了中文的”扑克”二字,增加游戏的趣味性,并附带输出了自己的姓名和学号。
5.在主函数中调用DeckMakeDriver()函数,通过DeckMakeDriver()中的一个do循环控制主菜单的循环出现,并对可能出现的玩家输入问题进行分析修改。
5.进入四个不同功能的游戏界面时,操作后询问是否显示被操作后的牌,再询问是否返回主菜单,否的话退出游戏。
6.在对玩家的牌的面值以及花色排序时,在类PlayDeck()中增加ints()函数,用于调用私有数据来显示排序完后的牌。
四、源程序结构流程框图与说明
开始
生成一副新牌
输入洗牌次数进行洗牌
依次输入给四位玩家的牌并显示
主菜单
1删除某位玩家一张牌
是否显示牌
显示被操作后的牌
是否回主菜单
是
是
2删除各位玩家一张牌
是否显示牌
显示被操作的牌
是否回主菜单
是
是
4按玩家牌的花色排序
是否显示牌
显示操作后的牌
是
是否回主菜单
是
按玩家牌的面值排序
是否显示牌
显示操作后的牌
是否回主菜单
是
结束
5显示各位玩家的牌
五.源程序代码以及草稿原件
#include
#include
#include
#include
#include
#include
voidProgram_Init();
intmain();
voidCenter_Text(char[]);
intget_number();
charGet_Key();
voidDeckMakeDriver();
intgetRandInt(intmin,intmax);
voidprog_close();
classPerDeck;//增加
classPlaying_Card
{
private:
intm_Value;
charm_Face[3];
charm_Suit;
public:
Playing_Card();
voidshowcard();
voidCard_Make(int);
friendclassPerDeck;//增加
};
classDeck
{
private:
Playing_Cardm_cardarray[54];//
intm_lastdelt;
public:
Deck();
voidMakeDeck();
voidDeal_One();
voidShowDeck();
voidDeckShuff(int);
voidRemove_Card();
friendclassPerDeck;//增加
};
classPerDeck//增加PerDeck
{
Playing_CardmCard[20];
intnNum;
public:
PerDeck(){}
voidMakePerDeck(Deck&,int);
voidShow();
voidSortFace();
voidSortSuit();
intDelete(intn);
};//end
classPlayDeck//增加PlayDeck
{
PerDeckmDeck[4];
public:
PlayDeck(){}
voidPlayCard(Deck&);
voidShow();
intDeleteOne(introw,intcolumn);
intDeleteAll(int,int,int,int);
voidSortDeckFace(int);
voidSortDeckSuit(int);
voids(int);
};//end
voidPerDeck:
:
MakePerDeck(Deck&d,inta)//PerDeck成员的函数
{
nNum=a;
inti=0;
while(i=53)
mCard[i++]=d.m_cardarray[++d.m_lastdelt];
}
voidPerDeck:
:
Show()
{
intnNewLine=0;
Center_Text("此玩家的牌:
");
cout<while(nNewLine{
if(nNewLine%5==0)cout<mCard[nNewLine++].showcard();
}
cout<}
voidPerDeck:
:
SortFace()
{
Playing_Cardk;
for(inti=0;ifor(intj=0;jif(mCard[j].m_Value>mCard[j+1].m_Value)
{
k=mCard[j];
mCard[j]=mCard[j+1];
mCard[j+1]=k;
}
}
voidPerDeck:
:
SortSuit()
{
Playing_Cardk;
for(inti=0;ifor(intj=0;jif(mCard[j].m_Suit>mCard[j+1].m_Suit)
{
k=mCard[j];
mCard[j]=mCard[j+1];
mCard[j+1]=k;
}
}
intPerDeck:
:
Delete(intn)
{
if(n>nNum)
{
cout<<"超出这副牌张数"<returnnNum;
}
else
{
cout.width(5);
cout<<"删除牌:
";
mCard[n-1].showcard();
while(n-1mCard[n-1]=mCard[n++];
}
return--nNum;
}//end
voidPlayDeck:
:
PlayCard(Deck&k)//PlayDeck的成员函数
{
inta,b,c,d;
Center_Text("请依次输入给四位玩家的牌数(总张数小于等于54)。
");
cout<cin>>a>>b>>c>>d;
if(a+b+c+d>54)
{
Center_Text("张数超过牌的张数,退出游戏。
");
exit(0);
}
mDeck[0].MakePerDeck(k,a);
mDeck[1].MakePerDeck(k,b);
mDeck[2].MakePerDeck(k,c);
mDeck[3].MakePerDeck(k,d);
}
voidPlayDeck:
:
Show()
{
Center_Text("玩家1");
cout<mDeck[0].Show();
Center_Text("玩家2");
cout<mDeck[1].Show();
Center_Text("玩家3");
cout<mDeck[2].Show();
Center_Text("玩家4");
cout<mDeck[3].Show();
}
intPlayDeck:
:
DeleteOne(introw,intcolumn)
{
mDeck[row-1].Delete(column);
return1;
}
intPlayDeck:
:
DeleteAll(inta,intb,intc,intd)
{
mDeck[0].Delete(a);
mDeck[1].Delete(b);
mDeck[2].Delete(c);
mDeck[3].Delete(d);
return1;
}
voidPlayDeck:
:
SortDeckFace(intb)
{
mDeck[b-1].SortFace();
}
voidPlayDeck:
:
SortDeckSuit(intb)
{
mDeck[b-1].SortSuit();
}
voidPlayDeck:
:
s(inta)
{
mDeck[a-1].Show();
}//endl
intmain()
{
srand((unsigned)time(NULL));
intCard_Number=0;
Program_Init();
DeckMakeDriver();
prog_close();
return1;
}
Playing_Card:
:
Playing_Card()
{
inti;
for(i=1;i<=3;)
{
m_Face[i]='';
i++;
}
m_Suit='';
m_Value=0;
}
voidProgram_Init()
{
Center_Text("扑克牌游戏");
cout<Center_Text("byYoriFish");
Center_Text("单击继续");
cin.get();
}
charGet_Key()
{
charx;
x=cin.get();
cout<returnx;
}
voidPlaying_Card:
:
showcard()
{
cout<<"";
cout<cout.width
(1);
cout<cout<<"";
}
voidCenter_Text(charShellText[80])
{
intlength;
intcenter;
length=strlen(ShellText);
center=(80-length)/2;
for(;center!
=0;center--)
{
cputs("");
}
cputs(ShellText);
cout<}
intget_number()
{
intInput_Integer=0;
Center_Text("Pleaseenteranintegerbetween0and53.54toquit.");//
cout<cin>>Input_Integer;
returnInput_Integer;
}
voidPlaying_Card:
:
Card_Make(intnum)
{
inti=0;
charj;
intface_num=num%13;
if(num/13==4)//增加
{
switch(face_num)
{
case0:
strcpy(m_Face,"S");break;
case1:
strcpy(m_Face,"B");break;
}
}
else//增加
switch(face_num)
{
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);
if(i<3)
{
m_Face[i]='';i++;
m_Face[i]=j;i++;
m_Face[i]=NULL;
break;
}
}
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>51)m_Value=14;
else
m_Value=face_num+1;
}
voidDeckMakeDriver()
{
Deckdeck_1;
deck_1.MakeDeck();
deck_1.ShowDeck();
Get_Key();
intb;//增加
Center_Text("请输入洗牌次数。
");
cin>>b;//end
deck_1.DeckShuff(b);
deck_1.ShowDeck();
cout<chary;
PlayDeckfour;//增加
four.PlayCard(deck_1);
cout<four.Show();
inta=0;
do
{
Center_Text("**********************************");
Center_Text("主菜单");
Center_Text("删除某位玩家一张牌请输入1");
Center_Text("删除各位玩家一张牌请输入2.");
Center_Text("按玩家的牌面值排序请输入3.");
Center_Text("按玩家的牌花色排序请输入4.");
Center_Text("显示各位玩家的牌面请输入5.");
Center_Text("**********************************");
cin>>a;
if(a==1)
{
intb,c;
chary;
cout<<"请输入要删除第几位玩家的第几张牌。
"<cin>>b>>c;
four.DeleteOne(b,c);
cout<"<cin>>y;
y=toupper(y);
if(y=='Y')four.s(b);
cout<}
if(a==2)
{
intb,c,d,e;
chary;
cout<<"请依次输入欲删除各玩家牌的序号。
"<cin>>b>>c>>d>>e;
four.DeleteAll(b,c,d,e);
cout<"<cin>>y;
y=toupper(y);
if(y=='Y')four.Show();
cout<}
if(a==3)
{
intb;
chary;
cout<<"请输入要对那位玩家排序"<cin>>b;
four.SortDeckFace(b);
cout<<"是(Y)否(N)显示排序后的牌?
"<cin>>y;
y=toupper(y);
if(y=='Y')four.s(b);
}
if(a==4)
{
intb;
chary;
cout<<"请输入要对那位玩家排序"<cin>>b;
four.SortDeckSuit(b);
cout<<"是(Y)否(N)显示排序后的牌?
"<cin>>y;
y=toupper(y);
if(y=='Y')four.s(b);
}
if(a==5)
{
four.Show();
}
cout<<"是(Y)否(N)回到菜单?
"<cin>>y;
y=toupper(y);
}while(y=='Y');
}//end
voidDeck:
:
MakeDeck()
{
m_lastdelt=53;//
while(m_lastdelt>-1)
{
m_cardarray[m_lastdelt].Card_Make(m_lastdelt);
m_lastdelt--;
}
}
voidDeck:
:
ShowDeck()
{
intindex=m_lastdelt+1;
intnewline=0;
Center_Text("新的一副牌");
cout<while(index<=53)//
{
if(newline%11==0)cout<m_cardarray[index].showcard();
newline++;
index++;
}
}
intgetRandInt(intmin,intmax)
{
intnumToReturn;
numToReturn=rand();
numToReturn=numToReturn%(max-min+1)+min;
returnnumToReturn;
}
voidDeck:
:
DeckShuff(inttimes)
{
intx,split;
Center_Text("洗牌");
cout<for(x=0;x<=times;x++)
{
split=getRandInt(20,35);
Decktopdeck;
Deckbottomdeck;
inti;
intbottomdeckindex=1;
inttopdeckindex=1;
for(i=0;i<=split-1;)
{
topdeck.m_cardarray[topdeckindex]=this->m_cardarray[i];
topdeckindex++;
i++;
}
for(i=(split);i<54;)//
{
bottomdeck.m_cardarray[bottomdeckindex]=this->m_ca