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

C# 主控台猜數字遊戲完整實作教學

     編輯:關於C語言

前言

猜數字是經典的程式設計入門練習,涵蓋隨機數產生、使用者輸入驗證、迴圈控制、條件判斷等核心概念。本文提供一個結構清晰、可擴充的主控台版本,並修正原始碼中的邏輯錯誤(如隨機範圍、提示訊息反向)。

完整程式碼

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 之間的整數。");
            }
        }
    }
}

程式架構說明

1. 關注點分離

  • Program.Main:只負責遊戲迴圈與流程控制。
  • GuessGame:封裝單局遊戲邏輯(初始化、輸入驗證、提示、統計)。
  • Random:建立為 readonly 欄位,避免重複實例化導致種子相同。

2. 輸入驗證健壯化

  • 使用 int.TryParse 取代 Convert.ToInt16 + try-catch,避免例外開銷。
  • 加入範圍檢查(1-100),避免超出邊界值。
  • 修正原始碼「太大/太小」提示反向的邏輯錯誤。

3. 使用者體驗細節

  • 設定 Console.OutputEncoding = UTF8 正確顯示中文與 Emoji。
  • 每局開始顯示範圍提示,猜中後顯示統計次數。
  • 大小寫不敏感的「再玩一次」判斷。

常見錯誤與修正對照

原始碼問題影響修正方式
Random.Next(0, 10)只產生 0-9,非 1-100Next(1, 101)(上界不含)
Flag = "samll" 拼字錯誤變數未使用,但語意混淆直接用三元運算子產生提示字串
ResultNumber > UserNumber → "samll"邏輯反向:答案大於猜測應提示「太小」guess < answer ? "太小" : "太大"
Convert.ToInt16 + try-catch效能差、捕捉過廣例外int.TryParse 模式

擴充練習建議

  1. 難度選單:簡單(1-50)、普通(1-100)、困難(1-1000),對應不同嘗試次數上限。
  2. 高分紀錄:用 JSON 檔案儲存前 10 名最少猜測次數紀錄。
  3. 提示模式:輸入 "?" 顯示範圍縮小(如「在 40-60 之間」),但扣 1 次機會。
  4. 多玩家輪流猜:維護玩家清單與分數,支援雙人對戰模式。
  5. 圖形化介面:移植至 WinForms / WPF / Blazor,加入動畫與音效。

總結

本範例展示了從需求分析、類別設計、輸入驗證、迴圈控制到使用者體驗的完整開發流程。掌握這類小型專案的結構化寫法,是進階開發大型系統的基礎訓練。

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