c语言的21点
❶ 用c语言实现一个电脑坐庄,你当玩家的21点游戏这是一个C语言程序,跪求C语言大神解答!!!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NULL 0
int compare(char sum1,char sum2)
{
if(sum1>=sum2)
return 1;
else
return 0;
}
int breakal(int sum)
{
if(sum>21)
return 0;
else
return 1;
}
char change(int card)
{
char ch,n,m,x;
switch(card)
{
case 1: ch='A';
break;
case 10:
{
n=1+int(rand()/(RAND_MAX+1.0));
if(n==1)
ch='K';
else
{
m=1+int(rand()/(RAND_MAX+1.0));
if(m==1)
ch='Q';
else
{
x=1+int(rand()/(RAND_MAX+1.0));
if(x==1)
ch='J';
}
}
break;
}
} //以上switch语句用于将数字转换成字符
return ch;
}
void game()
{
int i,k,n;
char host_ch,player_ch,host_card[15],player_card[15];
int host_sum=0,player_sum=0;
srand(time(NULL));
for(i=0;i<2;i++)
{
int (10.0*rand()/(RAND_MAX+1.0));
player_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0));
player_ch=change(player_card[i]);
if(player_card[i]>1 && player_card[i]<10) //输出玩家抽到的牌的点数
printf("您抽到的第%d张牌是%d\n",i+1,player_card[i]);
else if(player_card[i]==10)
printf("您要到的第%d张牌是%c\n",i+1,player_ch);
else
printf("您要到的第%d张牌是A\n",i+1);
if(player_ch=='A') //询问判断玩家的A的点值为1或11
{
printf(" 您有一张A,您想要A作1还是11?\n");
printf(" 1. 1\n" );
printf(" 2. 11\n");
if(scanf("%d",&n) && n==1)
player_card[i]=1;
else
player_card[i]=11;
}
host_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0));
host_ch=change(host_card[i]);
if(host_ch=='A') //电脑自动判断庄家的A的点值为1或11
{
k=1+int(rand()/(RAND_MAX+1.0));
if(k==1)
host_card[i]=11;
else
host_card[i]=1;
}
player_sum+=player_card[i]; //分别对庄家和玩家的点数求和
host_sum+=host_card[i];
}
printf("您现在的总面值为%d\n",player_sum);//输出玩家的总面值
for(i=2;i<5;i++)
{
if(host_sum<18 && host_sum>0)//电脑自动判断庄家是否要牌
{
host_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0));
host_ch=change(host_card[i]);
if(host_ch=='A') //电脑自动判断庄家的A的点值为1或11
{
k=1+int(rand()/(RAND_MAX+1.0));
if(k==1)
host_card[i]=11;
else
host_card[i]=1;
}
host_sum+=host_card[i];
}
printf("您还要继续要牌吗?\n");
printf(" 1.要\n");
printf(" 2.不要\n");
scanf("%d",&k);
if(k==1)
{
{
player_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0));
player_ch=change(player_card[i]);
if(player_ch=='A') //询问判断玩家的A的点值为1或11
{
printf("您有一张A,您想要A作1还是11?\n");
printf(" 1. 1\n" );
printf(" 2. 11\n");
if(scanf("%d",&n) && n==1)
player_card[i]=1;
else
player_card[i]=11;
printf("您要到的第%d张牌是A\n",i+1);
}
else
printf("您要到的第%d张牌是%d\n",i+1,player_card[i]);
player_sum+=player_card[i];
if(i==4)
printf("您手中已有5张牌,一决胜负的时刻到啦!\n");
if(breakal(host_sum)==0)
{
if(breakal(player_sum)==0)
{
printf("庄家爆牌了,您也爆牌了!庄家的牌面值是%d,您的牌面值是%d\n",host_sum,player_sum);
printf("\nYou lose..\n");
break;
}
}
else
if(breakal(player_sum)==0)
{
printf("您爆牌了!您的牌面值是%d\n \nYou lose..\n",player_sum);
break;
}
}
if(breakal(host_sum)==0)
{
printf("庄家爆牌了!庄家的牌面值是%d\n",host_sum);
printf("\nCongratulations! YOu win!\n");
break;
}
}
else
{
printf("庄家的牌面值是%d,您的牌面值是%d\n",host_sum,player_sum);
if(compare(host_sum,player_sum)==1)
printf("\nYou lose..\n");
else
printf("\nCongratulations! You win!\n");
break;
}
}
}
int main()
{
kaishi:
int n;
printf(" 欢迎进入21点游戏!\n");
printf(" ************************************\n");
printf(" 1.开始游戏\n");
printf(" 2.退出游戏\n");
printf(" ************************************\n");
if(scanf("%d",&n)&&n==1)
game();
else if(n==2)
{
printf(" ******************************\n");
printf(" 游戏结束!祝您愉快!\n");
printf("\n\n");
printf(" 再见!\n");
printf(" ******************************\n");
return 0;
}
goto kaishi;
}
❷ 初学者C语言 21点游戏发牌, 下面这段是什么意思拜托能不能一步一步解释下~~谢谢~~
void fapai(int* who,int* len) //发牌函数
{
while(1)
{
int temp = rand()%52; //随机取一张牌
if(pai[temp]==0) //如此牌还在
{
pai[temp]=1, who[(*len)++]=temp%13; //标记此牌已发,将此牌的点数记入who数组
return;
}
}
}int calc(int* who,int len) //计算总点数
{
int s=0,i;
for(i=0;i<len;i++) //对每一张牌
s+=who[i]>9 ? 10 : (who[i]+1); //s=s+who[i];who[i]>9,则who[i]=10,否则who[i]=who[i]+1.
//牌点大于9的,记10分,否则记1分
if(s>21) s=0; //若超过21分,则“爆了”,清0
else if(s<=12) //若点数不满13
{
for(i=0;i<len;i++)
if(who[i]==0 && s<=12) //若第i张牌为0,补加9点
s+=9; //s=s+9
}
return s;
}
❸ C语言21点循环问题
你在第一次选择Y的时候实际上输入了两个字符,一个‘Y',一个’\n'(回车符),scanf接受'Y'将其赋给d,但是回车符还在输入流中等待被接受,因此在第二次选择scanf就把'\n'赋给了变量d,所以会出现这错误,在scanf("%c",&d)前加一句"while(getchar()!='\n');"吸收掉回车符就能解决这个问题
❹ C语言大神帮忙,21点游戏
#include<stdio.h>
int main()
{
int a[4], sum = 0;
printf("请输入三张牌");
scanf("%d%d%d", &a[0], &a[1], &a[2]);
for(int i = 0; i < 3; I++)
{
if(a[i] > 10) sum += 10;
else
sum += a[i];
}
for(int i = 0; i < 3; i++)
{
if(a[i] == 1 && sum + 10 <= 21)
sum += 10;
}
printf("总值为:%d\n", sum);
return 0;
}
请采纳,谢谢
❺ C语言21点游戏求大师指点
这些问题应该都是因为scanf函数后输入缓冲中残存的 回车被下一个 scanf直接接收到的原因。
解决这个问题可以在每个 scanf函数前加一个 fflush(stdin);清除缓冲区。或者都在后面加