遊戲軟件的開發——吃蘋果(C語言版)

 

實驗要求:
1.遊戲輸贏的評定標準是:給定一定數量的蘋果,誰取了最後一個蘋果就算誰贏。遊戲規則是:人和電腦雙方輪流取蘋果;第一次無論哪一方先取蘋果,都只能取“1~總蘋果數目-1”之間(包括邊界)數目的蘋果;之後的每一方取蘋果的數目只能是“1~上一次對方取蘋果數目的兩倍”之間的蘋果個數;直至某一方將蘋果取完爲止,遊戲才告結束。
2.該實驗的課內學時是4個課時。
3.程序完成後應該完成如下基本功能:
1)遊戲取蘋果的先後次序可以選擇(人先取或電腦先取)。
2)在遊戲中人取多少個蘋果由參加遊戲的用戶自己決定輸入,輸入之後程序必須判斷用戶是否按規則輸入蘋果個數(每一方取蘋果的數目只能是“1~上一次對方取蘋果數目的兩倍”之間的蘋果個數)。因此程序應該有明確的提示信息,提示用戶輸入的蘋果以及應該輸入的蘋果個數範圍。用戶輸入之後,程序必須檢查用戶輸入是否正確。
3)電腦取蘋果的數目由程序來決定,贏取遊戲的關鍵是費波那契數列的應用。具體參看實驗提示。
4)遊戲最後必須說明哪一方贏得遊戲。
4.在完成上述基本功能的前提下,有能力的同學可以完成如下加強功能:
1)遊戲的速度分爲快速和慢速兩種。快速遊戲的電腦取蘋果個數方法參看實驗提示。
2)遊戲的提示語言清晰明確,界面美觀適用。
/**********************************  源代碼 ********************************************/
#include "stdio.h"
#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; 
     
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章