1.[文件] game21.h ~ 999B 下载(78)
class CCard {
public:
int m_num; //数字1~13
char m_type; //3,4,5,6
int GetPoint(); //返回牌所对应的点数
char* ToString();
};
class CPoker {
private:
CCard m_cards[54]; //牌内容
int m_count; //剩余牌数
public:
CPoker();
void Reset(); // 初始化、洗牌
int GetCard(CCard& card); // 取一张牌,返回 1表示成功,0表示无牌可取
};
class CPlayer {
public:
char m_name[10]; //"COMPUTER" 表示电脑
CPlayer();
void Reset();
int CallCard(CPoker*); //叫牌 ,返回1表示叫了一张牌,返回0表示不再叫牌
int GetPoint(); //返回手中牌所对应的点数之和
void ShowHand(); //显示手里的牌
private:
CCard m_cards[54]; //手里的牌
int m_count; //手里的牌
};
class CGame21 {
public:
CGame21();
~CGame21();
int m_dealer; //庄家对应的下标
int Login(); //游戏者登录
void NewGame(); //开始游戏,从庄家开始一次叫牌,直到都不再叫牌为止,然后比较点数,输出结果
int Victory(); //返回胜利者的编号
private:
CPoker m_poker;
CPlayer** m_players;
int PLATYER_COUNT;
};
2.[文件] game21.cpp ~ 5KB 下载(65)
#include
#include
#include
#include
#include
#include
#include "game21.h"
char* CCard::ToString()
{
static char sz[4]={0};
if(m_num==11)
sprintf(sz,"%c%c",m_type,'J');
else if(m_num==12)
sprintf(sz,"%c%c",m_type,'Q');
else if(m_num==13)
sprintf(sz,"%c%c",m_type,'K');
else if(m_num<=10)
sprintf(sz,"%c%d",m_type,m_num);
return sz;
}
int CCard::GetPoint()
{
return (m_num<=10)? m_num : 1;
}
CPoker::CPoker()
{
Reset();
}
void CPoker::Reset()
{
char sz[]={3,4,5,6};
for(int i=0;i<4;i++)
for(int j=0;j<13;j++)
{
m_cards[i*13+j].m_num=j+1;
m_cards[i*13+j].m_type=sz[i];
}
m_cards[52].m_type='K';
m_cards[52].m_num=0;
m_cards[53].m_type='K';
m_cards[53].m_num=1;
m_count=54;
//Wash Cards
for(i=0;i<54;i++)
{
int pos=rand()%54;
CCard temp=m_cards[i];
m_cards[i]=m_cards[pos];
m_cards[pos]=temp;
}
}
int CPoker::GetCard(CCard& card)
{// 取一张牌,返回 1表示成功,0表示无牌可取
if(m_count>0)
{
card=m_cards[--m_count];
return 1;
}
return 0;
}
CPlayer::CPlayer()
{
Reset();
}
void CPlayer::Reset()
{
m_count=0;
}
int CPlayer::CallCard(CPoker* poker)
{//叫牌 ,返回1表示叫了一张牌,返回0表示不再叫牌
if(strncmp(m_name,"computer",8)==0)
{
if(GetPoint()>=18) return 0;
poker->GetCard(m_cards[m_count++]);
cout << m_name << "要了一张牌,computer手中牌数为"<
return 1;
}
else
{
char ch='Y';
while(true)
{
if(m_count>=2)
{
cout <
for(int i=0;i
cout << setw(4) << m_cards[i].ToString();
cout << "还要叫牌吗?(Y/N)" << endl;
cin >> ch;
}
if(ch=='Y' || ch=='y')
{
poker->GetCard(m_cards[m_count++]);
cout << "您抓到了一张"<
return 1;
}
else if(ch=='N' || ch=='n')
{
return 0;
}
else
{
cout << "请输入(Y/N):" << endl;
}
}
}
return 0;
}
int CPlayer::GetPoint()
{//返回手中牌所对应的点数之和
int sum=0;
for(int i=0;i
sum+=m_cards[i].GetPoint();
return sum;
}
void CPlayer::ShowHand()
{
for(int i=0;i
cout << setw(4) << m_cards[i].ToString();
cout << endl;
}
class CUserPlayer : public CPlayer
{
public :
CUserPlayer()
{
cout << "请输入姓名:"<
cin >> m_name;
}
};
class CComputerPlayer : public CPlayer
{
public:
static int COUNT;
CComputerPlayer()
{
COUNT++;
sprintf(m_name,"computer%d",COUNT);
}
};
int CComputerPlayer::COUNT=0;
CGame21::CGame21()
{
PLATYER_COUNT=3;
m_players=new CPlayer*[PLATYER_COUNT];
m_players[0]=new CUserPlayer();
m_players[1]=new CComputerPlayer();
m_players[2]=new CComputerPlayer();
m_dealer=0;
}
CGame21::~CGame21()
{
if(m_players!=NULL)
{
for(int i=0;i
{
delete m_players[i];
}
delete[] m_players;
}
}
/*
int CGame21::Login()
{
char name[256];
int n;
cout << "请输入你的名字:";
cin >> name;
cout << "请输入电脑游戏者的个数(1~4):";
cin >> n;
while(n<1 || PLATYER_COUNT>4)
{
cout << "错误的输入,请输入电脑游戏者的个数(1~4):";
cin >> n;
}
PLATYER_COUNT=n+1;
m_players=new CPlayer[PLATYER_COUNT];
strcpy(m_players[0].m_name,name);
for(int i=1;i
{
sprintf(m_players[i].m_name,"computer%d",i);
}
return 1;
}
*/
void CGame21::NewGame()
{ //开始游戏,从庄家开始一次叫牌,直到都不再叫牌为止,然后比较点数,输出结果
int n=m_dealer;
cout << "游戏开始,庄家是:"<m_name << endl;
for(int i=0;i
m_players[i]->Reset(); //清游戏者手中的牌
m_poker.Reset(); //洗牌
bool end=false;
while(!end)
{
end=true;
for(int i=0;i
{
if(m_players[i]->CallCard(&m_poker))
end=false; //有人叫牌,不能结束
}
}
int v=Victory(); //计算胜利者
if(v==0)
{
cout << "你赢了!" <
}
else
{
cout << m_players[v]->m_name << "赢了!" <
}
//摊牌
for(i=0;i
{
if(i==0)
cout << "你手里的牌是:" ;
else
cout << m_players[i]->m_name << "手里的牌是:" ;
m_players[i]->ShowHand();
}
m_dealer++; //下一个人做庄
m_dealer=m_dealer%PLATYER_COUNT;
}
int CGame21::Victory()
{
int max_player=-1; //胜利者的编号
for(int i=0;i
{
if(m_players[i]->GetPoint()<=21) //小于21点才有资格比较
{
//第一个比较的人
if(max_player==-1) max_player=i;
//选点数更大的
if(m_players[max_player]->GetPoint()GetPoint())
max_player=i;
//点数一样,选庄家
if(m_players[max_player]->GetPoint()==m_players[i]->GetPoint() && i==m_dealer)
max_player=i;
}
}
//所有人都冒了
if(max_player==-1) max_player=m_dealer;
return max_player;
}
void main()
{
char ch='N';
srand( (unsigned )time( NULL ) );
CGame21 game;
do {
game.NewGame();
cout << "是否继续(Y/N)?";
cin >> ch;
} while (ch=='Y' || ch=='y');
}