專案需求
- 選單:開始(1) / 退出(0)
- 遊戲:隨機生成 1~100 數字,玩家反覆猜測,提示大/小/正確。
- 猜中後回選單,可重複遊玩。
核心程式碼
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu() {
puts("*** 歡迎來挑戰猜數字遊戲 ***");
puts("***** 請選擇開始或退出 *****");
puts("****** 1.start 0.exit ******");
}
void game() {
int guess = 0;
srand((unsigned)time(NULL)); // 以當前時間為種子
int target = rand() % 100 + 1; // 1~100
while (1) {
printf("請猜數字:");
if (scanf("%d", &guess) != 1) { // 輸入驗證
puts("輸入無效,請輸入整數!");
while (getchar() != '\n'); // 清理緩衝區
continue;
}
if (guess == target) {
puts("你真聰明,猜對了!");
break;
} else if (guess > target) {
puts("你好笨,猜大了!");
} else {
puts("你真蠢,猜小了!");
}
}
}
int main() {
int choice = 1;
while (choice) {
menu();
printf("請選擇: ");
if (scanf("%d", &choice) != 1) {
puts("輸入錯誤!");
while (getchar() != '\n');
continue;
}
switch (choice) {
case 1: game(); break;
case 0: puts("再見!"); break;
default: puts("選項不存在!");
}
}
return 0;
}
關鍵技術點解析
- 隨機數種子:
srand(time(NULL)) 僅在程式啟動時呼叫一次,避免同秒內重複序列。
- 輸入驗證與緩衝區清理:
scanf 回傳值檢查 + while(getchar()!='\n') 防止非數字輸入導致死循環。
- 模組化設計:
menu()、game() 分離關注點,主迴路清晰。
進階優化建議
- 記錄猜測次數、最佳紀錄(寫入檔案)。
- 增加難度選項(範圍 1~1000、限制次數)。
- 使用
rand() 缺陷:低位隨機性差,建議改用 random() 或 C11 rand_s / <random> (C++)。
- GUI 版本:結合 ncurses 或 SDL2 圖形化。
執行示例
*** 歡迎來挑戰猜數字遊戲 ***
***** 請選擇開始或退出 *****
****** 1.start 0.exit ******
請選擇: 1
請猜數字:50
你真蠢,猜小了!
請猜數字:75
你真蠢,猜小了!
...
請猜數字:89
你真聰明,猜對了!