算是一个课程作业吧,找个地方存一下。小生学疏才浅,若程序中有不当的地方或是可以改进的地方,也欢迎各位大神指点指点,要是有后辈看了觉得有帮助更是小生的荣幸。
扎金花这个游戏就不在此多作介绍了,那么下面就是源代码。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
struct card//结构体定义一副牌
{
int color;
int number;
}poker[60];
void makecard()//生成这副牌
{
int i;
for(i=0;i<52;i++)
{
poker[i].color=1+i/13;
poker[i].number=i%13+2;
}
}
void getcard(int p1[],int p2[])//发牌
{
srand((unsigned)time(NULL));
int k=0,i,j,array[52],a;
array[k]=rand()%52+0;//直接产生第一个随机数
while(1)
{
a=rand()%52+0;//每做一次while循环产生一个随机数
for(j=0;j<=k;j++)
{
if(array[j]==a)//如果一样则不放入数组中 同时终止for循环
{break;}
else if (j==k)//不一样就放入
{
k++;
array[k]=a;
}
}
if(k==51)//产生了52个不一样的数就终止while循环
{break;}
}
for(i=0;i<3;i++)
{
p1[i] = poker[array[i]].number;
p1[i+3]=poker[array[i]].color;
}
for(i=0;i<3;i++)
{
p2[i] = poker[array[i+3]].number;
p2[i+3]=poker[array[i+3]].color;
}
}
void showcard(int a[],FILE *fp)
{
int i;
for(i=0;i<3;i++)
{
switch(a[i+3])
{
case 1:printf("黑桃."),fprintf(fp,"黑桃.");break;
case 2:printf("红桃."),fprintf(fp,"红桃.");break;
case 3:printf("梅花."),fprintf(fp,"梅花.");break;
case 4:printf("方片."),fprintf(fp,"方片.");break;
}
switch(a[i])
{
case 11:printf("J "),fprintf(fp,"J ");break;
case 12:printf("Q "),fprintf(fp,"Q ");break;
case 13:printf("K "),fprintf(fp,"K ");break;
case 14:printf("A "),fprintf(fp,"A ");break;
default:printf("%d ",a[i]),fprintf(fp,"%d ",a[i]);break;
}
}
}
int baozi(int a[])//判断豹子
{
if(a[0] == a[1] && a[1] == a[2])
return 1;
else
return 0;
}
int tonghua(int a[])//判断同花
{
if(a[3] == a[4] && a[4] == a[5])
return 1;
else
return 0;
}
int shunzi(int a[])//判断顺子
{
int s1,s2,s3;
if(a[0] < a[1] && a[0] < a[2])
{
s1=a[0];
if (a[1] < a[2]){ s2=a[1] ; s3=a[2];}
else { s2=a[2] ; s3=a[3];}
}
else if( a[1] < a[0] && a[1] < a[2])
{
s1=a[1];
if(a[0] < a[2]){s2=a[0];s3=a[2];}
else{s2=a[2];s3=a[0];}
}
else
{
s1=a[2];
if(a[0] < a[1]){s2 = a[0] ; s3 = a[1];}
else{s2= a[1];s3= a[0];}
}
if(s3-s2==1&&s2-s1==1)
return 1;
else
return 0;
}//判断顺子
int duizi(int a[])//判断对子
{
if(a[0] ==a[1] || a[1] == a[2] || a[0] == a[2])
return 1;
else
return 0;
}
int lianghua(int a[],int hs)//判断是否有两种花色相同
{
if ( (a[3] == a[4] && a[3] == hs) || (a[4] == a[5] && a[4]==hs) || (a[3] == a[5] && a[5] == hs) )
{return 1;}
else
{return 0;}
}
int max(int i,int j,int k)
{
int mx = i;
if(j > mx)
{mx = j;}
if(k > mx)
{mx = k;}
return mx;
}
int max2(int i , int j)
{
int mx=i;
if(j > mx)
{mx = j;}
return mx;
}
int min3(int i,int j,int k)
{
int mn = i;
if(j< mn)
{mn = j;}
if(k < mn)
{mn = k;}
return mn;
}
int min(int i,int j,int k,int a[])//取得最小值所在的数组中的位置
{
int mn = a[i],m = i;
if(a[j] < mn)
{mn = a[j];
m = j;}
if(a[k] < mn)
{mn = a[k];
m = k;}
return m;
}
int min2(int i,int j)
{
int mn= i;
if(j < mn)
{mn = j;}
return mn;
}
void xiangtong(int i,int j,int k,int a[],int *m,int *n)
{
if(a[i] == a[j])
{*m = i,*n = j;}
if(a[i] == a[k])
{*m = i,*n = k;}
if(a[j] == a[k])
{*m = j,*n = k;}
}
int mid(int a[])
{
int md = a[0];
if( ((a[1]<a[2]) && (a[1]>a[0]) )|| ((a[1]<a[0]) && (a[1]>a[2])))
{
md=a[1];
}
if( ((a[2]<a[1]) && (a[2]>a[0]) )|| ((a[2]<a[0]) && (a[2]>a[1])))
{
md=a[2];
}
return md;
}
int main()
{
int play1[10],play2[10];//将牌的数值花色以及牌型的大小储存在两个玩家的数组里
char num[5];
int i,n,px1,px2,hs1,hs2,j,k,start,cl1,cl2,cl3,cl4,co1,co2,dz1,dz2,th1,th2;
int sz1,sz2,sz3,sz4,p1,p2,lh1,lh2;
int *p = &i;
int *q = &n;
makecard();
flag : play1[6]=0,play2[6]=0;
FILE *fp;
fp=fopen("test.txt","a+");
printf("扎金花,游戏开始了!!!\n");
printf("输入1手动输入牌型,输入2自动发牌");//手动输入牌型是检验牌型大小是否能够正确被比较的
scanf("%d",&n);
fflush(stdin);
while(n!=1 && n!=2)
{
printf("请输入1或2");
scanf("%d",&n);
fflush(stdin);
}
if (n == 1)
{
flag2:printf("请输入您的三张牌的花色:");
scanf("%d,%d,%d",&play1[3],&play1[4],&play1[5]);
fflush(stdin);
while( play1[3]<1 || play1[3]>4 || play1[4]<1 || play1[4]>4 || play1[5]<1 || play1[5]>4 )
{
printf("请输入正确的花色(1——4)!\n");
scanf("%d,%d,%d",&play1[3],&play1[4],&play1[5]);
fflush(stdin);
}
printf("请输入您的三张牌的数值:");
scanf("%c,%c,%c",&num[0],&num[1],&num[2]);
fflush(stdin);
while( (num[0]!='2' && num[0]!='3' && num[0] !='4' && num[0] !='5' && num[0] !='6' && num[0] !='7' && num[0] !='8' && num[0] !='9' && num[0] != 'T' && num[0] != 'J' && num[0] != 'Q' && num[0] != 'K' && num[0] != 'A') ||
(num[1]!='2' && num[1]!='3' && num[1] !='4' && num[1] !='5' && num[1] !='6' && num[1] !='7' && num[1] !='8' && num[1] !='9' && num[1] != 'T' && num[1] != 'J' && num[1] != 'Q' && num[1] != 'K' && num[1] != 'A') ||
(num[2]!='2' && num[2]!='3' && num[2] !='4' && num[2] !='5' && num[2] !='6' && num[2] !='7' && num[2] !='8' && num[2] !='9' && num[2] != 'T' && num[2] != 'J' && num[2] != 'Q' && num[2] != 'K' && num[2] != 'A') )
{
printf("请输入正确的数值(2——9以及T、J、Q、K)!\n");
scanf("%c,%c,%c",&num[0],&num[1],&num[2]);
fflush(stdin);
}
for(i=0;i<3;i++)
switch(num[i])
{
case 'T':play1[i]=10;break;
case 'J':play1[i]=11;break;
case 'Q':play1[i]=12;break;
case 'K':play1[i]=13;break;
case 'A':play1[i]=14;break;
default:play1[i]= num[i] - '0';break;
}
if( ((play1[0] == play1[1]) && (play1[3] == play1 [4])) || ((play1[0] == play1[2]) && (play1[3] == play1 [5])) || ((play1[2] == play1[1]) && (play1[5] == play1 [4])) )
{
printf("请输入不重复的牌\n");
goto flag2;
}
flag3:printf("请输入对手的三张牌的花色:");
scanf("%d,%d,%d",&play2[3],&play2[4],&play2[5]);
fflush(stdin);
while(play2[3]<1 || play2[3]>4 || play2[4]<1 || play2[4]>4 || play2[5]<1 || play2[5]>4)
{
printf("请输入正确的花色(1——4)!\n");
scanf("%d,%d,%d",&play2[3],&play2[4],&play2[5]);
fflush(stdin);
}
printf("请输入对手的三张牌的数值:");
scanf("%c,%c,%c",&num[0],&num[1],&num[2]);
fflush(stdin);
while( (num[0]!='2' && num[0]!='3' && num[0] !='4' && num[0] !='5' && num[0] !='6' && num[0] !='7' && num[0] !='8' && num[0] !='9' && num[0] != 'T' && num[0] != 'J' && num[0] != 'Q' && num[0] != 'K' && num[0] != 'A') ||
(num[1]!='2' && num[1]!='3' && num[1] !='4' && num[1] !='5' && num[1] !='6' && num[1] !='7' && num[1] !='8' && num[1] !='9' && num[1] != 'T' && num[1] != 'J' && num[1] != 'Q' && num[1] != 'K' && num[1] != 'A') ||
(num[2]!='2' && num[2]!='3' && num[2] !='4' && num[2] !='5' && num[2] !='6' && num[2] !='7' && num[2] !='8' && num[2] !='9' && num[2] != 'T' && num[2] != 'J' && num[2] != 'Q' && num[2] != 'K' && num[2] != 'A') )
{
printf("请输入正确的数值(2——9以及T、J、Q、K)!\n");
scanf("%c,%c,%c",&num[0],&num[1],&num[2]);
fflush(stdin);
}
for(i=0;i<3;i++)
switch(num[i])
{
case 'T':play2[i]=10;break;
case 'J':play2[i]=11;break;
case 'Q':play2[i]=12;break;
case 'K':play2[i]=13;break;
case 'A':play2[i]=14;break;
default:play2[i]= num[i] - '0';break;
}
if( ((play2[0] == play2[1]) && (play2[3] == play2[4])) || ((play2[0] == play2[2]) && (play2[3] == play2[5])) || ((play2[2] == play2[1]) && (play2[5] == play2[4])) )
{
printf("请输入不重复的牌\n");
goto flag3;
}
}
if (n == 2)
{
getcard(play1,play2);
}
printf("你的牌是:");fprintf(fp,"你的牌是:");
showcard(play1,fp);
printf("\n");fprintf(fp,"\n");
printf("发牌完毕,输入1开始对决:");
scanf("%d",&start);
fflush(stdin);
while(start != 1)
{printf("请输入1!");
scanf("%d",&start);
fflush(stdin);
}
printf("电脑的牌是:");fprintf(fp,"电脑的牌是:");
showcard(play2,fp);
printf("\n");
px1=baozi(play1)+tonghua(play1)+shunzi(play1)+duizi(play1);//判断有没有牌型
px2=baozi(play2)+tonghua(play2)+shunzi(play2)+duizi(play2);
if (px1 !=0 && px2!=0)//都有牌型
{
play1[7]=baozi(play1);//baozi
play2[7]=baozi(play2);//baozi
if (play1[7] + play2[7] != 0)
{
if(play1[7] == 1)
{
play1[6] = play1[6]+7000;
}
if(play2[7] == 1)
{
play2[6] = play2[6]+7000;
}
}//baozi
play1[7]=tonghua(play1);//同花
play2[7]=tonghua(play2);
if (play1[7] + play2[7] !=0)
{
if(play1[7] == 1)
{
if(play1[3] == 4)
{play1[6] = play1[6]+2000;}
if(play1[3] == 3)
{play1[6] = play1[6]+3000;}
if(play1[3] == 2)
{play1[6] = play1[6]+4000;}
if(play1[3] == 1)
{play1[6] = play1[6]+5000;}
}
if(play2[7] == 1)
{
if(play2[3] == 4)
{play2[6] = play2[6]+2000;}
if(play1[3] == 3)
{play2[6] = play2[6]+3000;}
if(play2[3] == 2)
{play2[6] = play2[6]+4000;}
if(play1[3] == 1)
{play2[6] = play2[6]+5000;}
}
if((play1[7] == play2[7] )&& (play1[7] == 1) && (shunzi(play1) ==0))
{
th1=max(play1[0],play1[1],play1[2]);
th2=max(play2[0],play2[1],play2[2]);
if(th1 > th2)
{
printf("您赢了\n");fprintf(fp,"您赢了\n");goto flag4;
}
if(th1 < th2)
{
printf("电脑赢了\n");fprintf(fp,"电脑赢了\n");goto flag4;
}
if(th1 == th2)
{
th1=mid(play1);
th2=mid(play2);
if(th1 > th2)
{
printf("您赢了\n");fprintf(fp,"您赢了\n");goto flag4;
}
if(th1 < th2)
{
printf("电脑赢了\n");fprintf(fp,"电脑赢了\n");goto flag4;
}
}
}
}//同花
play1[7]=shunzi(play1);//shunzi
play2[7]=shunzi(play2);
if(play1[7] + play2[7] != 0)
{
if(play1 [7] == 1)
{
play1[6]= play1[6] +500;
sz1=max(play1[0],play1[1],play1[2]);
}
if(play2[7] == 1)
{
play2[6]=play2[6]+500;
sz2=max(play2[0],play2[1],play2[2]);
}
if(sz1 == sz2)
{
sz3 = min3(play1[3],play1[4],play1[5]);
sz4 = min3(play2[3],play2[4],play2[5]);
if(sz3 < sz4)
{
play1[6] = play1[6] + 100;
}
if(sz3 > sz4)
{
play2[6] = play2[6] + 100;
}
}
}//shunzi
play1[7]=duizi(play1);//对子
play2[7]=duizi(play2);
if(play1[7] + play2[7] != 0)
{
if(play1 [7] == 1)
{
if(play1[0] == play1[1])
{dz1=play1[0];
cl1=play1[3],cl2=play1[4];}
if(play1[1] == play1[2])
{dz1=play1[1];
cl1=play1[4],cl2=play1[5];}
if(play1[0] == play1[2])
{dz1=play1[2];
cl1=play1[3],cl2=play1[5];}
play1[6]= play1[6] +40;
}
if(play2 [7] == 1)
{
if(play2[0] == play2[1])
{dz2=play1[0];
cl3=play2[3],cl4=play2[4];}
if(play2[1] == play2[2])
{dz2=play2[1];
cl3=play2[4],cl4=play2[5];}
if(play2[0] == play2[2])
{dz2=play2[2];
cl3=play2[3],cl4=play2[5];}
play2[6]= play2[6] +40;
}
if(dz1 == dz2)
{
co1=min2(cl1,cl2);
co2=min2(cl3,cl4);
if(co1 < co2)
{
play1[6] = play1[6] + 25;
}
if(co1 > co2)
{
play2[6] = play2[6] +25;
}
}
}
play1[6] = play1[6]+play1[0]+play1[1]+play1[2];
play2[6] = play2[6]+play2[0]+play2[1]+play2[2];
if (play1[6] > play2[6])
{
printf("恭喜您获胜了!\n");fprintf(fp,"恭喜您获胜了!\n");
}
if(play2[6]>play1[6])
{
printf("很遗憾电脑获胜了!\n");fprintf(fp,"很遗憾电脑获胜了!\n");
}
}//都有牌型
if(px1 !=0 && px2 == 0)//一有一没
{
printf("恭喜您获胜了!\n");fprintf(fp,"恭喜您获胜了!\n");
}
if(px1 == 0 && px2!=0)
{
printf("很遗憾电脑获胜了!\n");fprintf(fp,"很遗憾电脑获胜了!\n");
}//一有一没
if(px1 == 0 && px2 == 0)//没有
{
j=min(3,4,5,play1);
k=min(3,4,5,play2);
hs1=play1[j];
hs2=play2[k];
if(hs1 > hs2)
{printf("很遗憾电脑获胜了!\n");fprintf(fp,"很遗憾电脑获胜了!\n");}
if(hs1 < hs2)
{printf("恭喜您获胜了!\n");fprintf(fp,"恭喜您获胜了!\n");}
if(hs1 == hs2)
{
lh1=lianghua(play1,hs1);
lh2=lianghua(play2,hs2);
if(lh1 + lh2 == 0)
{
printf("%d,%d\n",hs1,hs2);
printf("%d,%d\n",play1[j-3] , play2[k-3]);
if(play1[j-3] > play2[k-3])
{printf("恭喜您获胜了!\n");fprintf(fp,"恭喜您获胜了!\n");}
if(play1[j-3] < play2[k-3])
{printf("很遗憾电脑获胜了!\n");fprintf(fp,"很遗憾电脑获胜了!\n");}
}
else
{
xiangtong(3,4,5,play1,p,q);
p1=max2(play1[(*p)-3],play1[(*q)-3]);
xiangtong(3,4,5,play2,p,q);
p2=max2(play2[(*p)-3],play2[(*q)-3]);
if (p1 > p2)
{printf("恭喜您获胜了!\n");fprintf(fp,"恭喜您获胜了!\n");}
if (p2 > p1)
{printf("很遗憾电脑获胜了!\n");fprintf(fp,"很遗憾电脑获胜了!\n");}
}
}
}
flag4:printf("是否继续(1/0)\n");
printf("--------------------------------------\n");
fprintf(fp,"--------------------------------------\n");
scanf("%d",&i);
fflush(stdin);
if(i==0)
return 0;
else
{goto flag;}
}
也是第一次写博客,以后大概也会存一些作业进来,还请各位大佬多多指教!