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

C# 網路版鬥地主(二):伺服器與客戶端出牌權限傳遞邏輯

     編輯:關於C語言

出牌按鈕事件 (btnLead_Click)

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("[系統訊息]:您出的牌不符合規則!");
    }
}

伺服器接收客戶端資料 (AcceptClient1Data / AcceptClient2Data)

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 (循環)

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