我正在为一个班级的Tic Tac Toe模拟器工作并遇到了一个问题。
我创建了一个二维数组来模拟电路板,并在所有方框中用0或1填充它。
我遇到的问题是将这些数字应用于我创建的标签(a1,a2,a3,b1,b2等)。
我的嵌套for
循环是否可以让数组中的每个元素都应用于新标签?我似乎无法在我的书或网上找到任何关于此事的内容。
以下是我的相关代码:
private void newBTN_Click(object sender, EventArgs e)
{
Random rand = new Random();
const int ROWS = 3;
const int COLS = 3;
int [,] board = new int[ROWS, COLS];
for (int row = 0; row < ROWS; row++)
{
for (int col = 0; col < COLS; col++)
{
board[row, col] = rand.Next(1);
}
}
}
答案 0 :(得分:0)
标签的名称是什么?我在下面假设标签是Label0_0,Label0_1,Label1_1等等......这样您就可以使用row
和column
值找到它们。
您希望动态地在表单上找到Label控件,因为您在编码时不会提前知道该名称。
如果你事先知道这个名字,你只需说:label1.Text = "1";
。
但是在你的情况下,你试图在循环的每次迭代中找到一个特定的控件。因此,您需要为标签命名,以便您可以使用Form.Controls.Find(string, bool)
找到它们:
var row = 4;
var col = 6;
var l = this.Controls.Find("Label" + row.ToString() + "_" + col.ToString(), false).FirstOrDefault() as Label;
if (l == null)
{
//problem... create label?
l = new Label() { Text = "X or O" }; //the position of this need to be set (the default is 0,0)
this.Controls.Add(l);
}
else
{
l.Text = "X or O";
}
答案 1 :(得分:0)
您的board
存储整数,这是游戏状态的内部表示。您可以为游戏GUI创建一个UniformGrid
,其中包含Label
。下面的代码返回基于您当前板的网格。您需要将此返回的网格添加到MainWindow(或任何您使用的)以查看它。
private UniformGrid fillLabels(int[,] board)
{
int numRow = board.GetLength(0);
int numCol = board.GetLength(1);
UniformGrid g = new UniformGrid() { Rows = numRow, Columns = numCol };
for (int i = 0; i < numRow; i++)
{
for (int j = 0; j < numCol; j++)
{
Label l = new Label();
l.Content = (board[i, j] == 0) ? "O" : "X";
Grid.SetRow(l, i);
Grid.SetColumn(l, j);
g.Children.Add(l);
}
}
return g;
}
答案 2 :(得分:0)
首先,每次需要时都不要重新创建(和重新初始化 e)Random
:它会使生成的序列倾斜严重:
private static Random s_Rand = new Random();
尝试不直接在按钮中实现算法,这是一个不好的做法:
private void CreateField() { ... }
private void newBTN_Click(object sender, EventArgs e) {
CreateField();
}
把所有人放在一起:
private static Random s_Rand = new Random();
private void ApplyLabelText(String name, String text, Control parent = null) {
if (null == parent)
parent = this;
Label lb = parent as Label;
if ((lb != null) && (String.Equals(name, lb.Name))) {
lb.Text = text;
return;
}
foreach(Control ctrl in parent.Controls)
ApplyLabelText(name, text, ctrl);
}
private void CreateField() {
for (Char row = 'a'; row <= 'c'; ++row)
for (int col = 1; col <= 3; ++col)
ApplyLabelText(row.ToString() + col.ToString(), s_Rand.Next(1) == 0 ? "O" : "X");
}
private void newBTN_Click(object sender, EventArgs e) {
CreateField();
}
答案 3 :(得分:0)
你怎么跳过INTEGER板直接转到Label阵列?
然后,您可以执行以下操作以循环所有这些:
Label[,] listOfLabels; // Do also initialize this.
foreach(Label current in listOfLabels)
{
current.Text = _rand.Next(2) == 0 ? "0" : "X";
}