0

我正在制作一个包含井字游戏的客户端/服务器应用程序,两个连接的客户端可以在其中玩游戏。3 x 3 网格由 9 个动态创建的按钮组成。当第一个客户端单击网格上的按钮时,该按钮被禁用并且内容显示“X”。一个值被发送到服务器,然后发送到另一个连接的客户端。根据客户端收到的值,我希望禁用相同的按钮并将内容更改为“X”。

我遇到的问题是找到在客户端动态创建的按钮。任何帮助表示赞赏!

 //Dynamically created 9 buttons on the client
 private void initBoard(int rank)
    {

        board = new tttBoard(rank);
        boardGrid.Children.Clear();
        boardGrid.Rows = rank;
        for (int i = 0; i < rank; i++)
        {
            for (int j = 0; j < rank; j++)
            {
                newButton = new Button();
                newButton.Tag = new Point(i, j);
                newButton.Name = "b" + i.ToString() + j.ToString();
                newButton.Content = newButton.Tag;
                boardGrid.Children.Add(newButton);
            }
        }
    }

//Method that receives data - CheckButton called method within this
public void OnDataReceived(IAsyncResult ar)
    {
        try
        {
            SocketPacket sckID = (SocketPacket)ar.AsyncState;
            int iRx = sckID.thisSocket.EndReceive(ar);
            char[] chars = new char[iRx];
            Decoder d = Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(sckID.dataBuffer, 0, iRx, chars, 0);
            szData = new String(chars);
            this.Dispatcher.Invoke((Action)(() =>
            {
                if(szData.Contains("Clicked button : "))
                {
                    return;
                }
                else
                    lbxMessages.Items.Add(txtMessage.Text + szData);
            }));

            ClickButton();

            WaitForData();
        }
        catch (ObjectDisposedException)
        {
            Debugger.Log(0, "1", "\n OnDataRecieved: Socket has been closed\n");
        }
        catch(SocketException se)
        {
            MessageBox.Show(se.Message);
        }
    }

//based on the message received from the server, I check to see if 
//it contains "Clicked button: " and a value that I use to locate the correct 
//button to disable and change content to 'x' to represent the move made by the 
//other client

public void ClickButton()
    {
        if (szData.Contains("Clicked button : "))
        {
            value = szData.Substring(17, 1);
        }
        this.Dispatcher.Invoke((Action)(() =>
        {
            btnName = "b0" + value;
            object item = grdClient.FindName(btnName);//boardGrid.FindName(btnName);
            if (item is Button)
            {
                Button btn = (Button)item;
                btn.IsEnabled = false;
            }
        }));
    }
4

1 回答 1

1

您拥有客户端代码吗?如果是这样,听起来你让它变得比需要的更困难。为什么不使用一个 3x3 数组来简化实现,该数组包含对每个井字游戏位置中的按钮的引用。然后您所要做的就是从客户端消息中提取按钮的坐标,并在另一个客户端上更新相同位置的按钮。

例如,消息“clicked button : 2, 1”将转换为:

buttonArray[2,1].Enabled = false;

或您需要对按钮执行的任何其他操作。

于 2012-12-12T18:10:39.490 回答