21点游戏

#include<iostream>
#include<ctime>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <time.h>
using namespace std;
int gCard[52];
int e=1;
struct sCard
{
int naPip[5];           //一共5张牌
int nNumber;            //发了多少张牌
int nDollar;            //有多少钱
int nGamble;            //赌注
int nWin;               //赢局数
int nLose;              //输局数
int nDraw;              //平局数
};
int a[53];
void initcards(int a[]); //初始化牌: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, int 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()
{
    initcards(a);
    shuffle(a);
srand((unsigned)time(NULL));
sCard cpu, player;
init(cpu);
init(player);
int blLogic;
int nMoney;
DisplayRule();
char chChoice;
cout<<"是否现在开始游戏(Y/N)?\n";
cin>>chChoice;
while(chChoice=='Y'||chChoice=='y')
{
   e=1;
   memset(player.naPip,0,sizeof(player.naPip));
   memset(cpu.naPip,0,sizeof(cpu.naPip));
   shuffle(a);
do
{
cout<<"您现在有赌本:$"<<GetMoney(player);
cout<<"\n请下注(赌注不能超过赌本):";
cin>>nMoney;
player.nGamble=nMoney;
blLogic = SetGamble(player, nMoney);
if(blLogic)
cout<<"您的赌本不够,请重新下注!\n";
}while(blLogic);
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(int a[])
{
    int i;
    for(i=1;i<=52;i++)
    {
        a[i]=i%13+1;
    }
}
void shuffle(int a[])  //洗牌
{
     int i;
     for(i=1;i<=53;i++)
     {
         int x,y;
         x=rand()%52+1;
         y=rand()%52+1;
         int t;
         t=a[x];a[x]=a[y];a[y]=t;
     }


}


void init(sCard &sc)
{
     memset(sc.naPip,0,sizeof(sc.naPip));
     sc.nNumber=0;
     sc.nDollar=100;
     sc.nGamble=0;
     sc.nWin=0;
     sc.nLose=0;
     sc.nDraw=0;
}


void DisplayRule()
{
     cout<<"此游戏称为21点游戏,该游戏由2到6个人玩,使用除大小王之外的52张牌,\n";
     cout<<"游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。\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,sum=0,i=2, p=0,q=0;
    char chChoice;
    FirstPlayTwo(cpu,player);  //最初两张牌
do
{
cout<<"您的牌点为:";
DisplayPip(player);
cout<<"计算机的牌点为:";
DisplayPip_C(cpu);
sum=GetPip(player);        //返回点数
cout<<"您的牌面点数为:"<<sum<<endl;
if(blPlayer)
{
cout<<"\n\n您是否继续要牌(Y/N)?";
cin>>chChoice;


getchar();
if((chChoice=='Y'||chChoice=='y'))
{
if(player.nNumber<=5)
{
                    TurnPlay(cpu,player,1);  //要一张牌,flag为true时player要牌,flag为false时cpu要牌
cout<<"您要的这张牌是:"<<GetCurrentCard(player)<<endl;


                    player.nNumber++;
                    if(GetPip(player)>21)
                        {p=1;break;}
}
else
{
cout<<"对不起,您已经要了5次牌了。不能再要牌了!";
                    break;
}
}
}
if((chChoice=='N'||chChoice=='n'))
blPlayer=0;
if(GetPip(cpu)<16&&cpu.nNumber<5)   //cpu点数小于16点且牌数小于5张
{
            TurnPlay(cpu,player,0);  //要一张牌,flag为true时player要牌,flag为false时cpu要牌
cout<<"计算机要牌,牌点是:"<<GetCurrentCard(cpu)<<endl;//返回当前牌点
if(GetPip(cpu)>21)
                        {q=1;break;}
cpu.nNumber++;
}
else
blCpu=0;
if(blCpu&&GetNumber(player)<5&&GetPip(player)<21)
blPlayer=1;
}while(blCpu||blPlayer);
printf("您的牌为 ");
DisplayPip(player);
printf("您的牌点为 ");
printf("%d\n",GetPip(player));
printf("电脑的牌为 ");
DisplayPip(cpu);
printf("电脑牌点为 ");
printf("%d\n",GetPip(cpu));


if(p==1)
    {
        printf("您的牌爆掉,本局失败\n");
        Lose(player);
    }
    else
    if(q==1)
    {
        printf("电脑的牌爆掉,本局成功\n");
        Win(player);
    }
    else
  Judge(cpu,player);
}


void DisplayInfo(sCard sc)
{
cout<<"您一共玩了"<<sc.nWin+sc.nLose+sc.nDraw<<"局,"<<"赢了"<<sc.nWin<<"局,"<<"输了"<<sc.nLose<<"局,"<<"平局"<<sc.nDraw<<"次。"<<endl;
cout<<"你的赌本共计有$"<<sc.nDollar<<endl;
}


void FirstPlayTwo(sCard &cpu, sCard &player)
{
    cpu.naPip[0]=a[e++];
    cpu.nNumber++;


    cpu.naPip[1]=a[e++];
    cpu.nNumber++;


    player.naPip[0]=a[e++];
    player.nNumber++;


    player.naPip[1]=a[e++];
    player.nNumber++;


}


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 sum=0,i;
     for(i=0;sc.naPip[i];i++)
     {
         if(sc.naPip[i]>=10)
            sum+=10;
         else
            sum+=sc.naPip[i];
     }
     return sum;
}


int GetNumber(sCard sc)
{
     return sc.nNumber;
}


void TurnPlay(sCard &cpu, sCard &player,int flag)
{
     int i;
     if(flag==1)
     {
         for(i=0;i<5;i++)
         {
             if(player.naPip[i]==0)
             {
                 player.naPip[i]=a[e++];
                 break;
             }
         }
     }
     if(flag==0)
     {
         for(i=0;i<5;i++)
         {
             if(cpu.naPip[i]==0)
             {
                 cpu.naPip[i]=a[e++];
                 break;
             }
         }
     }
}


int GetCurrentCard(sCard sc)
{
    int n=0,i;
    for(i=4;i>=0;i--)
    {
        if(sc.naPip[i]!=0)
        {


                return sc.naPip[i];
        }
    }


}


void Judge(sCard &cpu,sCard &player)
{
if(GetPip(cpu)==GetPip(player))
{
Draw(player);
printf("您与电脑平局\n");
}
else if(GetPip(cpu)<GetPip(player))
{
Win(player);
printf("恭喜您取得本局胜利\n");
}
else
{
Lose(player);
printf("很遗憾 本局您输了\n");
}
}


void Draw(sCard &sc)
{
     sc.nDraw++;
}


void Win(sCard &sc)
{
    sc.nWin++;
    sc.nDollar+=sc.nGamble;
}


void Lose(sCard &sc)
{
   sc.nLose++;
   sc.nDollar-=sc.nGamble;
}

猜你喜欢

转载自blog.csdn.net/zcy19990813/article/details/80832355