//猜數字遊戲 ? A ? B
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define MAX 4

int main()
{
     char gn[MAX],rn[MAX];
     int i,j,chk,temp,a,b,t=0,g=0;
     int score=0;
    
     do
     {  
         system("cls");
         t++;  //計算局數
         g=0;  //g 為計算猜了幾次,在此歸零 
         printf("猜數字遊戲 (按Esc鍵放棄該局)   第 %d 局   總積分: %d\n",t,score);
         srand((unsigned)time(NULL));
         for(i=0;i<MAX;i++)
         {
              do
              {
                   chk=0;       
                   //temp 以亂數方式產生 ASCII 碼(1~9)的對應數值
                   temp=rand()%9+49;     
                   //檢查亂數產生的字元是否重複
                   for(j=0;j<i;j++)
                       if(rn[j]==temp) chk=1;         
              } while(chk==1);
              rn[i]=temp;
         }
        
         /* printf("答案 : "); // 答案顯示
         for(i=0;i<MAX;i++) printf("%c",rn[i]);
         printf("\n");  */
        
         //輸入及判斷資料區塊    
         do
         {
              a=0;b=0; 
              g++;  //變數 g 為累計此局共猜了幾次             
              for(i=0;i<MAX;i++)
              {
                   do
                   {
                        chk=0;
                        temp=getch();
                        //按 Esc 放棄猜,顯示答案
                        if(temp==27) { chk=2; break; }
                        //檢查輸入的字元是否介於 1~9 
                        if(temp<49 || temp>57) chk=1; 
                        //檢查輸入的字元是否重複
                        for(j=0;j<i;j++)
                            if(temp==gn[j]) chk=1;           
                   } while(chk==1);
                   if(chk==2) break;
                   gn[i]=temp;
                   printf("%c",gn[i]);
              }   
              if(chk==2) break;
              //比對並計算 ?A?B
              for(i=0;i<MAX;i++)
                  for(j=0;j<MAX;j++)
                  {
                       if(i==j && gn[i]==rn[j])
                           a++;                 
                       else
                           if(gn[i]==rn[j])   
                               b++;
                  }
              //下面的程式片段會以各別分離的方式來顯示 ?A?B   
              if(a==MAX)
              {
                   printf("  猜對了! 共猜了 %d 次\n",g);
                   break;
              }        
              if(a==0 && b==0)
                  printf("  沒猜中半個數字!\n");
              else       
              {
                  if(a==0 || b==0)
                  {
                      if(a==0)  printf("    %dB\n",b);
                      if(b==0)  printf("  %dA\n",a);
                  }  
                  else
                      printf("  %dA%dB\n",a,b);
              }     
         } while(a!=MAX);
         //顯示答案 (chk 為 2 則表示按了 Esc 鍵)
         if(chk==2)
         {
              score=score-50;  //放棄則倒扣 50 分    
              printf("\n");    
              printf("答案 : ");
              for(i=0;i<MAX;i++) printf("%c",rn[i]); 
              printf("\n");
              printf("此局放棄 : %d\n",-50);
         }    
         else  //計算得分
         {
              score=score+(120-g*5);
              printf("此局得分 : %d\n",120-g*5);
         }
         printf("繼續玩(y / n) ?");
         temp=getche();
     } while(temp=='y' || temp=='Y');
     printf("\n");
     system("pause");
     return 0;        
}

花了幾個小時把這個猜數字的小遊戲寫了出來 ~ 在此與大家分享一下 !
在知識 + 的程式設計 C/C++ 分類中 , 會問這一題的人為數不少 , 於此程式中 , 我強化了一些輸入資料時的判斷能力 (無法輸入重複的數字 例如: 2566 或 8888 , 以免玩家刻意以相同數字來判斷答案中的數字之有無 , 輸入非數字資料時也不會發生錯誤 , 會予以排除) , 並加入計分功能 , 而顯示幾A幾B的方式也稍作改變 (玩者能一目了然 , 方便判斷思考) ,  如果心血來潮會繼續增加存檔功能 (儲存得分紀錄) , 甚至讓電腦與玩家互猜 !

想直接 COPY 拿去交作業的同學們 ~ 達仔並不反對 , 但希望您們在參考之餘能從中理解並增進設計功力 , 才是達仔所樂見的 , 也非常歡迎各位行家的指教喔 ~

不懂程式設計的人也可以玩玩看 !
沒有編譯器 (用來將程式原始碼轉成可執行檔) 而有興趣想玩看看的人 , 請傳您們的 E-mail 給達仔 , 以便將可執行檔寄給您們 !



arrow
arrow
    全站熱搜
    創作者介紹
    創作者 達仔 的頭像
    達仔

    老男人's Secret Basement

    達仔 發表在 痞客邦 留言(3) 人氣()