扑克牌游戏.docx
《扑克牌游戏.docx》由会员分享,可在线阅读,更多相关《扑克牌游戏.docx(17页珍藏版)》请在冰豆网上搜索。
扑克牌游戏
#include
#include
#include
#include
#include
#include
#include
#include
inta,b,c,d;//用于记录各位玩家所删去的牌的张数;
classPlaying_Card//扑克类
{
public:
charm_Face[3];//扑克的数字大小
charm_Suit;//扑克的花色(黑、红、梅、方)
Playing_Card();//构造函数
voidshowcard();//显示一张牌
voidCard_Make(int);//制造一张牌
};
classDeck//一副扑克(54张)
{
private:
Playing_Cardm_cardarray[54];//扑克牌数组
intm_lastdelt;
public:
Deck();//构造函数
voidMakeDeck();//制造一副牌
voidShowDeck();//显示一副牌
voidDeckShuff(int);//洗牌
voidRemove_Card(intx);//将一张牌置空;
voidMove();//删去大小王
voidSendDeck();//发牌
voidDelete_One_Card(int);//删去一张牌;
Playing_CardDriver[4][13];//四个玩家的牌
};
voidblank();
voidshowout();//输出开始界面
voidCenter_Text(char[]);//将char[]中的内容居中;
charGet_Key();//输入一个字符;
voidDeckMakeDriver();//测试函数;
intgetRandInt(intmin,intmax);//得到一个随机数;
voidprog_close();//暂停程序;
voidshow(char*,double);//打字效果
//***************************************Main******************************************************
voidmain()//主函数用于调用其他函数;
{
srand((unsigned)time(NULL));//设置随机数;
intCard_Number=0;
showout();//调用此函数显示相关信息;
DeckMakeDriver();//调用此函数;
exit(-1);//退出程序
}
Playing_Card:
:
Playing_Card()//Playing_Card类中的构造函数,产生的对象为一张空牌;
{
inti;
for(i=0;i<3;)
{
m_Face[i]='';
i++;
}
m_Suit='';
}
voidshow(char*pp,doublen)
{
for(unsignedinti=0;i{
intm;
m=(int)n;
Sleep(m);
cout<}
}
voidshowout()
{
cout<show("********欢迎进入扑克牌游戏********\n\n\n",1);
show("puk\n",1);
show("puk\n",1);
show("pppppppukkkkkkkkkkkkkkk\n",1);
show("puk\n",1);
show("puukkkkkkkkk\n",1);
show("ppuukk\n",1);
show("ppuukkkkkkkkk\n",1);
show("ppuee\n",1);
show("puee\n",1);
show("ppueee\n",1);
show("pueeeee\n\n\n",1);
show("设计者:
宗柳\n\n",1);
show("学号:
05081901\n\n",1);
show("班级:
0508190102\n\n",1);
cout<show("请按键继续...",1);
cin.get();
}
charGet_Key()//从用户处得到一个字符,可用来暂停程序;
{
charx;
x=cin.get();
cout<returnx;
}
voidPlaying_Card:
:
showcard()//显示一张牌;
{cout<cout<cout.width
(1);
cout<cout<<"";
}
voidCenter_Text(charShellText[80])//将ShellText[80]中的字符居中显示;
{
intlength;
intcenter;
length=strlen(ShellText);//计算出字符串ShellText[]的长度;
center=(80-length)/2;//计算出离屏幕左端的空格数;
for(;center!
=0;center--)
{
cputs("");//输出空格;
}
cputs(ShellText);//输出ShellText[80]中的内容;
}
voidPlaying_Card:
:
Card_Make(intnum)//制造一张牌;
{
inti=0;
charj;
intface_num=num%13;
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);//将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;//制造13张牌从黑桃A-黑桃K;
if(num>12&&num<=25)m_Suit=3;//制造13张牌从红桃A-红桃K;
if(num>25&&num<=38)m_Suit=5;//制造13张牌从梅花A-梅花K;
if(num>38&&num<=51)m_Suit=4;//制造13张牌从方片A-方片K;
}
voidDeckMakeDriver()
{
inti,m;
system("cls");//清屏;
Deckdeck_1;//定义一个Deck类的对象;
cout<Center_Text("现在创建了一副新牌");//调用Center_Text()函数,将括号内的信息输出,并使其居于屏幕的中间
cout<deck_1.MakeDeck();//制造一副牌;
deck_1.ShowDeck();//显示一副牌;
cout<Center_Text("请按键开始洗牌......");
Get_Key();//用户任输入一个字符,用来暂停程序;
deck_1.DeckShuff(250);//洗牌250次;
deck_1.ShowDeck();//显示洗好后的牌
cout<Center_Text("请按键继续......");
Get_Key();//用户任输入一个字符,用来暂停程序;
cout<deck_1.Move();//删去牌中的大、小王;
deck_1.ShowDeck();//将大小王删去后的牌显示;
cout<Center_Text("请按键开始发牌......");
Get_Key();//用户任输入一个字符,用来暂停程序;
system("cls");//清屏;
cout<<"================================================================================"<deck_1.SendDeck();//发牌给四个玩家;
cout<<"玩家
(1)的牌为:
"<for(i=0;i<13;i++)deck_1.Driver[0][i].showcard();//显示此玩家
(1)的牌;
blank();//输出各张牌所对应的序号于牌的下方;
cout<<"玩家
(2)的牌为:
"<for(i=0;i<13;i++)deck_1.Driver[1][i].showcard();//显示此玩家
(2)的牌;
blank();//输出各张牌所对应的序号于牌的下方;
cout<<"玩家(3)的牌为:
"<for(i=0;i<13;i++)deck_1.Driver[2][i].showcard();//显示此玩家(3)的牌;
blank();//输出各张牌所对应的序号于牌的下方;
cout<<"玩家(4)的牌为:
"<for(i=0;i<13;i++)deck_1.Driver[3][i].showcard();//显示此玩家(4)的牌;
blank();//输出各张牌所对应的序号于牌的下方;
cout<<"================================================================================";
cout<<"请按键显示游戏玩家菜单......";
Get_Key();
Center_Text("***********************游戏玩家菜单***********************");
cout<Center_Text("1-玩家
(1)");
cout<Center_Text("2-玩家
(2)");
cout<Center_Text("3-玩家(3)");
cout<Center_Text("4-玩家(4)");
cout<Center_Text("**********************************************************");
cout<cout<<"请输入所要处理牌的玩家的序号:
";
intinput1;
charinput2;
do{
if(input2=='y'||input2=='Y')
cout<<"请输入所要处理牌的玩家的序号:
";
cin>>input1;
cout<switch(input1)
{
case1:
for(m=0;m<13-a;m++)deck_1.Driver[input1-1][m].showcard();//显示此玩家
(1)的牌;
blank();//输出各张牌所对应的序号于牌的下方;
deck_1.Delete_One_Card(input1);//删除玩家
(1)的第input1张牌;
break;
case2:
for(m=0;m<13-b;m++)deck_1.Driver[input1-1][m].showcard();//显示此玩家
(2)的牌;
blank();//输出各张牌所对应的序号于牌的下方;
deck_1.Delete_One_Card(input1);//删除玩家
(2)的第input1张牌;
break;
case3:
for(m=0;m<13-c;m++)deck_1.Driver[input1-1][m].showcard();//显示此玩家(3)的牌;
blank();//输出各张牌所对应的序号于牌的下方;
deck_1.Delete_One_Card(input1);//删除玩家(3)的第input1张牌;
break;
case4:
for(m=0;m<13-d;m++)deck_1.Driver[input1-1][m].showcard();//显示此玩家(4)的牌;
blank();//输出各张牌所对应的序号于牌的下方;
deck_1.Delete_One_Card(input1);//删除玩家(4)的第input1张牌;
break;
default:
cout<<"输入错误!
"<exit(-1);
}
cout<<"是否还要处理其余玩家的牌?
若是,按;若否,按任意键退出!
\n请按键选择:
";
cin>>input2;
cout<}while(input2=='y'||input2=='Y');
}
voidDeck:
:
MakeDeck()//制造一副牌;
{
m_lastdelt=53;//一副牌的总张数;
while(m_lastdelt>1)//先制造除大、小王外的其余52张牌;
{
m_cardarray[m_lastdelt-2].Card_Make(m_lastdelt-2);
//调用Card_Make(intnum)函数制造52张牌;
m_lastdelt--;//每制造一张牌m_lastdelt-1;
}
if(m_lastdelt==1)//制造一张大王;
{
strcpy(m_cardarray[m_lastdelt+51].m_Face,"W");
m_cardarray[m_lastdelt+51].m_Suit=2;
m_lastdelt--;
}
if(m_lastdelt==0)//制造一张小王;
{
strcpy(m_cardarray[m_lastdelt+53].m_Face,"w");
m_cardarray[m_lastdelt+53].m_Suit=1;
}
}
voidDeck:
:
ShowDeck()
{
intindex=m_lastdelt;//经调用MakeDeck()函数后,此时的m_lastdelt值为0;
intnewline=0;
while(index<=53)
{
if(newline%13==0)cout<m_cardarray[index].showcard();//调用showcard()函数,显示每一张牌
newline++;//记录已显示的牌的张数;
index++;
}
}
voidDeck:
:
SendDeck()//按牌的顺序依次将牌发给四个玩家;
{
inti;
for(i=0;i<13;i++)
{
Driver[0][i]=m_cardarray[i*4];
Driver[1][i]=m_cardarray[i*4+1];
Driver[2][i]=m_cardarray[i*4+2];
Driver[3][i]=m_cardarray[i*4+3];
}
}
intgetRandInt(intmin,intmax)//得到一个随机数,并将其返回;
{
intnumToReturn;
numToReturn=rand();
numToReturn=numToReturn%(max-min+1)+min;
returnnumToReturn;
}
voidDeck:
:
DeckShuff(inttimes)//洗牌次数
{
intx,split;//split是分开成两部分的位置,如上部分、下部分
system("cls");
cout<Center_Text("以下为洗过后的牌");
cout<for(x=0;x<=times;x++)
{
split=getRandInt(20,35);//通过getRandInt(intmin,intmax)函数得到一个随机数;
Decktopdeck;//制造两副新的空牌topdeck和bottomdeck;
Deckbottomdeck;
inti;
intbottomdeckindex=1;
inttopdeckindex=1;
for(i=0;i<=split-1;)//将原来牌的前split张赋值给topdeck;
{
topdeck.m_cardarray[topdeckindex]=this->m_cardarray[i];
topdeckindex++;
i++;
}
for(i=(split);i<54;)//将原来牌中剩余的牌赋值给bottomdeck;
{
bottomdeck.m_cardarray[bottomdeckindex]=this->m_cardarray[i];
bottomdeckindex++;
i++;
}
intdeckoutindex=0;//用来记录从topdeck.cardarray[split]和bottomdeck.cardarray[54-split]中向deck_1.cardarray[54]中已赋值的牌的总数;
intnumcardstomovetop;//记录随机数;
intnumcardstomovebottom;//记录随机数;
intj;
inth=0;
bottomdeckindex=54-split;//bottomdeck.cardarray[54]中所拥有的牌的张数为54-split张并赋值给bottomdeckindex;
topdeckindex=split;//topdeck.cardarray[54]中所拥有的牌的张数为split张并赋值给topdeckindex;
while(deckoutindex<=53)
{
numcardstomovetop=getRandInt(2,7);
//从上部分抽取的张数,是2-7之间的随机数
numcardstomovebottom=getRandInt(2,7);
//从下部分抽取的张数,是2-7之间的随机数;
for(j=0;j<=numcardstomovebottom;j++)//将从下部分抽取的牌中的第一张插入deck_1.cardarray[54]中;
{
if(bottomdeckindex>0)
//检查从bottomdeck.cardarray[54-split]中抽取的牌是否还有剩余;
{
this->m_cardarray[deckoutindex]=bottomdeck.m_cardarray[bottomdeckindex];
deckoutindex++;
bottomdeckindex--;
}
for(h=0;h<=numcardstomovetop;h++)
//将从上部分抽取的牌全部插入deck_1.cardarray[54]中;
{
if((topdeckindex>0)&&(deckoutindex<=53))
//检查从topdeck.cardarray[split]中的牌是否还有剩余并检查deck_1.cardarray[54]中的牌是否全被洗过;
{
this->m_cardarray[deckoutindex]=topdeck.m_cardarray[topdeckindex];
deckoutindex++;
topdeckindex--;
}
}
}
}
}
this->m_lastdelt=0;//将m_lastdelt重新修改为0,以便后面显示牌;
}
voidblank()//输出每个玩家的牌所对应的序号;
{
intj;
cout<for(j=1;j<=13;j++)
{
if(j<=10)cout<<""