# 程式設計小專題—電子雞自己猜數字 ## 改寫過的程式碼 ```cpp= #include <stdio.h> #include <stdlib.h> #include <time.h> void guessGame(void); //遊戲的函式 void ascii(void); //圖案的函式 int isCorrect(int, int); //猜測結果回報 int hrange = 1000; //範圍最大值 int lrange = 1; //範圍最小值 //主函式 int main(void){ guessGame(); } //執行遊戲的函式 void guessGame(void){ int answer; //正確答案 int guess; //猜測的答案 int response; //是否要繼續的選擇 int times = 0; //猜的次數 do{ answer = 1 + rand() % 1000; //1~1000隨機挑一個數字當正確答案 //印出問題 puts("I have a number between 1 and 1000.\n" "Can you guess my number?\n" "Please type your first guess."); guess = (hrange + lrange) / 2; //從中間值開始猜 printf("\nAnswer is %d\n", guess); times = times + 1; //猜一次次數加1 //讓電腦自己猜數字 while (!isCorrect(guess, answer)) //答案是錯的持續執行迴圈 { guess = (hrange + lrange) / 2; printf("\nAnswer is %d\n", guess); times = times + 1; //猜一次次數加1 } //完成猜測 printf("\nExcellent! You guessed the number!\n\n"); ascii(); //印出圖案 printf("\nUse %d times to guess\n",times); //說明猜了幾次 printf("Would you like to play again?\n"); printf("%s", "Please type ( 1=yes, 2=no )? \n"); scanf("%d", &response); lrange = 1; hrange = 1000; times = 0; puts(""); } while (response == 1); } //猜測結果的函式 int isCorrect(int guess, int answer) { //回答正確 if (guess == answer) return 1; //回答錯誤 if (guess < answer){ printf( "%s", "\nToo low. Try again.\n" ); //如果猜的數字比正確數字小 lrange = guess + 1; } else if (guess > answer){ printf( "%s", "\nToo high. Try again.\n" ); //如果猜的數字比正確數字大 hrange = guess - 1; } return 0; } //最後的成功(?圖案的函式 void ascii (void){ printf("__________________???????????????_________________\n"); printf("_________________?????????????????________________\n"); printf("____________???????????????????????????___________\n"); printf("___________???????_______________???????__________\n"); printf("________?????_________________________?????_______\n"); printf("_______?????___________________________?????______\n"); printf("_____????_________________________________????____\n"); printf("_____????_________________________________????____\n"); printf("_____????_____???????_________???????_____????____\n"); printf("____???_______???????_________???????_______??????\n"); printf("__????________???????_________???????_________????\n"); printf("__????________________________________________????\n"); printf("__????________________________________________????\n"); printf("__????________________________________________????\n"); printf("__????________________________________________????\n"); printf("__????________________________________________????\n"); printf("__????______?_________________________?_______????\n"); printf("__????_____????_____________________????______????\n"); printf("____???_____?????_________________?????_____??????\n"); printf("_____????_____????_______________????_____????____\n"); printf("_____????_______???????????????????_______????____\n"); printf("_____????_________???????????????_________????____\n"); printf("_______?????___________________________?????______\n"); printf("________?????_________________________?????_______\n"); printf("___________???????_______________???????__________\n"); printf("____________??????_______________??????___________\n"); printf("__________________???????????????_________________\n"); printf("__________________???????????????_________________\n"); } ``` ### 說明 每次都從中間值開始猜,這樣速度比較快。 ```cpp= int hrange = 1000; //範圍最大值 int lrange = 1; //範圍最小值 ``` 最一開始先宣告全域變數,設定範圍最大值=1000以及最小值=1。 #### 執行遊戲的函式 ```cpp= void guessGame(void){ int answer; //正確答案 int guess; //猜測的答案 int response; //是否要繼續的選擇 int times = 0; //猜的次數 ``` 先宣告正確答案跟電腦猜測的答案,總猜測次數先宣告為0。 ```cpp= do{ answer = 1 + rand() % 1000; //1~1000隨機挑一個數字當正確答案 //印出問題 puts("I have a number between 1 and 1000.\n" "Can you guess my number?\n" "Please type your first guess."); guess = (hrange + lrange) / 2; //從中間值開始猜 printf("\nAnswer is %d\n", guess); times = times + 1; //猜一次次數加1 //讓電腦自己猜數字 while (!isCorrect(guess, answer)) //答案是錯的持續執行迴圈 { guess = (hrange + lrange) / 2; printf("\nAnswer is %d\n", guess); times = times + 1; //猜一次次數加1 } ``` 一開始先有一個在1~1000之間隨機選一個數字當作正確答案。 第一次猜的數字就從中間值開始猜起,每猜測一次次數的計算就會+1。 然後把猜測的數字用判斷猜測結果的函式判斷是否正確。 若不正確即在猜一次,直到猜對為止。 #### 判斷猜測結果的函式 ```cpp= //判斷猜測結果的函式 int isCorrect(int guess, int answer) { //回答正確 if (guess == answer) return 1; //回答錯誤 if (guess < answer){ printf( "%s", "\nToo low. Try again.\n" ); //如果猜的數字比正確數字小 lrange = guess + 1; } else if (guess > answer){ printf( "%s", "\nToo high. Try again.\n" ); //如果猜的數字比正確數字大 hrange = guess - 1; } return 0; } ``` 此為判斷猜測結果的函式。 猜對即回傳1(true)。 若猜錯有兩種可能,一個是猜的數字比正確答案還小,若是這種情況,則猜測範圍最小值應從猜的答案加1開始;另一個是猜的數字比正確答案大,那麼此猜測範圍最大值應從猜的答案減1開始。 #### 成功時印出的圖案的程式碼 ```cpp= void ascii (void){ printf("__________________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_________________\n"); printf("_________________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶________________\n"); printf("____________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶___________\n"); printf("___________¶¶¶¶¶¶¶_______________¶¶¶¶¶¶¶__________\n"); printf("________¶¶¶¶¶_________________________¶¶¶¶¶_______\n"); printf("_______¶¶¶¶¶___________________________¶¶¶¶¶______\n"); printf("_____¶¶¶¶_________________________________¶¶¶¶____\n"); printf("_____¶¶¶¶_________________________________¶¶¶¶____\n"); printf("_____¶¶¶¶_____¶¶¶¶¶¶¶_________¶¶¶¶¶¶¶_____¶¶¶¶____\n"); printf("____¶¶¶_______¶¶¶¶¶¶¶_________¶¶¶¶¶¶¶_______¶¶¶¶¶¶\n"); printf("__¶¶¶¶________¶¶¶¶¶¶¶_________¶¶¶¶¶¶¶_________¶¶¶¶\n"); printf("__¶¶¶¶________________________________________¶¶¶¶\n"); printf("__¶¶¶¶________________________________________¶¶¶¶\n"); printf("__¶¶¶¶________________________________________¶¶¶¶\n"); printf("__¶¶¶¶________________________________________¶¶¶¶\n"); printf("__¶¶¶¶________________________________________¶¶¶¶\n"); printf("__¶¶¶¶______¶_________________________¶_______¶¶¶¶\n"); printf("__¶¶¶¶_____¶¶¶¶_____________________¶¶¶¶______¶¶¶¶\n"); printf("____¶¶¶_____¶¶¶¶¶_________________¶¶¶¶¶_____¶¶¶¶¶¶\n"); printf("_____¶¶¶¶_____¶¶¶¶_______________¶¶¶¶_____¶¶¶¶____\n"); printf("_____¶¶¶¶_______¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_______¶¶¶¶____\n"); printf("_____¶¶¶¶_________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_________¶¶¶¶____\n"); printf("_______¶¶¶¶¶___________________________¶¶¶¶¶______\n"); printf("________¶¶¶¶¶_________________________¶¶¶¶¶_______\n"); printf("___________¶¶¶¶¶¶¶_______________¶¶¶¶¶¶¶__________\n"); printf("____________¶¶¶¶¶¶_______________¶¶¶¶¶¶___________\n"); printf("__________________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_________________\n"); printf("__________________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_________________\n"); } ``` > replit link :https://replit.com/@angle930325/Xiao-Zhuan-Ti-Dian-Zi-Ji-Zi-Ji-Cai-Shu-Zi#main.c