//#include "stdafx.h"
#include<iostream>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include <stdio.h>
#include <queue>
using namespace std;
int cpu_bao=0,player_bao=0;
struct sCard
{
int naPip[5]; //一共5张牌
int nNumber; //发了多少张牌
int nDollar; //有多少钱
int nGamble; //赌注
int nWin; //赢局数
int nLose; //输局数
int nDraw; //平局数
}cpu,player;
queue<int> q;
void initcards(); //初始化牌:a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,...}
void shuffle(int a[]); //洗牌
void DisplayRule(); //printf游戏规则
void init(sCard &); //初始化结构体sCard
int GetMoney(sCard sc); //返回nDollar
int SetGamble(sCard &,int); //设置赌本,赌本不够返回-1
void DisplayInfo(sCard); //打印必要的信息
void FirstPlayTwo(sCard &cpu, sCard &player); //最初两张牌
void DisplayPip(sCard); //依次全部显示牌面点数
void DisplayPip_C(sCard); //除了第一张牌,依次全部显示牌面点数(针对计算机牌的显示)
void PlayTurn(sCard &,sCard &); //开始一局游戏
int GetNumber(sCard); //返回牌数
void TurnPlay(sCard &cpu, sCard &player, bool flag); //要一张牌,flag为true时player要牌,flag为false时cpu要牌
int GetCurrentCard(sCard); //返回当前牌点
void Draw(sCard &); //平局
void Win(sCard &); //嬴
void Lose(sCard &); //输
int GetPip(sCard &); //返回点数
void Judge(sCard &,sCard &);//裁判
int main()
{
DisplayRule();
srand(time(NULL));
initcards();
init(cpu);
init(player);
int blLogic;
int nMoney;
/*DisplayRule();*/
char chChoice;
cout<<"是否现在开始游戏(Y/N)?\n";
cin>>chChoice;
while(chChoice=='Y'||chChoice=='y')
{
do
{
cout<<"您现在有赌本:$"<<GetMoney(player);
cout<<"\n请下注(赌注不能超过赌本):";
cin>>nMoney;
blLogic = SetGamble(player, nMoney);
if(blLogic)
cout<<"您的赌本不够,请重新下注!\n";
}
while(blLogic);
player.nGamble=nMoney;
cpu.nGamble=nMoney;
initcards();
PlayTurn(cpu,player);
cout<<"是否继续21点游戏(Y/N)?\n";
cin>>chChoice;
}
DisplayInfo(player);
cout<<"\n\n您是明智的,赌博是不好的!回去好好学习去~!\n"<<endl<<endl;
cout<<"欢迎再次使用本程序,该程序由薛建杭编写!\n\n";
return 0;
}
void initcards()
{
while(!q.empty())
q.pop();
int flag[14]={0};
for(;;)
{
int t;
t=rand()%13+1;
if(flag[t]<4)
{q.push(t);flag[t]++;}
if(q.size()==52)
break;
}
/*for(int i=0;i<52;i++)
{
printf("%d ",q.front());
q.pop();
}*/
}
/*
void shuffle(int a[]) //洗牌
{
}
*/
void init(sCard &sc)
{
memset(sc.naPip,0,sizeof(sc.naPip));
sc.nDollar=100;
sc.nGamble=0;
sc.nNumber=0;
sc.nLose=0;
sc.nDraw=0;
sc.nWin=0;
}
void DisplayRule()
{
printf("本游戏使用大小王之外的52张牌,游戏者的目标是使手中的牌不大于21并且尽量最大,");
printf("每人最多五张牌,初始每人两张,然后每一个回合,最后点大者胜利\n");
}
int GetMoney(sCard sc)
{
return sc.nDollar;
}
int SetGamble(sCard &sc,int gamble)
{
if(sc.nDollar<gamble)
return -1;
else
return 0;
}
void PlayTurn(sCard &cpu,sCard &player)
{
int blCpu=1,blPlayer=1;
cpu_bao=0;player_bao=0;
bool flag;
char chChoice;
memset(cpu.naPip,0,sizeof(cpu.naPip));
memset(player.naPip,0,sizeof(player.naPip));
FirstPlayTwo(cpu,player);
do
{
cout<<"您的牌点为:"<<GetPip(player)<<endl;
cout<<"您的牌面点数为:"<<endl;DisplayPip(player);
cout<<"计算机的牌面点数为:"<<endl;DisplayPip_C(cpu);
if(blPlayer)
{
cout<<"\n\n您是否继续要牌(Y/N)?";
cin>>chChoice;
if((chChoice=='Y'||chChoice=='y'))
{
if(player.nNumber<5)
{
flag=1;
TurnPlay(cpu,player,flag);
cout<<"您要的这张牌是:"<<GetCurrentCard(player)<<endl;
if(GetPip(player)>21)
player_bao++;
}
else
{
cout<<"对不起,您已经要了5次牌了。不能再要牌了!";
}
}
}
if(player_bao!=0)
break;
if((chChoice=='N'||chChoice=='n'))
blPlayer=0;
if(cpu.nNumber<5&&GetPip(cpu)<16) //cpu点数小于16点且牌数小于5张
{
flag=0;
TurnPlay(cpu,player,flag);
cout<<"计算机要牌,牌是:"<<GetCurrentCard(cpu)<<endl;
if(GetPip(cpu)>21)
cpu_bao++;
}
else
blCpu=0;
if(cpu_bao!=0)
break;
if(blCpu&&GetNumber(player)<5&&GetPip(player)<21)
blPlayer=1;
}
while(blCpu||blPlayer);
Judge(cpu,player);
return;
}
void DisplayInfo(sCard sc)
{
cout<<"您一共玩了"<<sc.nDraw+sc.nLose+sc.nWin<<"局,"<<"赢了"<<sc.nWin<<"局,"<<"输了"<<sc.nLose<<"局,"<<"平局"<<sc.nDraw<<"次。"<<endl;
cout<<"你的赌本共计有$"<<sc.nDollar<<endl;
}
void FirstPlayTwo(sCard &cpu, sCard &player)
{
int x;
x=q.front();q.pop();
cpu.naPip[0]=x;
x=q.front();q.pop();
cpu.naPip[1]=x;
cpu.nNumber=2;
x=q.front();q.pop();
player.naPip[0]=x;
x=q.front();q.pop();
player.naPip[1]=x;
player.nNumber=2;
}
void DisplayPip(sCard sc)
{
int i;
for(i=0;sc.naPip[i];i++)
printf("%d ",sc.naPip[i]);
puts("");
}
void DisplayPip_C(sCard sc)
{
int i;
printf("* ");
for(i=1;sc.naPip[i];i++)
printf("%d ",sc.naPip[i]);
puts("");
}
int GetPip(sCard &sc)
{
int s=0,i;
for(i=0;sc.naPip[i];i++)
{
if(sc.naPip[i]<=10)
s+=sc.naPip[i];
else
s+=10;
}
return s;
}
int GetNumber(sCard sc)
{
return sc.nNumber;
}
void TurnPlay(sCard &cpu, sCard &player, bool flag)
{
int x;
x=q.front();q.pop();
if(flag==1)
{
int i;
for(i=0;i<5;i++)
if(player.naPip[i]==0)
{player.naPip[i]=x;break;}
player.nNumber++;
}
if(flag==0)
{
int i;
for(i=0;i<5;i++)
if(cpu.naPip[i]==0)
{cpu.naPip[i]=x;break;}
cpu.nNumber++;
}
}
int GetCurrentCard(sCard sc)
{
int i;
for(i=4;i>=0;i--)
{
if(sc.naPip[i]!=0)
break;
}
return sc.naPip[i];
}
void Judge(sCard &cpu,sCard &player)
{
printf("您的牌点为%d,计算机的牌为%d\n",GetPip(player),GetPip(cpu));
if(cpu_bao==0&&player_bao==0)
{
if(GetPip(player)==GetPip(cpu))
{
Draw(player);
}
else if(GetPip(player)>GetPip(cpu))
{
Win(player);
}
else
{
Lose(player);
}
}
else
{
if(player_bao!=0)
Lose(player);
if(cpu_bao!=0)
Win(player);
}
}
void Draw(sCard &sc)
{
printf("平局\n");
sc.nDraw++;
}
void Win(sCard &sc)
{
printf("你赢了\n");
sc.nWin++;
sc.nDollar+=sc.nGamble;
}
void Lose(sCard &sc)
{
printf("你输了\n");
sc.nLose++;
sc.nDollar-=sc.nGamble;
}
#include<iostream>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include <stdio.h>
#include <queue>
using namespace std;
int cpu_bao=0,player_bao=0;
struct sCard
{
int naPip[5]; //一共5张牌
int nNumber; //发了多少张牌
int nDollar; //有多少钱
int nGamble; //赌注
int nWin; //赢局数
int nLose; //输局数
int nDraw; //平局数
}cpu,player;
queue<int> q;
void initcards(); //初始化牌:a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,...}
void shuffle(int a[]); //洗牌
void DisplayRule(); //printf游戏规则
void init(sCard &); //初始化结构体sCard
int GetMoney(sCard sc); //返回nDollar
int SetGamble(sCard &,int); //设置赌本,赌本不够返回-1
void DisplayInfo(sCard); //打印必要的信息
void FirstPlayTwo(sCard &cpu, sCard &player); //最初两张牌
void DisplayPip(sCard); //依次全部显示牌面点数
void DisplayPip_C(sCard); //除了第一张牌,依次全部显示牌面点数(针对计算机牌的显示)
void PlayTurn(sCard &,sCard &); //开始一局游戏
int GetNumber(sCard); //返回牌数
void TurnPlay(sCard &cpu, sCard &player, bool flag); //要一张牌,flag为true时player要牌,flag为false时cpu要牌
int GetCurrentCard(sCard); //返回当前牌点
void Draw(sCard &); //平局
void Win(sCard &); //嬴
void Lose(sCard &); //输
int GetPip(sCard &); //返回点数
void Judge(sCard &,sCard &);//裁判
int main()
{
DisplayRule();
srand(time(NULL));
initcards();
init(cpu);
init(player);
int blLogic;
int nMoney;
/*DisplayRule();*/
char chChoice;
cout<<"是否现在开始游戏(Y/N)?\n";
cin>>chChoice;
while(chChoice=='Y'||chChoice=='y')
{
do
{
cout<<"您现在有赌本:$"<<GetMoney(player);
cout<<"\n请下注(赌注不能超过赌本):";
cin>>nMoney;
blLogic = SetGamble(player, nMoney);
if(blLogic)
cout<<"您的赌本不够,请重新下注!\n";
}
while(blLogic);
player.nGamble=nMoney;
cpu.nGamble=nMoney;
initcards();
PlayTurn(cpu,player);
cout<<"是否继续21点游戏(Y/N)?\n";
cin>>chChoice;
}
DisplayInfo(player);
cout<<"\n\n您是明智的,赌博是不好的!回去好好学习去~!\n"<<endl<<endl;
cout<<"欢迎再次使用本程序,该程序由薛建杭编写!\n\n";
return 0;
}
void initcards()
{
while(!q.empty())
q.pop();
int flag[14]={0};
for(;;)
{
int t;
t=rand()%13+1;
if(flag[t]<4)
{q.push(t);flag[t]++;}
if(q.size()==52)
break;
}
/*for(int i=0;i<52;i++)
{
printf("%d ",q.front());
q.pop();
}*/
}
/*
void shuffle(int a[]) //洗牌
{
}
*/
void init(sCard &sc)
{
memset(sc.naPip,0,sizeof(sc.naPip));
sc.nDollar=100;
sc.nGamble=0;
sc.nNumber=0;
sc.nLose=0;
sc.nDraw=0;
sc.nWin=0;
}
void DisplayRule()
{
printf("本游戏使用大小王之外的52张牌,游戏者的目标是使手中的牌不大于21并且尽量最大,");
printf("每人最多五张牌,初始每人两张,然后每一个回合,最后点大者胜利\n");
}
int GetMoney(sCard sc)
{
return sc.nDollar;
}
int SetGamble(sCard &sc,int gamble)
{
if(sc.nDollar<gamble)
return -1;
else
return 0;
}
void PlayTurn(sCard &cpu,sCard &player)
{
int blCpu=1,blPlayer=1;
cpu_bao=0;player_bao=0;
bool flag;
char chChoice;
memset(cpu.naPip,0,sizeof(cpu.naPip));
memset(player.naPip,0,sizeof(player.naPip));
FirstPlayTwo(cpu,player);
do
{
cout<<"您的牌点为:"<<GetPip(player)<<endl;
cout<<"您的牌面点数为:"<<endl;DisplayPip(player);
cout<<"计算机的牌面点数为:"<<endl;DisplayPip_C(cpu);
if(blPlayer)
{
cout<<"\n\n您是否继续要牌(Y/N)?";
cin>>chChoice;
if((chChoice=='Y'||chChoice=='y'))
{
if(player.nNumber<5)
{
flag=1;
TurnPlay(cpu,player,flag);
cout<<"您要的这张牌是:"<<GetCurrentCard(player)<<endl;
if(GetPip(player)>21)
player_bao++;
}
else
{
cout<<"对不起,您已经要了5次牌了。不能再要牌了!";
}
}
}
if(player_bao!=0)
break;
if((chChoice=='N'||chChoice=='n'))
blPlayer=0;
if(cpu.nNumber<5&&GetPip(cpu)<16) //cpu点数小于16点且牌数小于5张
{
flag=0;
TurnPlay(cpu,player,flag);
cout<<"计算机要牌,牌是:"<<GetCurrentCard(cpu)<<endl;
if(GetPip(cpu)>21)
cpu_bao++;
}
else
blCpu=0;
if(cpu_bao!=0)
break;
if(blCpu&&GetNumber(player)<5&&GetPip(player)<21)
blPlayer=1;
}
while(blCpu||blPlayer);
Judge(cpu,player);
return;
}
void DisplayInfo(sCard sc)
{
cout<<"您一共玩了"<<sc.nDraw+sc.nLose+sc.nWin<<"局,"<<"赢了"<<sc.nWin<<"局,"<<"输了"<<sc.nLose<<"局,"<<"平局"<<sc.nDraw<<"次。"<<endl;
cout<<"你的赌本共计有$"<<sc.nDollar<<endl;
}
void FirstPlayTwo(sCard &cpu, sCard &player)
{
int x;
x=q.front();q.pop();
cpu.naPip[0]=x;
x=q.front();q.pop();
cpu.naPip[1]=x;
cpu.nNumber=2;
x=q.front();q.pop();
player.naPip[0]=x;
x=q.front();q.pop();
player.naPip[1]=x;
player.nNumber=2;
}
void DisplayPip(sCard sc)
{
int i;
for(i=0;sc.naPip[i];i++)
printf("%d ",sc.naPip[i]);
puts("");
}
void DisplayPip_C(sCard sc)
{
int i;
printf("* ");
for(i=1;sc.naPip[i];i++)
printf("%d ",sc.naPip[i]);
puts("");
}
int GetPip(sCard &sc)
{
int s=0,i;
for(i=0;sc.naPip[i];i++)
{
if(sc.naPip[i]<=10)
s+=sc.naPip[i];
else
s+=10;
}
return s;
}
int GetNumber(sCard sc)
{
return sc.nNumber;
}
void TurnPlay(sCard &cpu, sCard &player, bool flag)
{
int x;
x=q.front();q.pop();
if(flag==1)
{
int i;
for(i=0;i<5;i++)
if(player.naPip[i]==0)
{player.naPip[i]=x;break;}
player.nNumber++;
}
if(flag==0)
{
int i;
for(i=0;i<5;i++)
if(cpu.naPip[i]==0)
{cpu.naPip[i]=x;break;}
cpu.nNumber++;
}
}
int GetCurrentCard(sCard sc)
{
int i;
for(i=4;i>=0;i--)
{
if(sc.naPip[i]!=0)
break;
}
return sc.naPip[i];
}
void Judge(sCard &cpu,sCard &player)
{
printf("您的牌点为%d,计算机的牌为%d\n",GetPip(player),GetPip(cpu));
if(cpu_bao==0&&player_bao==0)
{
if(GetPip(player)==GetPip(cpu))
{
Draw(player);
}
else if(GetPip(player)>GetPip(cpu))
{
Win(player);
}
else
{
Lose(player);
}
}
else
{
if(player_bao!=0)
Lose(player);
if(cpu_bao!=0)
Win(player);
}
}
void Draw(sCard &sc)
{
printf("平局\n");
sc.nDraw++;
}
void Win(sCard &sc)
{
printf("你赢了\n");
sc.nWin++;
sc.nDollar+=sc.nGamble;
}
void Lose(sCard &sc)
{
printf("你输了\n");
sc.nLose++;
sc.nDollar-=sc.nGamble;
}