#include <time.h>
#include <stdlib.h>
#include <conio.h>
int Apple_Fenjie[40];//全局變量,用於存儲將一個數分解完後的斐波那契數
int Human_Chose[100],Computer_Chose[100],Apple_Total;
//全局變量,分別用來存儲玩家和電腦所選的數,及剩餘蘋果數
/* 1 *********************************************/
int PanDuan_Fibo(int m)
//判斷一個數是否爲斐波那契數,是就返回其在數列中的下標,不是則返回0
{ int Fibo[40],i,j=0;
Fibo[0]=0;
Fibo[1]=Fibo[2]=1;
for(i=2;i<40;i++)
Fibo[i]=Fibo[i-2]+Fibo[i-1];
for(i=0;i<=40;i++)
if (m==Fibo[i])
return i;
return 0;
}
/* 2 *********************************************/
int FenJie_Fibo(int Apple_Fenjie[40],int m)
//將一個數m分解,並將結果存在數組Apple_Fenjie[40]中,函數返回數組的最大下標
{ int Fibo[40],i,j=0,k;
Fibo[0]=0;
Fibo[1]=Fibo[2]=1;
for(i=2;i<40;i++)
Fibo[i]=Fibo[i-2]+Fibo[i-1];
k=PanDuan_Fibo(m);
if(k==0)
{ for(i=0;m>0; )
{ if(m<Fibo[i])
{Apple_Fenjie[j]=Fibo[i-1];
m=m-Apple_Fenjie[j];
j++;i=-1;
}
i++;
}
}
else
{j=1;
Apple_Fenjie[j-1]=Fibo[k-1];
Apple_Fenjie[j]=Fibo[k-2];
j++;
}
return j-1;
}
/* 3 ********************************************************************/
int Computer(int speed,int i,int Who_First) //電腦取蘋果
{ int min,j,Apple_Quick,floag=0,Apple_Fenjie1[40],temp=0;
Human_Chose[0]=Apple_Total/2-1;
Computer_Chose[0]=Apple_Total/2-1;
min=FenJie_Fibo(Apple_Fenjie,Apple_Total);
if(Who_First==1)
temp=1;
if(Apple_Total<=Human_Chose[i-1+temp]*2) //如果遊戲
{ Computer_Chose[i]=Apple_Total;
Apple_Total=Apple_Total-Computer_Chose[i];
}
else if((Apple_Fenjie[min]<((Apple_Total+2)/3))&&(Apple_Fenjie[min]<=(Human_Chose[i-1+temp]*2)))
{ if(speed==1)
{Computer_Chose[i]=Apple_Fenjie[min];
Apple_Total=Apple_Total-Computer_Chose[i];
}
else if(speed==2)
{ Apple_Quick=Apple_Fenjie[min];
for(j=1;1;j++)
{ Apple_Quick=Apple_Quick+Apple_Fenjie[min-j];
if((Apple_Quick<((Apple_Total+2)/3))&&(Apple_Quick<=(Human_Chose[i-1]*2)))
{ floag=FenJie_Fibo(Apple_Fenjie1,Apple_Total-Apple_Quick);
if(Apple_Fenjie1[floag]>2*Apple_Quick)
continue;
else
break;
}
break;
}
Apple_Quick=Apple_Quick-Apple_Fenjie[min-j];
Computer_Chose[i]=Apple_Quick;
Apple_Total=Apple_Total-Computer_Chose[i];
}
}
else
{ Computer_Chose[i]=1;
Apple_Total=Apple_Total-Computer_Chose[i];
}
if(Who_First==1)
{printf("電腦取[1~%d]:%d\n",Human_Chose[i]*2,Computer_Chose[i]);
}
else if(Who_First==2)
{
if (i==1)
printf("\t|第%d輪--剩下%d個蘋果--電腦取[1~%d]:%d\n",i,Apple_Total+Computer_Chose[i],Apple_Total+Computer_Chose[i]-1,Computer_Chose[i]);
else if(i>=2)
printf("\t|第%d輪--剩下%d個蘋果--電腦取[1~%d]:%d\n",i,Apple_Total+Computer_Chose[i],Human_Chose[i-1]*2,Computer_Chose[i]);
}
if(Apple_Total<=0)
{ printf("\n\t電腦勝利!!\n");
return 0;
}
if(Who_First==2)
{printf("\t|第%d輪--剩下%d個蘋果--玩家取[1~%d]:",i,Apple_Total,Computer_Chose[i]*2);
}
return 1;
}
/* 4 *****************************************************/
int Human(int i,int Who_First) //玩家取蘋果
{ if(Who_First==1)
{
if (i==1)
{printf("\t|第%d輪--剩下%d個蘋果--玩家取[1~%d]:",i,Apple_Total,Apple_Total-1);
scanf("%d",&Human_Chose[i]);
while(Human_Chose[i]<1||Human_Chose[i]>Apple_Total-1)
{printf("\t\t非法取蘋果,請重取[1~%d]:",Apple_Total-1);
scanf("%d",&Human_Chose[i]);
}
}
else if(i>=2)
{
printf("\t|第%d輪--剩下%d個蘋果--玩家取[1~%d]:",i,Apple_Total,Computer_Chose[i-1]*2);
scanf("%d",&Human_Chose[i]);
while(Human_Chose[i]<1||Human_Chose[i]>Computer_Chose[i-1]*2)
{ printf("\t\t非法取蘋果,請重取[1~%d]:",Computer_Chose[i-1]*2);
scanf("%d",&Human_Chose[i]);
}
}
}
else if(Who_First==2)
{ scanf("%d",&Human_Chose[i]);
while(Human_Chose[i]<1||Human_Chose[i]>Computer_Chose[i]*2)
{printf("\t\t非法取蘋果,請重取[1~%d]:",Computer_Chose[i]*2);
scanf("%d",&Human_Chose[i]);
}
}
Apple_Total=Apple_Total-Human_Chose[i];
if(Apple_Total<=0)
{ printf("\n\t玩家勝利!!\n");
return 0;
}
if(Who_First==1)
printf("\t|第%d輪--剩下%d個蘋果--",i,Apple_Total);
return 1;
}
/* 5 ********************************************************/
void Computer_FirstChose(int Apple_Total,int speed,int Who_First) //電腦先取
{ int i=1;
while(1)
{ if(Computer(speed,i,Who_First)==0)
break;
if(Human(i,Who_First)==0)
break;
i++;
}
}
/* 6 ***********************************************************/
void Human_FirstChose(int Apple_Total,int speed,int Who_First) //玩家先取
{ int i=1;
while(1)
{ if(Human (i,Who_First)==0)
break;
if(Computer(speed,i,Who_First)==0)
break;
i++;
}
}
/*************************************************/
int Game_Description( ) //遊戲說明
{ system("cls");fflush(stdin);
printf("\n\n\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|\t\t\t “吃蘋果”遊戲說明\t\t\t\t |\n");
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|遊戲輸贏的評定標準是:給定一定數量的蘋果,誰取了最後一個蘋果就算誰贏。 |\n");
printf("\t|遊戲規則是:\t\t\t\t\t\t\t\t |\n");
printf("\t| 人和電腦雙方輪流取蘋果;第一次無論哪一方先取蘋果,都只能取“1~總蘋果數目-1”|\n");
printf("\t|之間(包括邊界)數目的蘋果;之後的每一方取蘋果的數目只能是“1~上一次對方取蘋果|\n");
printf("\t|數目的兩倍”之間的蘋果個數;直至某一方將蘋果取完爲止,遊戲才告結束。 |\n");
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\n\n\t\t\t\t<任意鍵>--返回主菜單 \n");
getch();
return 1;
}
/****************************************************/
int Game_Enter(int speed,int Who_First ) //進入遊戲
{ char temp;
system("cls");fflush(stdin);
printf("\n\t 進入遊戲==>遊戲信息: ");
if(speed==1)
printf("<簡單>");
else if(speed==2)
printf("<困難>");
if(Who_First==1)
printf(" <玩家>先取");
if(Who_First==2)
printf(" <電腦>先取");
printf("\n\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|\t\t第一步==設置蘋果總數\t |\n");
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|<<1>>--由玩家輸入\t\t\t\t| \n");
printf("\t|<<其他鍵>>--由電腦隨機產生\t\t\t|\n");
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|\t請選擇==>");
temp=getchar();
switch(temp)
{ case '1':
{ printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|\t請輸入蘋果總數:\t");
scanf("%d",&Apple_Total);
while(Apple_Total<=1)
{printf("\t|\t請重新輸入蘋果總數(>=2):\t");
scanf("%d",&Apple_Total);
}
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\n\t\t\t<任意鍵>--開始取蘋果 \n");
return 1;
}
default:
{ srand((unsigned)time(NULL));
Apple_Total=rand()%200;
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|\t電腦隨機產生的蘋果數是:%d 個\n",Apple_Total);
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\n\t\t\t<任意鍵>--開始取蘋果 \n");
return 1;
}
}
getch();
}
/*************************************************/
void Game_Setting(int*speed,int*Who_First) //遊戲的開始設置
{ int chose;
system("cls");
printf("\n\n\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|\t歡迎進入“吃蘋果”遊戲--蘇貴陽\t\t|\n");
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
printf("\t|\t<1>-進入遊戲\t <2>-電腦先取\t\t|\n");
printf("\t|\t<3>-提高難度\t <4>-遊戲說明\t\t|\n");
printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");
chose=getchar();
switch(chose)
{
case '1':
Game_Enter(*speed,*Who_First); break;
case '2':
{ system("cls");
*Who_First=2;
printf("\n\n\t\t\t設置完成,現在是由<<電腦>>先取蘋果");
printf("\n\n\t\t\t\t<任意鍵>--返回主菜單 \n");
getch();
Game_Setting(speed,Who_First);
} break;
case '3':
{ system("cls");
*speed=2;
printf("\n\n\t\t\t設置完成,現在遊戲難度已提升爲--<<困難>>");
printf("\n\n\t\t\t\t<任意鍵>--返回主菜單 \n");
getch();
Game_Setting(speed,Who_First);
} break;
case '4':
if(Game_Description( ))
Game_Setting(speed,Who_First);
break;
default: Game_Setting(speed,Who_First);
}
}
/* 7 ****************************************************************/
void main() //主函數
{ int speed,Who_First;
begin:
speed=1;Who_First=1;
Human_Chose[0]=Apple_Total/2-1;
Computer_Chose[0]=Apple_Total/2-1;
Game_Setting(&speed,&Who_First);
getch();
if(Who_First==1)
{ printf("\n\n\t現在正式開始取蘋果:\n\n");
Human_FirstChose(Apple_Total,speed,Who_First);
}
else if(Who_First==2)
{ printf("\n\n\t現在正式開始取蘋果:\n\n");
Computer_FirstChose(Apple_Total,speed,Who_First);
}
getch();
printf("\n\t<任意鍵>-重新遊戲,\n");
getch();
goto begin;
}