實作「開口中」遊戲:系統隨機生成 1-100 秘密數字,玩家反覆猜測,系統提示範圍縮小,直到猜中。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int secret, guess;
int low = 1, high = 100;
// 1. 初始化隨機種子 (僅一次)
srand((unsigned int)time(NULL));
// 2. 生成 1-100 隨機數
secret = rand() % 100 + 1;
printf("=== 猜數字遊戲:開口中 ===\n");
printf("我已想好 1 到 100 之間的一個數字。\n");
// 3. 遊戲主迴圈
while (1) {
printf("請輸入 [%d, %d] 之間的整數: ", low, high);
// 4. 輸入驗證 (關鍵:處理非數字輸入)
if (scanf("%d", &guess) != 1) {
printf("輸入無效,請輸入整數!\n");
// 清空輸入緩衝區
while (getchar() != '\n');
continue;
}
// 5. 範圍檢查
if (guess < low || guess > high) {
printf("超出範圍!請輸入 %d 到 %d 之間。\n", low, high);
continue; // 跳過本輪剩餘,重新輸入
}
// 6. 判斷邏輯
if (guess < secret) {
printf("太小了!\n");
low = guess; // 縮小下界
} else if (guess > secret) {
printf("太大了!\n");
high = guess; // 縮小上界
} else {
printf("恭喜猜中!答案是 %d\n", secret);
break; // 結束遊戲
}
}
return 0;
}
srand + randsrand(time(NULL)):以當前時間秒數為種子,確保每次運行序列不同。全程只呼叫一次,通常在 main 開頭。rand() % 100 + 1:取模映射至 1-100。注意:rand() 低位隨機性較差,嚴格應用建議用 (int)(rand() / (RAND_MAX + 1.0) * 100) + 1。
if (scanf("%d", &guess) != 1) { // 返回值為成功匹配項數
while (getchar() != '\n'); // 吃掉殘留的非數字字符 (含換行符)
continue;
}
若用戶輸入 "abc",scanf 失敗返回 0,"abc\n" 殘留緩衝區,不清理會導致無限迴圈。
迴圈開始時,秘密數 必定在 [low, high] 區間內。每次猜測後更新邊界,區間單調收縮,保證終止。
low = guess (下一輪範圍 [guess, high])。high = guess (下一輪範圍 [low, guess])。(low+high)/2,提示玩家。這個小遊戲涵蓋了 C 語言核心要素:隨機數、輸入輸出、迴圈控制、條件判斷、錯誤處理、變數作用域。是練習流程控制與防禦性編程的絕佳入門專案。