⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 b0226078_c8.c

📁 有多个程序, 传销, 取火柴, 二的N次方等
💻 C
字号:
#include<stdio.h>
#include<math.h>
#include<iostream.h>
#include<stdlib.h>
 int win=0,failure=0;
typedef struct bit
{
	int one;
	int two;
	int three;

};
int remain[4]/*={0,3,4,5}*/;    //全局变量
struct bit Bit[4];  //存储二进制的每一位
void menu()
{
	printf("游戏规则:\n");
	printf("\t-------------------------------------------------\n");
	printf("\t有三堆石子,分别为3块、4块、5块。两人轮流取,一次最\n\t多能取一堆,最少取一块。谁最一次谁取得,谁获胜!\n");
	printf("\t-------------------------------------------------\n");
}
int select()
{
	int select;
	printf("选择菜单:\n");
	printf("\t------------\n");
	printf("\t1.玩家先取  \n");
	printf("\t2.计算机先取\n");
	printf("\t------------\n");
	do
	{
		printf("\n请选择(1或2):\t");
		scanf("%d",&select);
	}while(select!=1 && select!=2);
	return select;
}//select()

int random_fetch(int a[],int n)
{ 
	int i;
	int qe;
	int k=1234;
	int random1,random2;
	for(i=1;i<n;i++)
		if(a[i]==0) break;
	do
	random1=(int)((rand()+k)%n);
	while(random1<1||random1==i);
	do
	random2=(int)((rand()+k/2)%(n+1));
	while(random2<1||random2>a[random1]);
	a[random1]=a[random1]-random2;
	qe=random1;
	k=k+7;
	return qe;
}
void convert(struct bit b[],int n)
{
	int i;
	for(i=1;i<4;i++)
	{
		switch(remain[i])
		{
		case 0: b[i].one=0;b[i].two=0;b[i].three=0; break;
		case 1: b[i].one=1;b[i].two=0;b[i].three=0; break;
		case 2: b[i].one=0;b[i].two=1;b[i].three=0; break;
		case 3: b[i].one=1;b[i].two=1;b[i].three=0; break;
		case 4: b[i].one=0;b[i].two=0;b[i].three=1; break;
		case 5: b[i].one=1;b[i].two=0;b[i].three=1; break;			
		}
	}
}

int find(struct bit b[],int s,int m)
{
	int i;
	int flag;
	for(i=1;i<4;i++)
	{
		switch(s)
		{
		case 1:if(b[i].one==m)
			   {
				   flag=i;
				  // Bit[i].one=0;
				   break;
			   };break;
		case 2:if(b[i].two==m)
			   {
				   flag=i;
				  // Bit[i].two=0;
				   break;
			   };break;
		case 3:if(b[i].three==m)
			   {
				   flag=i;
				   //Bit[i].three=0;
				   break;
			   };break;
		}
	}
	return flag;
} //find()

void resume(struct bit b[],int a[],int n)
{
	int i;
	for(i=1;i<n;i++)
    	a[i]=b[i].three*4+b[i].two*2+b[i].one;//二进制转换成十进制	
}

/*int compare(int a[])
{
	int log;
	log=a[1]>a[2]? (a[1]>a[3]? 1:3):(a[2]>a[3]? 2:3);
	return log;
}*/

void fc(int k[],int n)
{
	/*计算机取数*/
	int b3=0,b2=0,b1=0;
	int i;
	int mark;//标识
	convert(Bit,4);
	for(i=1;i<4;i++)
	{
		b3+=Bit[i].three;
		b2+=Bit[i].two;
		b1+=Bit[i].one;
	}
	//printf("\n所剩石子: ");
    //printf("第一堆:%d个\t第二堆:%d个\t第三堆:%d个\t\n",k[1],k[2],k[3]);
    printf("\n计算机从");
	if(b3%2!=0)
	{
	   mark=find(Bit,3,1);
	   Bit[mark].three=abs(Bit[mark].three-1);
	   if(b2%2!=0) Bit[mark].two=abs(Bit[mark].two-1);
	   if(b1%2!=0) Bit[mark].one=abs(Bit[mark].one-1);
	   resume(Bit,remain,4);
	   
	}
	else if(b3%2==0 && b2%2==0 && b1%2==0)
	{
		mark=random_fetch(remain,4);//随机取数
		
	}
	else if(b3==2)
	{
		if(b2==0)
		{
			if(b1==1) 
			{
				mark=find(Bit,1,1); 
				Bit[mark].one=0;
			}
		}
		else if(b2==1)
		{
			if(b1%2==0)
			{
				mark=find(Bit,2,1);
				Bit[mark].two=0;
			}
			else
			{
				mark=find(Bit,2,1);
				Bit[mark].one=abs(Bit[mark].one-1);//一二位取反
				Bit[mark].two=abs(Bit[mark].two-1);
			}
		}
		resume(Bit,remain,4);
	}
	else if(b3==0)
	{
		if(b2==0)
		{
			if(b1==1)
			{
				mark=find(Bit,1,1);
				Bit[mark].one=0;
			}
			else if(b1==3)
			{
				Bit[1].one=0;
			}
		}
		else if(b2==1)
		{
			if(b1%2==0)
			{
				mark=find(Bit,2,1);
				Bit[mark].two=0;
			}
			else
			{
				mark=find(Bit,2,1);
				Bit[mark].one=abs(Bit[mark].one-1);
				Bit[mark].two=abs(Bit[mark].two-1);
			}
		}
		else if(b2==2)
		{
			if(b1==1)
			{
				mark=find(Bit,1,1);
				Bit[mark].one=abs(Bit[mark].one-1);
			}
			else if(b1==3)
			{
				mark=find(Bit,2,0);
				Bit[mark].one=0;
			}
		}
		else if(b2==3)
		{
			if(b1==0)
			{
				Bit[1].two=0;
			}
			else if(b1==1)
			{
				mark=find(Bit,1,1);
				Bit[mark].one=abs(Bit[mark].one-1);
				Bit[mark].two=abs(Bit[mark].two-1);

			}
			else if(b1==2)
			{
				mark=find(Bit,1,0);
				Bit[mark].two=0;
			}
			else
			{
				Bit[1].one=abs(Bit[1].one-1);
				Bit[1].two=abs(Bit[1].two-1);
			}
		}
		resume(Bit,remain,4);
	}
	printf("第%d堆取……\n",mark);

}
void fu(int k[],int n)
{
	/*玩家取数*/
	int i,j;
	int heap_fetch;
	int num_fetch;
	printf("\n所剩石子: ");
	printf("第一堆:%d个\t第二堆:%d个\t第三堆:%d个\t\n",k[1],k[2],k[3]);

	for(i=1;i<n;i++)
		if(k[i]==0) j=i;
	printf("\n玩家取:\n");	
	do
	{
	printf("\n\t从第几堆中取:\t");
	scanf("%d",&heap_fetch);
	}while(heap_fetch<1||heap_fetch>3||heap_fetch==j);
	do
	{
		printf("\n\t取几块?\t");
		scanf("%d",&num_fetch);
	}while(num_fetch>k[heap_fetch]||num_fetch<=0);
	k[heap_fetch]-=num_fetch;
//	return k[heap_fetch];
}
void fetch(int value)
{
	while(1)
	{
		if(value==2)
		{
			fc(remain,4);//计算机取数
			if(remain[1]==0 && remain[2]==0 && remain[3]==0)
			{
				printf("\n计算机胜!\n");
				failure++;
				break;
			}
			fu(remain,4);//玩家取数
			if(remain[1]==0 && remain[2]==0 && remain[3]==0)
			{
				printf("\n\001\001玩家取胜!!\001\001\n");
				win++;
				break;
			}
		}
		else
		{
			fu(remain,4);//玩家取数
			if(remain[1]==0 && remain[2]==0 && remain[3]==0)
			{
				printf("\n\001\001玩家取胜!!\001\001\n");
				win++;
				break;
			}
			fc(remain,4);//计算机取数
			if(remain[1]==0 && remain[2]==0 && remain[3]==0)
			{
				printf("\n\002\002计算机胜!\002\002\n\n");
                failure++;
				break;
			}
			
		}
	}
}
main()
{
	/*定义变量*/
	/*int heap_fetch;*/
    /*int num_fetch;*/
	int se;
	int i,count=1;
	char ch;
   /* int	*/
	menu();//菜单
	do
	{
		for(i=1;i<4;i++)
			remain[i]=i+2;
		printf("\n\t……第%d局……\n\n",count);
     	se=select();//选择菜单
		fetch(se);//取数函数
         count++;
	printf("\n-----------------------------------------------------------------\n");
	printf("积分榜:\t胜出:%d局\t败了:%d局\t得分:%0.1f分",win,failure,(float)win/(float)(win+failure)*100);
	printf("\n-----------------------------------------------------------------\n");
		getchar();
		do
		{
			printf("你还继续吗?(Y/N)…………");
			scanf("%c",&ch);
		}while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n');
	
	}while(ch=='Y'||ch=='y');
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -