---
# System prepended metadata

title: '**電子雞自己猜數字'

---

# **電子雞自己猜數字
# **
將老師給的範本(讓玩家自己猜數字)的程式，改成讓電腦可以自己猜數字。
**以下為原程式碼:**
```
// Randomly generate numbers between 1 and 1000 for user to guess.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void guessGame(void); // function prototype
int isCorrect(int, int); // function prototype

int main(void)
{
   // srand( time( 0 ) ); // seed random number generator
   guessGame();
} // end main

// guessGame generates numbers between 1 and 1000
// and checks user's guess
void guessGame(void)
{
   int answer; // randomly generated number
   int guess; // user's guess
   int response; // 1 or 2 response to continue game

   // loop until user types 2 to quit game
   do {
      // generate random number between 1 and 1000
      // 1 is shift, 1000 is scaling factor
      answer = 1 + rand() % 1000;

      // prompt for guess
      puts("I have a number between 1 and 1000.\n" 
           "Can you guess my number?\n" 
           "Please type your first guess.");
      printf("%s", "? ");
      scanf("%d", &guess);

      // loop until correct number
      while (!isCorrect(guess, answer)) 
         scanf("%d", &guess);

      // prompt for another game
      puts("\nExcellent! You guessed the number!\n"
         "Would you like to play again?");
      printf("%s", "Please type ( 1=yes, 2=no )? ");
      scanf("%d", &response);

      puts("");
   } while (response == 1);
} // end function guessGame

// isCorrect returns true if g equals a
// if g does not equal a, displays hint
int isCorrect(int g, int a)
{
   // guess is correct
   if (g == a)
      return 1;

   // guess is incorrect; display hint
   if (g < a)
      printf( "%s", "Too low. Try again.\n? " );
   else
      printf( "%s", "Too high. Try again.\n? " );

   return 0;
} // end function isCorrect
```
**想法:**
原程式碼為需要使用者自己輸入數字，並且看提示看要猜大猜小，首先需要把scanf的地方取代掉，改成讓電腦自己猜數字，並且要參考上一次的答案做一個新的範圍。


rand()為產生亂數的方法，1+rand()%1000的意思為在1-1000內隨機產生一個亂數，可以做為電腦亂猜的答案，亦可作為"第一次"猜的數字。

>>記得在每次猜完數字後，要把次數累積進去計算猜測次數的變數內，這邊把該變數命名為times，並利用times++累積次數。

在第一次猜測玩數字後，輸入了guess參數後，寫if條件式判別猜測的數字大於答案or小於答案。
接下來會用到一個"限制rand()範圍"的公式，以下為公式:
a = rand() % (b - c + 1) + c
a參數為下一個猜測的數字
b參數為上一輪猜測數字的最大值
c參數為上一輪猜測數字的最小值

下面接著需要while loop，並用到兩個if條件式，一個為猜測的數字比答案小的情況下，另一個為猜測數字比答案大的情況下。

**猜>答案:**
```
if (guess < answer)
```
**答案>猜:**
```
else
```
>>因為只有兩種情況，if條件式寫出第ㄧ種後，剩下的會自動歸類為第二種。

接下來是寫statment，在上述兩種情況下的最大與最小值不一樣，所以需要想想。
當猜測數字較小時，代表下一個猜測範圍的最大值為amswer，最小值為guess，並把amswer與guess套入到公式內對應位置，反之則位置互換。

**if條件式的statment:**
```
guess = rand() % (answer - guess + 1) + guess
```
**else條件式的statment:**
```
guess = rand() % (guess - answer + 1) + answer
```
**最後需要用printf印出該次猜測數字的答案，並且利用參數times累積次數:**
```
printf("%d\n",guess);  //印出本次猜測結果，不論對錯
times++;
```
最後不要忘記，用printf印出獎勵圖案。

**以下為完整的程式碼:**
```
// Randomly generate numbers between 1 and 1000 for user to guess.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void guessGame(void); // function prototype
int isCorrect(int, int); // function prototype
int answer; // randomly generated number
int guess; // user's guess
int response; // 1 or 2 response to continue game

int main(void)
{
   // srand( time( 0 ) ); // seed random number generator
   guessGame();
} // end main

// guessGame generates numbers between 1 and 1000
// and checks user's guess
void guessGame(void)
{
   
   // loop until user types 2 to quit game
   do {
      // generate random number between 1 and 1000
      // 1 is shift, 1000 is scaling factor
      int times = 0;  //guess times
      answer = 1 + rand() % 1000;

      // prompt for guess
      puts("I have a number between 1 and 1000.\n" 
           "Can you guess my number?\n" 
           "Please type your first guess.");
      printf("%s", "? ");
      guess = 1 + rand() % 1000;  //讓電腦自己在1000內猜數字
      times++;
      printf("%d\n",guess);   //印出電腦第一次猜的數字
      
      // loop until correct number
      while (!isCorrect(guess, answer)) 
      {
        if (guess < answer)  //當猜的數字比答案小，把範圍縮至猜的數與答案之間
        {
          guess = rand() % (answer - guess + 1) + guess;  //讓電腦自己在範圍內內猜數字
        }
        else   //當猜的數字比答案大，把範圍縮至答案與猜的數之間
        {
          guess = rand() % (guess - answer + 1) + answer;  //讓電腦自己在範圍內內猜數字
        }
        printf("%d\n",guess);  //印出本次猜測結果，不論對錯
        times++;
      }
      printf("toatl guess times:%d",times);
      // prompt for another game
      puts("\nExcellent! You guessed the number!\n"
         "Would you like to play again?\n");
      printf("        _,'|             _.-''``-...___..--';)\n");
      printf("       /_ \'.      __..-' ,      ,--...--'''\n");
      printf("      <\    .`--'''       `     /'\n");
      printf("       `-';'               ;   ; ;\n");
      printf(" __...--''     ___...--_..'  .;.'\n");
      printf("(,__....----'''       (,..--''   \n");   //印出獎勵圖案
      printf("%s", "Please type ( 1=yes, 2=no )? ");
      scanf("%d", &response);

      puts("");
   } while (response == 1);
} // end function guessGame

// isCorrect returns true if g equals a
// if g does not equal a, displays hint
int isCorrect(int g, int a)
{
   // guess is correct
   if (g == a)
      return 1;

   // guess is incorrect; display hint
   if (g < a)
      printf( "%s", "Too low. Try again.\n? " );
   else 
      printf( "%s", "Too high. Try again.\n? " );
   return 0;
} // end function isCorrect
```

replit連結:[https://replit.com/@Rui5261/Dian-Zi-Ji-Zi-Ji-Cai-Shu-Zi#main.c](https://)