我正在制作一个包含Tic Tac Toe游戏的客户端/服务器应用程序,其中两个连接的客户端可以玩游戏。 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;
}
}));
}
答案 0 :(得分:1)
您拥有客户端代码吗?如果是这样,听起来你正在使它变得比它需要的更困难。为什么不用简单的3x3数组简化实现,该数组包含对每个tic tac toe位置按钮的引用。然后,您所要做的就是从客户端消息中提取按钮的坐标,并在另一个客户端上的相同位置更新按钮。
例如,消息“点击按钮:2,1”将转换为:
buttonArray[2,1].Enabled = false;
或您需要对按钮执行的任何其他操作。