完整word版C++课程设计扑克牌游戏.docx
《完整word版C++课程设计扑克牌游戏.docx》由会员分享,可在线阅读,更多相关《完整word版C++课程设计扑克牌游戏.docx(25页珍藏版)》请在冰豆网上搜索。
完整word版C++课程设计扑克牌游戏
//*******************preprocessordirectives***********************
#include
#include
#include
#include
#include
#include
//usedtoseedtherandomnumbergenerator
//*******************************扑克类****************************************
classPlaying_Card
{
friendclassPerDeck;
public:
intm_Value;//扑克的实际面值,用整型值表示,从1开始,1~13
charm_Face[3];//扑克的数字大小,用字符串的形式表示,为A,2,3,....,10,J,Q,K
intorder;
charm_Suit;//扑克的花色(黑、红、梅、方)
public:
Playing_Card();//构造函数,初始化扑克牌对象,实际上是将对象清零
voidshowcard();//显示扑克牌对象的面值,花色
voidCard_Make(int);//为一张扑克牌对象赋予特定的面值和花色
voidAskPaidui();//询问是否进行扑克小人游戏
voidPaidui();//扑克小人排序游戏
intgetCount();
};
//***************************一副扑克(54张)**************************
classDeck
{
friendclassPerDeck;
friendclassPlayDEck;
public:
Playing_Cardm_cardarray[54],temp;//一副扑克牌有54张扑克牌组成(包括大小王)
intm_lastdelt;//标记这副扑克牌删除的张数
public:
Deck();//构造函数,初始化一副扑克牌对象,实际上是将其内的54张扑克牌清零
voidMakeDeck();//生成一副扑克,即对其内的54张扑克牌赋予正确的面值及花色
voidShowDeck();//显示余下的所有的扑克牌
voidDeckShuff(int);//洗牌,其参数是洗牌的次数
//voidRemove_Card();//将删除的那张扑克牌的内容清零,使这张牌在屏幕上显示不出来
};//mistakenlyusinganonexistantcard
//canbuusedtosendacard?
?
//************************某个人拿的牌******************************
classPerDeck
{
public:
Playing_Cardm_Card[20],temp;//最多有20张牌
intnNum;//实际张数
PerDeck(){}
voidMakePerDeck(Deck&,int);//对象初始化,参数为指定的那副牌及实际赋值个数
voidShow();//显示
voidSortFace();//按面值排序
voidSortSuit();//按花色排序
voidDelete(intn);//删除序号为n的那一张
};
//*********************************四个人玩牌的过程****************************************
classPlayDeck
{
public:
PerDeckm_deck[4];//一共是4个人玩牌
intdelt,sort;
public:
PlayDeck(){}
voidPlayCard(Deck&);//用指定的那副牌对四个人分别赋值
voidShowAll();//显示
voidDeleteOne(introw,intcolumn);//删除一张,参数为第row个人的第column那一张
voidDeleteAll(int,int,int,int);//删除一轮,参数分别代表4个人各删除哪一张
voidSortDeckFace();//对整副牌按面值排序
voidSortDeckSuit();//对整副牌按花色排序
voidAskSort();//询问排序方法
voidAskDelete();//询问删除方法
intget_int();//获得一个整数
};
//*************************************************
//***************************prototypes**********************************
voidProgram_Init();//程序初始化,输出初始化信息
intmain();
voidCenter_Text(char[]);//将参数(字符串)显示在屏幕的中间
intget_number();//接收用户输入的数值,作为函数值返回
intchoose_number();//判断选择是删除一张还是一轮的办法
charGet_Key();//获得一个字符,作为函数值返回
voidDeckMakeDriver();//主要算法,调用多个函数,执行声成牌,洗牌删除等操作
intgetRandInt(intmin,intmax);//取得两参数见的随机值
voidprog_close();//暂停程序运行,查看中间运行结果
charcontinue_quit();
//****************************Main*************************************
intmain()
{
srand((unsigned)time(NULL));//初始化随机数种子
intCard_Number=0;
Program_Init();//显示程序初始化信息
DeckMakeDriver();//调用函数的主要算法,包含程序的主要操作过程
prog_close();//暂停程序的运行,供用户查看运行结果
return1;//结束
}
Deck:
:
Deck()//初始化一副牌,将54张牌清零
{
intlastdelt=0;
inti;
for(i=0;i<=53;i++)
{
m_cardarray[i]=Playing_Card();//构造一个临时对象赋值
}
}
voidDeck:
:
DeckShuff(inttimes)//洗牌,参数为次数
{
intx,split;//split是分开成两部分的位置,如上部分、下部分
Center_Text("开始洗牌……");
cout<for(x=0;x<=times;x++)//开始循环,每循环一次将牌全部重排一遍
{
split=getRandInt(20,35);//随机选取split的值
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_cardarray[i];
bottomdeckindex++;
i++;
}
intdeckoutindex=0;
intnumcardstomovetop;
intnumcardstomovebottom;
intj;
inth=0;
bottomdeckindex=54-split;//下部分扑克牌的张数
topdeckindex=split;//上部分扑克牌的张数
while(deckoutindex<=53)
{
numcardstomovetop=getRandInt(2,7);//从上部分抽取的张数,是2-7之间的随机数
numcardstomovebottom=getRandInt(2,7);//在下部分扑克牌中随机选择2~7之间的随机数
/*将下部分的牌赋值给原来的那副牌*/
for(j=0;j<=numcardstomovebottom;j++)//从0开始循环numcardstomovebottom次
{
if(bottomdeckindex>0)//当下部分那副牌没有循环完时继续
{/*从下部分那副牌的最后张数开始,依次向c初始的扑克牌赋值*/
this->m_cardarray[deckoutindex]=bottomdeck.m_cardarray[bottomdeckindex];
deckoutindex++;
bottomdeckindex--;
}
for(h=0;h<=numcardstomovetop;h++)//下部分的扑克牌赋值完成后,对上部分的牌进行同样的操作
{
if((topdeckindex>0)&&(deckoutindex<=54))
{
this->m_cardarray[deckoutindex]=topdeck.m_cardarray[topdeckindex];
deckoutindex++;
topdeckindex--;
}
}
}
}
}
Center_Text("完成洗牌");
cout<this->m_lastdelt=-1;//将删除牌的张数复原为-1(未删除)
}
voidDeck:
:
MakeDeck()//对一副牌逐一赋值
{
m_lastdelt=53;//赋初值,该值作为生成每张扑克牌的参数
while(m_lastdelt>-1)//判断是不是生成了54张牌
{
m_cardarray[m_lastdelt].Card_Make(m_lastdelt);//调用Card——Make,对牌赋值,完成一副牌
m_lastdelt--;//生成一张牌后改变生成的参数
}
}
voidDeck:
:
ShowDeck()//显示一副扑克牌牌
{
intindex=m_lastdelt+1;//以此位置为第一张牌,从头显示这副牌
Center_Text("完整的一副牌");
cout<while(index<=53)
{
if(index%11==0)cout<m_cardarray[index].showcard();//按数组的顺序依次显示
index++;
}
cout<}
voidPerDeck:
:
Delete(intn)//删除序号为n的那张牌
{
n--;
temp=m_Card[n];
for(n;nm_Card[n]=m_Card[n+1];
m_Card[nNum]=Playing_Card();
nNum-=1;
}
voidPerDeck:
:
MakePerDeck(Deck&,intnNum)//对象初始化
{}
voidPerDeck:
:
Show()//显示
{
inti=0;
for(i;i{
if(i==10)
cout<m_Card[i].showcard();
}
cout<}
voidPerDeck:
:
SortFace()//按面值排序
{
inti,j=0;
for(j;j{
for(i=0;i{
if(m_Card[i].m_Value>m_Card[i+1].m_Value)
{
temp=m_Card[i];
m_Card[i]=m_Card[i+1];
m_Card[i+1]=temp;
}
}
}
}
voidPerDeck:
:
SortSuit()//按花色排序
{
inti,j=0;
for(j;j{
for(i=0;i{
if(m_Card[i].m_Suit>m_Card[i+1].m_Suit)
{
temp=m_Card[i];
m_Card[i]=m_Card[i+1];
m_Card[i+1]=temp;
}
}
}
}
voidPlayDeck:
:
AskDelete()//询问删除方法
{
cout<cout<<"删除一张,请选择1;"<cout<<"删除一轮,请选择2;"<cout<<"退出,选择3;"<delt=get_int();
switch(delt)
{
case1:
Center_Text("输入要删除第row人的第column张牌");
cout<<"输入row,column,用空格隔开:
";
introw,column;
cin>>row>>column;
if(row>0&&row<5)
{
if(column>0&&column<=m_deck[row-1].nNum)
{
DeleteOne(row,column);
break;
}
elsePlayDeck:
:
AskDelete();
}
elsePlayDeck:
:
AskDelete();
case2:
Center_Text("依次输入要删除4个人的第a,b,c,d张牌");
cout<<"输入a,b,c,d,用空格隔开"<inta,b,c,d;
cin>>a>>b>>c>>d;
if(a>0&&a<=m_deck[0].nNum)
{
if(b>0&&b<=m_deck[1].nNum)
{
if(c>0&&c<=m_deck[2].nNum)
{
if(d>0&&d<=m_deck[3].nNum)
{
DeleteAll(a,b,c,d);
break;
}
elsePlayDeck:
:
AskDelete();
}
elsePlayDeck:
:
AskDelete();
}
elsePlayDeck:
:
AskDelete();
}
elsePlayDeck:
:
AskDelete();
case3:
exit(0);
default:
Center_Text("输入错误,请选择一种删除方法或退出");
PlayDeck:
:
AskDelete();
}
}
voidPlayDeck:
:
AskSort()
{
intend_of=0,player=0;
for(player;player<4;player++)
{
if(m_deck[player].nNum==0)
{
cout<<"玩家"<。
。
"<end_of++;
}
}
if(end_of!
=0)
prog_close();
cout<cout<<"按面值排序,请选择1;"<cout<<"按花色排序,请选择2;"<cout<<"退出,请选择3;"<sort=get_int();
switch(sort)
{
case1:
SortDeckFace();
break;
case2:
SortDeckSuit();
break;
case3:
exit(0);
default:
Center_Text("输入错误,请选择一种排序方法或退出");
PlayDeck:
:
AskSort();
}
}
voidPlaying_Card:
:
AskPaidui(){
cout<cout<<"进入54个扑克小人排队报数小游戏,请选择1"<cout<<"退出,选择2"<order=getCount();
switch(order){
case1:
break;
case2:
exit(0);
default:
Center_Text("输入错误,请重新输入");
voidPlaying_Card:
:
AskPaidui();
}
}
voidPlayDeck:
:
DeleteAll(inta,intb,intc,intd)//依次删除第a,b,c,d张牌
{
m_deck[0].Delete(a);
m_deck[1].Delete(b);
m_deck[2].Delete(c);
m_deck[3].Delete(d);
cout<<"上一轮分别删除了以下的一轮牌:
";
m_deck[0].temp.showcard();
cout<<'\t';
m_deck[1].temp.showcard();
cout<<'\t';
m_deck[2].temp.showcard();
cout<<'\t';
m_deck[3].temp.showcard();
cout<}
voidPlayDeck:
:
DeleteOne(introw,intcolumn)//删除第row人的第column张牌
{
m_deck[row-1].Delete(column);
cout<<"上一轮分别删除了以下的一张牌:
";
m_deck[row-1].temp.showcard();
cout<}
voidPlaying_Card:
:
Paidui(){
charj,Face[3],Suit;
intp[54],n=0;
for(inti=0;i<54;i++){
p[i]=1;
}
for(intk=0;k<53;){
for(i=0;i<54;i++)
if(p[i]){
n++;
if(n%5==0){
p[i]=0;
k++;
}
}
}
for(i=0;i<54;i++)
if(p[i])
{cout<<"最后一个扑克小人的编号为:
"<
";
intfaceN=i%13;//扑克牌的面值,从0到12
if(i==52)strcpy(Face,"S");//小王赋为S
elseif(i==53)strcpy(Face,"B");//大王赋为B
else
{
switch(faceN)//当面值大于10时,用J,Q,K代替,面值为0,用A代替
{
case0:
strcpy(Face,"A");break;
case9:
strcpy(Face,"10");break;
case10:
strcpy(Face,"J");break;
case11:
strcpy(Face,"Q");break;
case12:
strcpy(Face,"K");break;
default:
j=char(faceN+49);//其它的面值,用对应的ASCII码表示
if(i<3)
{
Face[i]='';i++;
Face[i]=j;i++;
Face[i]=NULL;
break;
}
}
}
cout<//扑克牌的花色,分别用红桃,黑桃,梅花,方块的ASCII码替代
if(i<=12)Suit=6;//红桃
if(i>12&&i<=25)Suit=3;//黑桃
if(i>25&&i<=38)Suit=5;//梅花
if(i>38&&i<=51)Suit=4;//方块
if(