private void btnLead_Click(object sender, EventArgs e)
{
if (player1.lead()) // 嘗試出牌
{
btnLead.Visible = false; btnPass.Visible = false;
if (server != null) // 伺服器端
{
server.SendDataForClient("SPokerCount" + player1.pokers.Count, 1);
Thread.Sleep(100);
server.SendDataForClient("SPokerCount" + player1.pokers.Count, 2);
Thread.Sleep(100);
server.SendDataForClient("server", DConsole.leadPokers, 1);
Thread.Sleep(100);
server.SendDataForClient("server", DConsole.leadPokers, 2);
Thread.Sleep(100);
if (player1.pokers.Count == 0 && DConsole.IsStart)
{
DConsole.Winer = 1; DConsole.Restart();
}
else
{
server.SendDataForClient("Order", 2); // 傳遞權限給 Client2
}
DConsole.player1.haveOrder = false;
}
if (client != null) // 客戶端
{
client.SendDataForServer("PokerCount" + player1.pokers.Count);
Thread.Sleep(500);
client.SendDataForServer("client", DConsole.leadPokers);
Thread.Sleep(100);
player1.haveOrder = false;
}
player1.g.Clear(BackColor);
player1.Paint();
DConsole.PaintPlayer1LeadPoker();
}
else
{
DConsole.Write("[系統訊息]:您出的牌不符合規則!");
}
}
public void AcceptClient1Data()
{
NetworkStream Ns1 = client1.GetStream();
string str1 = "";
while (true)
{
byte[] bytes1 = new byte[108];
Ns1.Read(bytes1, 0, 108);
str1 = Encoding.Default.GetString(bytes1);
// ... 略 ...
if (str1.StartsWith("client")) // Client1 出牌
{
SendDataForClient(str1, 2); // 轉發給 Client2
Thread.Sleep(sleep);
// 解析牌組、繪圖、驗證 ...
if (!DConsole.IsRestart) DConsole.player1.haveOrder = true; // 權限回伺服器
else DConsole.IsRestart = false;
continue;
}
if (str1.StartsWith("Pass")) // Client1 Pass
{
// 繪製「不要」、設定伺服器 haveOrder=true、轉發 ClientPass 給 Client2
continue;
}
if (str1.StartsWith("IamIsBiggest")) // Client1 宣稱最大
{
DConsole.player1.isBiggest = false;
SendDataForClient("NoBiggest", 2); // 通知 Client2
continue;
}
}
}
// AcceptClient2Data 邏輯對稱,權限傳遞順序:Server → Client2 → Client1 → Server
Server → Client2 → Client1 → Server (循環)