21点游戏 c语言,用c++实现的21点游戏

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');

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值