?? 大家一起來玩十點半.txt
字號:
大家一起來玩十點半
/*一副撲克(除去王),第一輪玩者依次取一張牌,。之后玩者根據(jù)自己的牌總的點數(shù)
選擇繼續(xù)要牌或比較大小。(玩家可以選擇不要牌,但一旦選擇不要牌,以后就不能再要牌)
玩家的點數(shù)一旦超過10。5,不能再要牌。
j q k算0。5點。 如果牌總的點數(shù)都大于10。5 或都小于10。5,大者贏;
如果一個大于10。5而另一個小于10。5,小于10。5者勝。*/
/*2005-4-9 梁見斌*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct book{
int color;
char number;
float num;
} Card[52];/*用來存儲牌的花色,數(shù)字及所代表的點數(shù)*/
void Build_Show(int HuaSe[], float DianShu[], char ShuZi[]);/*建立一副新牌,并顯示給游戲者檢查*/
void Wash_Card(void);/*洗牌*/
void Get_Card(int n) ;/*按順序發(fā)牌并公布結果*/
void DuoRen(int n);
int main(void)
{
int flag, n;
int HuaSe[4]={3,4,5,6};/*存儲花色*/
char ShuZi[13]={'A','K','Q','J','0','9','8','7','6','5','4','3','2'};/*存儲數(shù)字*/
float DianShu[13]={1,0.5,0.5,0.5,10,9,8,7,6,5,4,3,2};/*存儲點數(shù)*/
Build_Show(HuaSe, DianShu, ShuZi);/*建立一副新牌,并顯示給游戲者檢查*/
do{
Wash_Card();/*洗牌*/
a: puts("\n請輸入玩家個數(shù)(1-8個):");
scanf("%d", &n);
switch(n)
{
case 1: puts("你和電腦玩");
break;
case 2: puts("你們兩個人玩");
break;
case 3: puts("你們三個人玩");
break;
case 4: puts("你們四個人玩");
break;
case 5: puts("你們五個人玩");
break;
case 6: puts("你們六個人玩");
break;
case 7: puts("你們七個人玩");
break;
case 8: puts("你們八個人玩");
break;
default : puts("玩家太多了");
goto a;
}
Get_Card(n);/*發(fā)牌并公布結果*/
do{
puts("\n你還要玩嗎?輸入1表示要,輸入0表示不要:");
fflush(stdin);
scanf("%d", &flag);
} while(flag != 1 && flag != 0);
} while(flag == 1);
getchar();
return 0;
}
void Build_Show(int HuaSe[], float DianShu[], char ShuZi[])
{
int i, j;
for(i=0; i<4; i++)/*建立一副新牌*/
for(j=0; j<13; j++)
{
Card[j+13*i].color = HuaSe[i];
Card[j+13*i].number = ShuZi[j];
Card[j+13*i].num = DianShu[j];
}
puts("這是一付新牌:"); /*顯示整副牌給游戲者檢查*/
for(i=0,j=0; i<52; i++,j++)
{
if(!(j%13))
printf("\n");
printf(" %c%c", Card[i].color , Card[i].number);
}
}
void Wash_Card(void)
{
int i, j, hua;
char dian;
float shu;
srand( (unsigned) time(NULL));
for(i=0; i<52; i++)
{
j=rand()%(52-i);/*隨機換牌,把牌的順序打亂*/
hua=Card[j].color;
Card[j].color=Card[51-i].color;
Card[51-i].color=hua;
dian=Card[j].number;
Card[j].number=Card[51-i].number;
Card[51-i].number=dian;
shu=Card[j].num;
Card[j].num=Card[51-i].num;
Card[51-i].num=shu;
}
}
void Get_Card(int n) /*按順序發(fā)牌并公布結果*/
{
int i=0, j=0, k=0, flag=1, flag2=1;
float sum_m=0, sum_c=0;
struct book Man[52], Computer[52];
if(n == 1)
{
while(flag == 1 && i < 52)
{
Man[j++]=Card[i++];/*人先拿牌*/
sum_m += Man[j-1].num;/*累計人拿到的總點數(shù)*/
if(flag2 == 1 && i < 52 && (sum_m <= 10.5 && sum_c <= 10.5 && (sum_c + Card[i].num) <= 10.5
|| sum_m > 10.5 && (sum_c + Card[i].num) >= sum_m)) /*讓電腦可以知道下一張牌,以便決定是否要牌*/
{
Computer[k++]=Card[i++];/*電腦拿牌*/
sum_c += Computer[k-1].num;/*累計電腦拿到的總點數(shù)*/
}
else
flag=0;
printf("\n");
puts("你現(xiàn)在拿到的牌為:");
for(int i=0; i<j; i++)
printf(" %c%c", Man[i].color , Man[i].number);
printf("\n你現(xiàn)在拿到的總點數(shù)為:%f\n", sum_m);
puts("電腦現(xiàn)在拿到的牌為:");
for(int i=0; i<k; i++)
printf(" %c%c", Computer[i].color , Computer[i].number);
printf("\n電腦現(xiàn)在拿到的總點數(shù)為:%f\n", sum_c);
if(sum_m <= 10.5)
{
do{
puts("你還要牌嗎?輸入1表示要,輸入0表示不要:");
fflush(stdin);
scanf("%d", &flag);
} while(flag != 1 && flag != 0);
if(i == 52)
{
puts("牌已經(jīng)拿光了!");
system("pause");
}
}
else
break;
} /*人不要牌后,電腦根據(jù)需要可以再拿牌,直到超過10.5*/
while(flag2 == 1 && i < 52 && (sum_m <= 10.5 && sum_c <= 10.5 && (sum_c + Card[i].num) <= 10.5
|| sum_m > 10.5 && (sum_c + Card[i].num) >= sum_m)) /*讓電腦可以知道下一張牌,以便決定是否要牌*/
{
Computer[k++]=Card[i++];
sum_c += Computer[k-1].num;
if( sum_c > 10.5)
break;
}
puts("好,現(xiàn)在公布結果:");
puts("你現(xiàn)在拿到的牌為:");
for(int i=0; i<j; i++)
printf(" %c%c", Man[i].color , Man[i].number);
printf("\n你現(xiàn)在拿到的總點數(shù)為:%f\n", sum_m);
puts("電腦現(xiàn)在拿到的牌為:");
for(int i=0; i<k; i++)
printf(" %c%c", Computer[i].color , Computer[i].number);
printf("\n電腦現(xiàn)在拿到的總點數(shù)為:%f\n", sum_c);
if((sum_m > 10.5 && sum_c > 10.5)||(sum_m <= 10.5 && sum_c <= 10.5))
if(sum_m > sum_c)
puts("你竟然贏了電腦!真是不可思議!");
else if(sum_m == sum_c)
puts("和電腦打成了平手,你的確實不錯");
else
puts("你輸給了電腦!看來需要多加練習!");
else if(sum_m <= 10.5 && sum_c > 10.5)
puts("你竟然贏了電腦!真是不可思議!");
else
puts("你輸給了電腦!看來需要多加練習!");
}
else
DuoRen(n);
}
void DuoRen(int n)
{
struct book Man[n][52];
int i, a[8]={0}, k=0, flag[8], flag2=1, s=0;
float sum[8]={0};
for(i=0; i<n; i++)/*每個人都要拿第一輪牌*/
{
printf("\n第 %d 個人拿牌 \t", i+1);
Man[i][a[i]++] = Card[k++];
sum[i] += Man[i][a[i]-1].num;
flag[i]=1;
printf("第 %d 個人手上的牌為:\t", i+1);
for(int m=0; m<a[i]; m++)
printf(" %c%c", Man[i][m].color , Man[i][m].number);
printf("\n第 %d 個人拿到的總點數(shù)為:%f\n", i+1, sum[i]);
}
while(flag2 == 1)/*當所有的人都不能拿牌時循環(huán)結束*/
{
for(i=0; i<n; i++)
{
if(k == 52)
{
puts("牌已經(jīng)拿光了!");
flag2=0;
break;
}
else if(flag[i] == 1 && sum[i] <= 10.5)/*當玩家有資格拿牌時可選擇是否拿牌*/
{
printf("\n\n第 %d 個人拿牌 \t", i+1);
do{
printf("你的總點數(shù)為:%f\n", sum[i]);
puts("你要牌嗎?輸入1表示要,輸入0表示不要:");
fflush(stdin);
scanf("%d", &flag[i]);
} while(flag[i] != 1 && flag[i] != 0);
if(flag[i] == 1)
{
Man[i][a[i]++] = Card[k++];
sum[i] += Man[i][a[i]-1].num;
printf("第 %d 個人手上的牌為:\t", i+1);
for(int m=0; m<a[i]; m++)
printf(" %c%c", Man[i][m].color , Man[i][m].number);
printf("\n第 %d 個人拿到的總點數(shù)為:%f\n", i+1, sum[i]);
}
}
if(sum[i] > 10.5)
flag[i]=0;
}
s=0;
for(i=0; i<n; i++) /*看是否所有的玩家都有資格拿牌*/
s += flag[i];
if(s == 0)
flag2=0;
}
puts("\n\n好,現(xiàn)在公布結果:");
for(i=0; i<n; i++)
{
printf("第 %d 個人手上的牌為:\t", i+1);
for(int m=0; m<a[i]; m++)
printf(" %c%c", Man[i][m].color , Man[i][m].number);
printf("\n第 %d 個人拿到的總點數(shù)為:%f\n", i+1, sum[i]);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -