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

C# 網路版鬥地主(一):出牌權限傳遞架構與 Player 類別設計

     編輯:關於C語言

出牌順序與權限設計

出牌順序:Server → Client2 → Client1 → Server (循環)。使用 bool haveOrder 表示擁有出牌權,bool isBiggest 表示上輪出的牌為最大(無人能管)。

Player 類別核心程式碼

private bool _haveOrder;
public bool haveOrder { get { return _haveOrder; } set { _haveOrder = value; } }

private bool _isBiggest;
public bool isBiggest
{
    get { return _isBiggest; }
    set
    {
        if (value) // 設為 true 時廣播
        {
            if (DConsole.client != null) DConsole.client.SendDataForServer("IamIsBiggest");
            if (DConsole.server != null)
            {
                DConsole.server.SendDataForClient("NoBiggest", 1);
                DConsole.server.SendDataForClient("NoBiggest", 2);
            }
        }
        _isBiggest = value;
    }
}

public bool lead() // 出牌邏輯
{
    DConsole.leadPokers = leadPokers;
    leadPokers.Clear();
    foreach (int idx in selectPokers) leadPokers.Add(pokers[idx]);

    if (DConsole.IsRules(leadPokers)) // 符合規則
    {
        if (player1.isBiggest || leadPokers > DConsole.leadedPokerGroups.Last()) // 能管過上輪
        {
            if (leadPokers.type == PokerGroupType.炸彈) DConsole.multiple *= 2;
            if (leadPokers.type == PokerGroupType.雙王) DConsole.multiple *= 3;
            player1.isBiggest = true; // 假設自己最大
            BakPoker(); // 備份
            foreach (int idx in selectPokers) pokers.Remove(bakPokers[idx]);
            selectPokers.Clear();
            return true;
        }
        else { leadPokers.Clear(); return false; }
    }
    else { leadPokers.Clear(); return false; }
}

設計重點

  • isBiggest 設為 true 時主動通知其他玩家重置其 isBiggest,確保同一時間只有一個最大牌。
  • lead() 包含規則驗證、大小比較、炸彈/雙王加倍、移除已出牌、備份還原機制。
  • 權限傳遞由外部協調(伺服器/客戶端按鈕事件發送 Order 指令)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved