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);清除緩沖區。或者都在後面加