扑克牌游戏代码下载

来源:互联网 发布:转移定价 知乎 编辑:程序博客网 时间:2024/05/06 06:49
wweilinux 发表于 2006-8-20 11:07:18
//扑克牌游戏
//程序说明
//两个功能:洗牌、对抗。

#include <iostream>
#include <string>
#include <ctime>
#include <iomanip>

using namespace std;

void ProgramInit(); //显示本程序信息
void DeckMakeDriver(); //洗牌、删牌
int GetRandInt(int min,int max); //获得随机数
void PlayCard(); //开玩

class CCard
{
private:
char szFace[3]; //牌的大小
char chSuit; //牌的花色(黑、红、梅、方)
int nNumber; //**牌的大小(用于对抗游戏)
public:
CCard(); //构造函数
void ShowCard(); //显示1张牌
void CardMake(int); //据参数生成1张牌
int GetCardNum(); //返回牌的大小(用于对抗游戏)
};

CCard::CCard() //构造函数
{
int i;
for(i=1;i<=3;) //初始化牌的大小为空
{
szFace[i]=' ';
i++;
}
chSuit=' '; //初始化牌的花色
}

int CCard::GetCardNum() //**返回牌的大小(用于对抗游戏)
{return nNumber;}

void CCard::ShowCard()
{cout<<setw(3)<<szFace<<setw(2)<<chSuit<<" ";}

void CCard::CardMake(int num)
{
int i=0;
char j;
int face_num=num%13; //每种花色13张牌
nNumber=face_num;
switch(face_num)
{
case 0:strcpy(szFace," A");break; //当牌为非数字时
case 9:strcpy(szFace,"10");break;
case 10:strcpy(szFace," J");break;
case 11:strcpy(szFace," Q");break;
case 12:strcpy(szFace," K");break;
default:
j=char(face_num+49); //j为对应数字时的ASCII码
if(i<3)
{
szFace[i]=' ';i++;
szFace[i]=j; i++;
szFace[i]=NULL;
break;
}
}
if(num<=12) chSuit=6; //每13张牌赋予一种花色
if(num>12&&num<=25) chSuit=3;
if(num>25&&num<=38) chSuit=5;
if(num>38&&num<=51) chSuit=4;
}

class CDeck //一副牌52张
{
protected:
CCard CardArray[52];
int nLastDelt;
public:
CDeck(){}; //构造函数
void MakeDeck(); //生成1副牌
void DealOne(); //删1张牌
void ShowDeck(); //显示这副牌
void DeckShuff(int); //洗牌
};

void CDeck::MakeDeck() //产生一副牌(52张)
{
nLastDelt=51;
while(nLastDelt>-1)
{
CardArray[nLastDelt].CardMake(nLastDelt); //调用类成员函数
nLastDelt--;
}
}

void CDeck::ShowDeck() //显示牌面
{
int nIndex=nLastDelt+1;
int newline=0;
cout<<endl;
while(nIndex<=51)
{
if(newline%13==0)cout<<endl; //13张牌显示为一行
CardArray[nIndex].ShowCard(); //显示牌面
newline++;
nIndex++;
}
}

void CDeck::DeckShuff(int times) //洗牌次数
{
int split; //分开成两部分的位置,如上部分,下部分
cout<<"/n/n/t洗牌后....../n";
for(int i=0;i<=times;i++) //每次循环洗1次牌
{
split=GetRandInt(21,35);
CDeck topdeck; //将分开的牌组成两副牌
CDeck bottomdeck;
int bottomdeckindex=1;
int topdeckindex=1;
for(int j=0;j<=split-1;j++) //第1副牌赋值
{
topdeck.CardArray[topdeckindex]=this->CardArray[j];
topdeckindex++;
}
for(int k=(split);k<52;k++) //第2副牌赋值
{
bottomdeck.CardArray[bottomdeckindex]=this->CardArray[k];
bottomdeckindex++;
}
int deckoutindex=0;
int numcardstomovetop;
int numcardstomovebottom;
bottomdeckindex=52-split;
topdeckindex=split;
while(deckoutindex<=51)
{
numcardstomovetop=GetRandInt(2,7);
//从上部分抽取的张数是2~7之间的随机数
numcardstomovebottom=GetRandInt(2,7);
for(j=0;j<=numcardstomovebottom;j++)
{
if(bottomdeckindex>0)
{
this->CardArray[deckoutindex]=
bottomdeck.CardArray[bottomdeckindex];
deckoutindex++;
bottomdeckindex--;
}
for(int i=0;i<=numcardstomovetop;i++)
{
if((topdeckindex>0)&&(deckoutindex<=52))
//将上部分牌还原
{
this->CardArray[deckoutindex]=
topdeck.CardArray[topdeckindex];
deckoutindex++;
topdeckindex--;
}
}
}
}
}
this->nLastDelt=-1;
}
wweilinux 发表于 2006-8-20 11:07:00
void CDeck::DealOne() //删最的1张牌
{
if(nLastDelt!=51) //看是否已删完一副牌
{
nLastDelt++;
cout<<"/n 已删除:";
CardArray[nLastDelt].ShowCard();
}
else
cout<<"这副牌已全部被删完/n";
}

class CSuperDeck:public CDeck
//超级扑克牌,是扑克牌类的公有派生
{
private:
int nLastCard; //这副牌中剩余的牌数
public:
CSuperDeck(){nLastCard=52;}
int GetLastCard(); //返回剩余牌的数目
void DeleteDeckCard(int nNum); //删序号为nNum的牌
void ShowOneCard(int nNum); //显示序号为nNum的牌
int GetOneCard(int nNum)
{return CardArray[nNum-1].GetCardNum();}
//返回1张牌的牌面
};

int CSuperDeck::GetLastCard(){return nLastCard;}

void CSuperDeck::ShowOneCard(int nNum)
{
CardArray[nNum-1].ShowCard();
}

void CSuperDeck::DeleteDeckCard(int nNum)
{
for(int i=nNum-1;i<nLastCard-1;i++)
CardArray[i]=CardArray[i+1];
nLastCard--;
}

int main()
{
srand((unsigned)time(NULL)); //初始化随机数种子
ProgramInit(); //显示程序信息
DeckMakeDriver(); //主要步骤
PlayCard(); //**对抗游戏
cout<<"/n/n/t/t谢谢使用本游戏,再见!/n/n";
return 1;
}

void ProgramInit() //程序初始提示信息
{
cout<<"/n/n/t/t欢迎进入扑克牌游戏!/n/n";
cout<<"/t/t本游戏完成洗牌和删除牌的功能/n/n";
system("pause");
}

void DeckMakeDriver()
{
CDeck deck; //建立1副牌对象
deck.MakeDeck(); //生成1副牌
deck.ShowDeck(); //显示生成的牌
cout<<endl<<endl;
system("pause");
deck.DeckShuff(250); //洗牌
deck.ShowDeck(); //显示洗完的牌
cout<<endl<<endl;
system("pause");
string strChoice;
cout<<"是否删除1张牌(Y/N)?";
cin>>strChoice;
while(strChoice=="Y"||strChoice=="y")
{
deck.DealOne(); //删1张牌
cout<<"/n/n/t余牌显示:";
deck.ShowDeck(); //余牌显示
cout<<endl<<endl<<"是否继续删除(Y/N)?";
cin>>strChoice;
}
}

int GetRandInt(int min,int max) //取得介于min和max之间的随机数
{
int numToReturn;
numToReturn=rand();
numToReturn=numToReturn%(max-min+1)+min;
return numToReturn;
}

void PlayCard() //对抗游戏
{
CSuperDeck deck; //建立1副牌对象
deck.MakeDeck(); //生成1副牌
deck.ShowDeck(); //显示生成的牌
cout<<endl<<endl;
system("pause");
deck.DeckShuff(250); //洗牌
deck.ShowDeck(); //显示洗完的牌
cout<<endl<<endl;
system("pause");
string strChoice="y";
cout<<"对抗游戏/n";
system("pause");
do
{
int nPlayer,nComputer; //双方牌的序号
int nPlayerNum,nComputerNum; //对方牌的点数
nPlayer=GetRandInt(1,deck.GetLastCard()); //随机抽1张牌
cout<<"您抽取的牌是:";
deck.ShowOneCard(nPlayer); //显示这张牌
nPlayerNum=deck.GetOneCard(nPlayer); //取这张牌的点数
deck.DeleteDeckCard(nPlayer); //删这张牌
nComputer=GetRandInt(1,deck.GetLastCard()); //随机抽1张牌
cout<<"/n计算机抽到的牌是:";
deck.ShowOneCard(nComputer);
nComputerNum=deck.GetOneCard(nComputer);
deck.DeleteDeckCard(nComputer);
if(nComputerNum>nPlayerNum) //比较两张牌的点数
cout<<"/n对不起,您输了,下次努力吧!/n/n";
else if(nComputerNum==nPlayerNum)
cout<<"/n平局!";
else
cout<<"/n恭喜您,您赢了!/n/n";
cout<<"是滞继续对抗(Y/N)";
cin>>strChoice;
}while((strChoice=="Y"||strChoice=="y")
&&(deck.GetLastCard()!==0)); //牌数为0
if(deck.GetLastCard()==0)
cout<<"/n/n/t/t牌已经发完,欢迎下次继续!/n";
cout<<"/n/t/t对抗结束!/n";
}

D:/DevCpp/d_314.cpp In member function `void CCard::CardMake(int)':
62 D:/DevCpp/d_314.cpp [Warning] converting to non-pointer type `char' from NULL
D:/DevCpp/d_314.cpp In member function `void CDeck::DeckShuff(int)':
139 D:/DevCpp/d_314.cpp name lookup of `j' changed for new ISO `for' scoping
120 D:/DevCpp/d_314.cpp using obsolete binding at `j'

上述提示如何更正,谢谢。  
原创粉丝点击