21点

#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;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值