模拟21点游戏

//#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;
}

猜你喜欢

转载自blog.csdn.net/septembre_/article/details/80832397
今日推荐