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

C 語言猜數字遊戲代碼亂碼:排版混亂導致邏輯錯誤,重構建議

     編輯:程式設計疑難解答

原代碼縮排全無、變數命名無意義 (`w,b,g,m,n...`)、`goto` 濫用、`rand()` 種子重複、`scanf` 缺錯誤處理,導致每次重新猜測結果異常。

重構關鍵點

  1. 標準縮排與命名:`secret[4]`, `guess[4]`, `countA`, `countB`, `attempts`。
  2. 隨機種子只設一次:`srand((unsigned)time(NULL));` 放在 `main` 開頭。
  3. 產生 4 位不重複數字:洗牌法或 `do-while` 去重。
  4. 判斷 A/B 邏輯分離:函式 `judge(secret, guess, &A, &B)`。
  5. 輸入驗證:長度 4、全數字、不重複。
  6. 移除 `goto`,用 `while/do-while` 控制流程。

重構後核心框架


#include 
#include 
#include 
#include 
#include 

void genSecret(int s[4]);
void judge(const int s[4], const int g[4], int *A, int *B);
bool validInput(const char *str, int g[4]);

int main() {
    srand((unsigned)time(NULL));
    int secret[4]; genSecret(secret);
    int guess[4], A, B, attempts = 0;
    char buf[16];
    while (true) {
        printf("請輸入 4 位不重複數字 (q 退出): ");
        if (!fgets(buf, sizeof(buf), stdin)) break;
        buf[strcspn(buf, "\n")] = 0;
        if (strcmp(buf, "q") == 0) break;
        if (!validInput(buf, guess)) { puts("格式錯誤"); continue; }
        ++attempts;
        judge(secret, guess, &A, &B);
        printf("%dA%dB\n", A, B);
        if (A == 4) { printf("恭喜!共猜 %d 次。\n", attempts); break; }
    }
    return 0;
}
// 實作 genSecret, judge, validInput 略

原代碼常見 Bug 成因

  • `srand(time(NULL))` 放在迴圈內 → 同秒內重複種子 → 產生相同亂數。
  • `rand()%10000` 可能產生前導零缺失 (如 123 → 0123 判斷錯誤)。
  • 變數 `i,j,k` 重複使用導致迴圈邏輯錯亂。
  • `struct num_type p[1]` 只存最後一筆,無歷史功能。

重寫比修補快:套用標準結構、函式分離、有意義命名,代碼行數減半、Bug 歸零。

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