經典「猜數字」遊戲:程序生成 1-100 隨機數,用戶反複猜測,程序提示「大了/小了/對了」,統計猜測次數。本文提供模塊化、可重玩、代碼規範的完整實現。
#include#include #include #define MAX_NUMBER 100 void initialize_number_generator(void); // 初始化隨機種子 int new_secret_number(void); // 生成新隨機數 void read_guesses(int secret); // 交互猜測循環 int main(void) { char command; initialize_number_generator(); do { int secret = new_secret_number(); printf("A new number has been chosen.\n"); read_guesses(secret); printf("Play again? (Y/N) "); scanf(" %c", &command); printf("\n"); } while (command == 'y' || command == 'Y'); return 0; } void initialize_number_generator(void) { srand((unsigned)time(NULL)); // 僅調用一次! } int new_secret_number(void) { return rand() % MAX_NUMBER + 1; // 1~100 } void read_guesses(int secret) { int guess, count = 0; for (;;) { count++; printf("Enter guess: "); scanf("%d", &guess); if (guess == secret) { printf("You won in %d guesses!\n\n", count); return; } else if (guess < secret) printf("Too low, try again.\n"); else printf("Too high, try again.\n"); } }
srand(time(NULL)) 放在 initialize_number_generator,主程序調用一次。若放在循環內,同秒內重複遊戲會生成相同隨機數。scanf(" %c", &c) 格式串前加空格,跳過殘留換行符,避免「Play again?」直接讀到上一次換行導致邏輯錯誤。
4. 無限循環正確退出:for(;;) 配合 return 退出函數,比 while(1) + break 更清晰。
5. 常量宏定義:MAX_NUMBER 便於調整範圍,避免魔術數字分散代碼中。
$ gcc guess.c -o guess $ ./guess Guess the secret number between 1 and 100. A new number has been chosen. Enter guess: 50 Too high, try again. Enter guess: 25 Too low, try again. Enter guess: 37 You won in 3 guesses! Play again? (Y/N) n
MAX_NUMBER 或實現二分查找提示。這個百行內的小程序,涵蓋了 C 語言「隨機數、標準 I/O、循環控制、函數分解、宏常量、緩衝區處理」等核心基礎技能,是從「會寫語法」到「會寫工程代碼」的優秀練習題。