📄 b0226078_c8.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 + -