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

C# 網路版鬥地主實戰(三):出牌權限傳遞機制完整實現

     編輯:關於C#

核心邏輯

出牌權限用 bool haveOrder 表示。關鍵難點:玩家出牌後他人都「不出」,該玩家不能再「不出」,需引入 isBiggest 標記「我是本輪最大」。

Player 關鍵屬性

public bool haveOrder { get; set; } // 是否有出牌權
private bool _isBiggest;
public bool isBiggest {
    get => _isBiggest;
    set {
        if (value) { // 宣稱自己最大
            if (isClient) Client.Send("IamIsBiggest");
            if (isServer) { Server.Send("NoBiggest", 1); Server.Send("NoBiggest", 2); }
        }
        _isBiggest = value;
    }
}

出牌邏輯

public bool Lead() {
    if (!Rules.Valid(leadPokers)) return false;
    if (isBiggest || leadPokers > lastLead) { // 兩種可出牌情況
        if (leadPokers.Type == Bomb) Multiple *= 2;
        if (leadPokers.Type == DoubleJoker) Multiple *= 3;
        isBiggest = true; // 假設自己最大
        RemovePlayedCards();
        return true;
    }
    return false;
}

權限傳遞流程(伺服器視角)

  1. 伺服器出牌 → 發送牌組給 Client1/2 → Send("Order", 2) 傳給下家 Client2
  2. Client2 出牌 → 伺服器轉發給 Client1 → Send("Order", 1) 傳給 Client1
  3. Client1 出牌 → 伺服器接收 → 自己 haveOrder = true
  4. 循環直到有人出完牌

關鍵網路協議片段

// 伺服器接收 Client1 出牌
if (msg.StartsWith("client")) {
    Send(msg, 2); // 轉發給 Client2
    leadedGroups.Add(Parse(msg));
    if (!Restart) player1.haveOrder = true; // 輪到伺服器
}

// Client 收到權限
if (msg.StartsWith("Order")) player1.haveOrder = true;

// 宣稱最大/取消最大
if (msg.StartsWith("IamIsBiggest")) { player1.isBiggest = false; Send("NoBiggest", other); }
if (msg.StartsWith("NoBiggest")) player1.isBiggest = false;

完整代碼結構

本文包含 Player.Lead()、Form.btnLead_Click、Server.AcceptClient1/2Data、Client.AcceptServerData 四大核心部分,形成閉環傳遞。代碼量較大,建議下載完整專案對照閱讀。

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