#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
char POKE[13][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};//扑克牌对应0-12
int menu()
{
int chioce;
system("cls");
printf("1:开始游戏\n");
printf("2:游戏帮助\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&chioce);
while(chioce<0||chioce>3)//判断选择范围是不是0-3
{
printf("请重新输入:");
scanf("%d",&chioce);
}
return chioce;//返回给主函数
}
void Help()
{
system("cls");
printf("计分规则:2点至10点的牌以牌面的点数来相加,J、Q、K 每张为10点.\n");
printf("A可记为1点或为11点,若玩家会因A而爆牌则A可算为1点\n");
printf("不超过21点且最接近的玩家为赢家\n");
system("pause");
}
void Shuffle(int poke[],int n)//对扑克进行洗牌
{
int i,j,temp;
memset(poke,0,sizeof(int)*52);//所有牌先变成0
srand(time(NULL));//初始化随机数种子
for(i=1;i<14;i++)//1-13 代表A 23456789 10 JQK
{
for(j=0;j<4;j++)//每种牌有4张
{
do
{
temp=rand()%52;//随机产生一个0-51的数
}while(poke[temp]!=0);//如果不是0 说明已经有其它牌
poke[temp]=i;//牌放入
}
}
}
int judge_end(int flag[])//判断是否全部选择不接受发牌 不接受包括玩家自己不要 还有爆掉
{
int i;
int sum=0;
for(i=0;i<4;i++)
{
if(flag[i]==1)
{
sum++;
}
}
if(sum==4)
{
return 0;
}
return 1;
}
int judge_win(int people[])//判断玩家是不是有三个人爆掉 有的话剩下一个是赢家
{
int i;
int sum=0;
for(i=0;i<4;i++)
{
if(people[i]>21)
{
sum++;
}
}
if(sum==3)
{
return 0;
}
return 1;
}
int Winner(int people[])//判断赢家是哪一个
{
int i,who,max;
who=0;
max=0;
for(i=0;i<4;i++)
{
if(people[i]<=21&&people[i]>max)
{
who=i;
max=people[i];
}
}
return who+1;
}
void Start_Game()
{
int i;
int FLAG=1;
int poke[52];
char chioce[20];
int cursor=0;//记录发牌到哪里了
int people[4]={0};//记录四个人的当前分数
int flag[4]={0};
system("cls");
Shuffle(poke,52);//先洗牌
do//如果没有出现赢家 一直循环
{
for(i=0;i<4;i++)//4个人 轮流发牌
{
printf("玩家%d当前点数为:%d\n",i+1,people[i]);
if(people[i]>21)//如果点数大于21
{
printf("玩家%d已经超过21点,不给于发牌!\n\n",i+1);
flag[i]=1;
continue;//跳过该玩家
}
printf("请玩家%d选择是否接受发牌(y/n):",i+1);
fflush(stdin);
scanf("%s",chioce);
if(!strcmp(chioce,"Y")||!strcmp(chioce,"y"))//如果接受发牌
{
printf("该牌为:%s\n",POKE[poke[cursor]-1]);//显示牌型
switch(poke[cursor])//根据点数
{
case 1:
if(people[i]+11<=21)//如果是A 可以11或者1
{
people[i]+=11;
}
else
{
people[i]+=1;
}
break;
case 10:
case 11:
case 12:
case 13:
people[i]+=10;//10 J Q K的情况
break;
default:
people[i]+=poke[cursor];//23456789的情况
break;
}
printf("玩家%d当前点数为:%d\n\n",i+1,people[i]);
cursor++;//牌向后移动1
if(people[i]>21)
{
flag[i]=1;//爆掉的玩家
}
if(judge_win(people)==0)//如果只剩下一个玩家没爆掉
{
FLAG=0;//跳出发牌 跳出死循环
break;
}
}
else
{
flag[i]=1;
}
if(judge_end(flag)==0)//如果有4个人不需要发牌
{
FLAG=0;//跳出循环
break;
}
}
}while(FLAG);
for(i=0;i<4;i++)
{
printf("玩家%d的点数是:%d\n",i+1,people[i]);
}
printf("获胜的是玩家%d\n\n",Winner(people));
system("pause");
}
int main()
{
int chioce;
do
{
chioce=menu();
switch(chioce)
{
case 1:
Start_Game();//开始游戏
break;
case 2:
Help();//显示帮助
break;
}
}while(chioce!=0);//如果不是选择退出游戏 一直循环
return 0;
}
21点
最新推荐文章于 2022-05-02 10:55:57 发布