# **小專題1 電子雞自己猜數字 D1149989**
## 原程式
以下為一個可以跟電腦互動的猜數字小遊戲
```c=
// 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
```
## 修改後
讓電腦能夠自己猜測數字,並將猜測過程以及猜了幾次列印,並在猜對時給予ASCII圖案獎勵。
### 策略一
每次猜測時,由最大數與最小數的中數開始猜測,若答案小於猜測時,最大數改為猜測值-1,若大於則將最小數改為猜測值+1。此方法較策略二快得許多。
```c=
// 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
void ASCII(); //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");
int M=1000, m=1, guesstime=1, A; //設最大數M、最小數m和A呼叫函式isCorrect()
guess = (M + m) / 2; //一開始由中間數猜
printf("%d\n",guess);
A = isCorrect(guess,answer);
//不斷重設最小和最大數直到猜中為止
while(A != 1){ //不斷重設最小和最大數直到猜中為止
if(A == 2){
m = guess + 1;
}else if(A == 3){
M = guess - 1;
}
guess = (M + m) / 2;
printf("%d\n",guess); //列印當前猜測
A = isCorrect(guess,answer);
guesstime++;
}
ASCII();
printf("\nExcellent! You guessed the number! Use %d time!\n",guesstime);
puts("Would you like to play again?");// prompt for another game
printf("Please type ( 1=yes, 2=no )? ");
scanf("%d",&response);
} 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 " );
return 2;
}
else{
printf( "%s", "Too high. Try again?\n " );
return 3;
}
return 0;
} // end function isCorrect
//猜中數字列印圖案獎勵
void ASCII(){
printf(" ▄██████▄ ▄██████▄ ▄██████▄ ████████▄ ▄█ ▄██████▄ ▀█████████▄ \n");
printf(" ███ ███ ███ ███ ███ ███ ███ ▀███ ███ ███ ███ ███ ███ \n");
printf(" ███ █▀ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ \n");
printf(" ▄███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▄███▄▄▄██▀ \n");
printf("▀▀███ ████▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▀▀███▀▀▀██▄ \n");
printf(" ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ██▄ \n");
printf(" ███ ███ ███ ███ ███ ███ ███ ▄███ ███ ███ ███ ███ ███ \n");
printf(" ████████▀ ▀██████▀ ▀██████▀ ████████▀ █▄ ▄███ ▀██████▀ ▄█████████▀ \n");
printf(" ▀▀▀▀▀▀ \n");
}
```
### 策略二
讓電腦由1開始猜,每次猜測後+1,直到猜到為止,因為是將所有數由小到大一個一個猜,所以最多可以猜到1000次,因此效率較策略一來得差。
```c=
// 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
void ASCII(); //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=1; // 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");
int guesstime=1; //猜測次數
for(guess=1;guess<=1000;guess++){ //從1猜到1000直到猜中為止
if(isCorrect(guess,answer) == 2){
guesstime++;
}else if(isCorrect(guess,answer) == 1){
printf("%d\n",guess);
break;
}
}
ASCII();
printf("\nExcellent! You guessed the number! Use %d time!\n",guesstime);
puts("Would you like to play again?");// prompt for another game
printf("Please type ( 1=yes, 2=no )? ");
scanf("%d",&response);
} 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("%d\n",g);
printf("%s", "Too low. Try again?\n" );
return 2;
}
return 0;
} // end function isCorrect
//猜中數字列印圖案獎勵
void ASCII(){
printf(" ▄██████▄ ▄██████▄ ▄██████▄ ████████▄ ▄█ ▄██████▄ ▀█████████▄ \n");
printf(" ███ ███ ███ ███ ███ ███ ███ ▀███ ███ ███ ███ ███ ███\n");
printf(" ███ █▀ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ \n");
printf(" ▄███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▄███▄▄▄██▀ \n");
printf("▀▀███ ████▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▀▀███▀▀▀██▄ \n");
printf(" ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ██▄ \n");
printf(" ███ ███ ███ ███ ███ ███ ███ ▄███ ███ ███ ███ ███ ███ \n");
printf(" ████████▀ ▀██████▀ ▀██████▀ ████████▀ █▄ ▄███ ▀██████▀ ▄█████████▀ \n");
printf(" ▀▀▀▀▀▀ \n");
}
```