我正在研究tictactoe 5x5 WPF应用程序,在这里我需要检查按钮是否与附近的按钮具有相同的标记,以检查获胜者(左2,右1左,右2右) )。
有一个声明为mResults = new MarkType[25];
的静态数组,其中MarkType
是枚举(自由,无,交叉)。
我想在功能mResults
中每次单击来遍历按钮(Button_Click
)的数组。
我知道一种解决方案,基本上,您可以在其中复制并粘贴(大约粘贴到索引中),但是ifs似乎太多了:
if (mResults[0] != MarkType.Free && (mResults[0] & mResults[1] & mResults[2]) == mResults[0])
{
// game ends
mGameEnded = true;
// highlight winning cells in green
Button0_0.Background =Button1_0.Background=Button2_0.Background=Brushes.Green;
}
在声明了mResults
的同时,有没有什么方法可以声明要遍历数组index
的函数?
var column = Grid.GetColumn(button);
var row = Grid.GetRow(button);
var index = column + (row * 5);`
我尝试仅将if
函数mResults
用于数组if (mResults[index] != MarkType.Free && (mResults[index] & mResults[index+1] & mResults[index+2]) == mResults[index])
{
// game ends
mGameEnded = true;
// highlight winning cells in green
Button0_0.Background = Button1_0.Background = Button2_0.Background = Brushes.Green;
}
中的前三个元素,但是它似乎不起作用:
{{1}}
答案 0 :(得分:0)
检查水平,垂直或对角线连续3个标记的获胜组合并不困难(我相信这是您追求的目标):
public enum MarkType
{
Free = 0,
Nought = 1,
Cross = 2
}
private const int size = 5;
private readonly MarkType[] mResults = new MarkType[size * size];
public MarkType CheckWin()
{
for (var x = 0; x < size; x++)
{
for (var y = 0; y < size; y++)
{
var offset = y * size + x;
var mark = mResults[offset];
if (mark == MarkType.Free)
{
// We don't do the checks when we are on a free mark
continue;
}
if (x <= size - 3 && mark == mResults[offset + 1] && mark == mResults[offset + 2])
{
// Horizontal match at (x,y)..(x+2,y)
return mark;
}
if (y <= size - 3 && mark == mResults[offset + size] && mark == mResults[offset + size * 2])
{
// Vertical match at (x,y)..(x,y+2)
return mark;
}
if (x <= size - 3 && y <= size - 3 && mark == mResults[offset + (size + 1)] && mark == mResults[offset + (size + 1) * 2])
{
// Diagonal match at (x,y)..(x+2,y+2)
return mark;
}
if (x <= size - 3 && y >= 2 && mark == mResults[offset - (size - 1)] && mark == mResults[offset - (size - 1) * 2])
{
// Diagonal match at (x,y)..(x+2,y-2)
return mark;
}
}
}
return MarkType.Free;
}
但是,只要您不将按钮着色在与mResult
数组偏移量匹配的数组中,将给按钮上色更加困难。但是,这不是问题的一部分,所以我把它留给您练习……