【C语言】大一小白的一个C语言扎金花小程序

    xiaoxiao2023-11-03  137

    算是一个课程作业吧,找个地方存一下。小生学疏才浅,若程序中有不当的地方或是可以改进的地方,也欢迎各位大神指点指点,要是有后辈看了觉得有帮助更是小生的荣幸。 扎金花这个游戏就不在此多作介绍了,那么下面就是源代码。

    #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+2; } } void getcard(int p1[],int p2[])//发牌 { srand((unsigned)time(NULL)); int k=0,i,j,array[52],a; array[k]=rand()R+0;//直接产生第一个随机数 while(1) { a=rand()R+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;} }

    也是第一次写博客,以后大概也会存一些作业进来,还请各位大佬多多指教!

    最新回复(0)