猜數字是經典的程式設計入門練習,涵蓋隨機數產生、使用者輸入驗證、迴圈控制、條件判斷等核心概念。本文提供一個結構清晰、可擴充的主控台版本,並修正原始碼中的邏輯錯誤(如隨機範圍、提示訊息反向)。
using System;
namespace GuessNumberGame
{
internal class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8; // 支援中文
var game = new GuessGame();
string playAgain;
do
{
playAgain = game.Play();
} while (playAgain.Equals("Y", StringComparison.OrdinalIgnoreCase));
Console.WriteLine("感謝遊玩,再見!");
Console.ReadKey();
}
}
internal class GuessGame
{
private readonly Random _random = new Random();
private int _answer;
private int _guessCount;
public string Play()
{
InitializeRound();
while (true)
{
int guess = ReadValidNumber("請輸入 1-100 之間的整數:");
_guessCount++;
if (guess == _answer)
{
Console.WriteLine($"🎉 恭喜猜中!答案是 {_answer},共猜了 {_guessCount} 次。");
break;
}
string hint = guess < _answer ? "太小了" : "太大了";
Console.WriteLine($"{hint}!目前已猜 {_guessCount} 次,請再試一次:");
}
Console.Write("要再玩一局嗎?(Y/N):");
return Console.ReadLine()?.Trim().ToUpper() ?? "N";
}
private void InitializeRound()
{
_answer = _random.Next(1, 101); // 1-100 含邊界
_guessCount = 0;
Console.WriteLine("\n=== 新遊戲開始 ===");
Console.WriteLine("我已想好一個 1 到 100 之間的數字。");
}
private int ReadValidNumber(string prompt)
{
while (true)
{
Console.Write(prompt);
string input = Console.ReadLine()?.Trim();
if (int.TryParse(input, out int number) && number >= 1 && number <= 100)
return number;
Console.WriteLine("❌ 輸入無效,請輸入 1-100 之間的整數。");
}
}
}
}
Program.Main:只負責遊戲迴圈與流程控制。GuessGame:封裝單局遊戲邏輯(初始化、輸入驗證、提示、統計)。Random:建立為 readonly 欄位,避免重複實例化導致種子相同。int.TryParse 取代 Convert.ToInt16 + try-catch,避免例外開銷。Console.OutputEncoding = UTF8 正確顯示中文與 Emoji。| 原始碼問題 | 影響 | 修正方式 |
|---|---|---|
Random.Next(0, 10) | 只產生 0-9,非 1-100 | Next(1, 101)(上界不含) |
Flag = "samll" 拼字錯誤 | 變數未使用,但語意混淆 | 直接用三元運算子產生提示字串 |
ResultNumber > UserNumber → "samll" | 邏輯反向:答案大於猜測應提示「太小」 | guess < answer ? "太小" : "太大" |
Convert.ToInt16 + try-catch | 效能差、捕捉過廣例外 | int.TryParse 模式 |
本範例展示了從需求分析、類別設計、輸入驗證、迴圈控制到使用者體驗的完整開發流程。掌握這類小型專案的結構化寫法,是進階開發大型系統的基礎訓練。