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

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

#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;}
	 
}

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

猜你喜欢

转载自blog.csdn.net/weixin_44405843/article/details/90549565