出牌權限用 bool haveOrder 表示。關鍵難點:玩家出牌後他人都「不出」,該玩家不能再「不出」,需引入 isBiggest 標記「我是本輪最大」。
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;
}
Send("Order", 2) 傳給下家 Client2Send("Order", 1) 傳給 Client1haveOrder = true// 伺服器接收 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 四大核心部分,形成閉環傳遞。代碼量較大,建議下載完整專案對照閱讀。