首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言專案實戰:猜數字遊戲完整實現與代碼解析

     編輯:C 語言問答

專案需求

實作「開口中」遊戲:系統隨機生成 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;
}

關鍵技術點解析

1. 隨機數生成:srand + rand

  • srand(time(NULL)):以當前時間秒數為種子,確保每次運行序列不同。全程只呼叫一次,通常在 main 開頭。
  • rand() % 100 + 1:取模映射至 1-100。注意:rand() 低位隨機性較差,嚴格應用建議用 (int)(rand() / (RAND_MAX + 1.0) * 100) + 1。

2. 輸入驗證與緩衝區清理


if (scanf("%d", &guess) != 1) { // 返回值為成功匹配項數
    while (getchar() != '\n'); // 吃掉殘留的非數字字符 (含換行符)
    continue;
}

若用戶輸入 "abc",scanf 失敗返回 0,"abc\n" 殘留緩衝區,不清理會導致無限迴圈。

3. 迴圈不變量

迴圈開始時,秘密數 必定在 [low, high] 區間內。每次猜測後更新邊界,區間單調收縮,保證終止。

4. 邊界更新策略

  • 猜小了:low = guess (下一輪範圍 [guess, high])。
  • 猜大了:high = guess (下一輪範圍 [low, guess])。
  • 此處包含邊界值,下一輪輸入若等於邊界即猜中。

擴展練習

  1. 記錄猜測次數:加入計數器,結束時顯示。
  2. 難度選擇:簡單 (1-50)、普通 (1-100)、困難 (1-1000)。
  3. 二分法最佳策略提示:計算最佳猜測點 (low+high)/2,提示玩家。
  4. 高分紀錄:結合檔案 I/O 保存最少猜測次數紀錄。

總結

這個小遊戲涵蓋了 C 語言核心要素:隨機數、輸入輸出、迴圈控制、條件判斷、錯誤處理、變數作用域。是練習流程控制與防禦性編程的絕佳入門專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved