如何遍历枚举数组

时间:2019-02-10 23:14:08

标签: c# arrays wpf loops

我正在研究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}}

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数组偏移量匹配的数组中,将给按钮上色更加困难。但是,这不是问题的一部分,所以我把它留给您练习……