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

C# 介面實戰:猜拳遊戲與多型設計

     編輯:關於C語言

領域模型:手勢選項

先定義固定的手勢常數,這裡使用靜態類別(也可用枚舉或 Smart Enum):

public static class Options
{
    public const string JianDao = "剪刀";
    public const string ShiTou = "石頭";
    public const string Bu = "布";
}

介面定義

public interface IPlayer
{
    string GetName();
    string Show(); // 出拳
}

玩家實作:爺爺(隨機)與孫子(固定剪刀)


public class Grandpa : IPlayer
{
    private static readonly Random _rnd = new Random();
    public string GetName() => "爺爺";
    public string Show()
    {
        int i = _rnd.Next(3);
        return i switch
        {
            0 => Options.JianDao,
            1 => Options.ShiTou,
            _ => Options.Bu
        };
    }
}

public class Grandson : IPlayer
{
    public string GetName() => "孫子";
    public string Show() => Options.JianDao; // 永遠出剪刀
}

遊戲引擎:利用多型進行對戰


public class Game
{
    public void PlayRound(IPlayer p1, IPlayer p2)
    {
        string g1 = p1.Show(), g2 = p2.Show();
        Console.WriteLine($"{p1.GetName()} 出 {g1},{p2.GetName()} 出 {g2}");

        string result = Judge(g1, g2);
        Console.WriteLine(result);
    }

    private string Judge(string a, string b)
    {
        if (a == b) return "平手";
        return (a, b) switch
        {
            (Options.JianDao, Options.Bu) => "剪刀勝",
            (Options.Bu, Options.ShiTou) => "布勝",
            (Options.ShiTou, Options.JianDao) => "石頭勝",
            _ => "另一方勝"
        };
    }
}

執行結果範例


爺爺 出 石頭,孫子 出 剪刀
石頭勝
爺爺 出 布,孫子 出 剪刀
剪刀勝

設計重點

  • 介面隔離:IPlayer 只定義必要契約,不綁定具體策略
  • 開放封閉:新增玩家型別(如 AI、網路玩家)無需修改 Game
  • 單一職責:判斷邏輯集中在 Game.Judge,玩家只負責出拳
類別圖示意
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved