2

董事会

上面是电路板的图像

我发现很难弄清楚如何在不使用蛮力枚举的情况下连续检测 2 种颜色以确定获胜者。

我有一个算法,我一直在尝试实现它,但我似乎无法让它工作,任何人都知道如何做到这一点.. 会很有帮助,谢谢..

我想检测获胜者对角线垂直和水平..

ps 我通常不寻求解决方案,但这次我真的需要一些帮助。非常感谢

这是我为程序提供的代码,可让您放心

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        private Button[] btns;
        private Button[] btns2;
        private Button[] btns3;
        public Color[] col;
      //  public var x;

        public Form1()
        {
            InitializeComponent();

            btns = new Button[2] { button2, button3 };
            btns2 = new Button[2] { button4, button5 };
            btns3 = new Button[2] { button9, button8 };
            col = new Color[2] { Color.Red, Color.Yellow };
           Color x = col[0];
            Color y = col[1];


        }



        private void Form1_Load(object sender, EventArgs e)
        {

            foreach (var btn in btns)
            {
                btn.Enabled = false;
                btn.BackColor = Color.LightCyan;
            }

            foreach (var btn in btns2)
            {
                btn.Enabled = false;
                btn.BackColor = Color.LightCyan;
            }
            foreach (var btn in btns3)
            {
                btn.Enabled = false;
                btn.BackColor = Color.LightCyan;
            }
        }




        public int state;
        int cc = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (var btn in btns)
            {
                  {
                    if (!btn.Enabled)
                    {
                        btn.Enabled = true;

                        if (cc == 0)
                        {
                            cc = 1;
                            btn.BackColor = col[0];

                        }
                        else
                        {
                            cc = 0;
                            btn.BackColor = col[1];
                        }



                        return;
                    }

                }
            }       
        }


        private void button6_Click(object sender, EventArgs e)
        {
            foreach (var btn in btns2)
            {
                if (!btn.Enabled)
                {
                    btn.Enabled = true;

                    if (cc == 0)
                    {
                        cc = 1;
                        btn.BackColor = col[0];
                    }
                    else
                    {
                        cc = 0;
                        btn.BackColor = col[1];

                    }



                    return;
                }
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {

            foreach (var btn in btns3)
            {
                if (!btn.Enabled)
                {
                    btn.Enabled = true;

                    if (cc == 0)
                    {
                        cc = 1;
                        btn.BackColor = col[0];
                    }
                    else
                    {
                        cc = 0;
                        btn.BackColor = col[1];

                    }



                    return;
                }
            }

        }
    }
}
4

5 回答 5

4

您不应该使用按钮执行此逻辑。创建一个实现逻辑的游戏类,您可以通过包含 X 和 Y 参数的函数调用来控制它。

然后在每次单击按钮时,您都会调用游戏逻辑,就像game.MakeMove(0, 0);单击左上角的按钮一样。

这样做的好处:它是可测试的,用户界面可以很容易地改变。

于 2012-11-01T15:26:21.357 回答
1

两种选择。更简单的方法是创建一个Button[][]数组,然后填充它以匹配按钮的实际位置。然后您可以通过索引检查其他按钮。

更复杂的是创建一个子类,Button它知道它自己在网格中的位置(XY属性),并且知道如何找到相邻的按钮。然后,您可以获得相同颜色的所有相邻按钮的列表,并以这种方式建立一个链。

于 2012-11-01T15:19:03.070 回答
1

这就是我认为没有任何代码的逻辑方法,因为我目前正在工作并且无法测试任何东西。您需要安排您的按钮或部件或您的游戏最终将在某种二维数组/集合中,并为 X 和 Y 轴设置相应的值。

单击按钮时,您只需检查相关的触摸按钮即可检查潜在匹配项。例如。让我们假设左下角的按钮位于位置 0,0。如果单击它,您只需检查 1,0 和 0,1 处的按钮,看看它们是否是相同的颜色,就知道已经进行了匹配。

无论您需要多少匹配,这都可以轻松扩展为有效集合。它还允许您避免“蛮力”方法。在与以前完全相同的情况下,如果您连续查找 4 个并且 0,1 不是相同的颜色,您不需要检查 0,2 或 0,3 或沿该轴的任何其他内容,因为我们已经知道那里没有比赛。

于 2012-11-01T15:19:19.153 回答
1

您应该考虑使用多维数组来表示您的数据 - 按钮。换句话说,一个矩阵。

基本上,您可以像这样声明您的按钮:

private Button[,] buttons = new Button[2, 3];

MSDN 页面解释了多维数组的工作原理

然后,您可以迭代数组以检测任何逻辑 - 水平、垂直、对角线匹配等。您可以编写如下内容:

bool hasAWinner = false;
// for each line
for (int i = 0; i < 2; i++)
    Dictionary<Color, int> numberOfbuttonsWithColor = new Dictionary<Color, int>();
    numberOfbuttonsWithColor[Color.Red] = 0;
    numberOfbuttonsWithColor[Color.Yellow] = 0;

    // detect if there is at least two buttons of the same color
    for (int j = 0; j < 3; j++) {
        Color currentButtonColor = buttons[i,j].BackColor;
        numberOfbuttonsWithColor[currentButtonColor]++;
        if (numberOfbuttonsWithColor[currentButtonColor] == 2) {
            hasAWinner = true;
            break;
        }
    }

    if (hasAWinner) break;
}


// execute victory actions
if (hasAWinner) {
    Console.writeline(String.format("Color {0} wins!", currentButtonColor);
}
于 2012-11-01T15:25:36.740 回答
0

这个怎么样。

以每个按钮的列和行命名。即btn00(左上角)、btnNN(右下角,N为行数和列数,假设为正方形)等。

在每个事件处理程序上,保存单击按钮的名称及其颜色。然后遍历每种颜色的单击按钮集合并比较索引。如果您找到两个符合以下条件的按钮名称,则它是连续两个:

if ((Math.Abs(index0ButtonA - index0ButtonB) == 1 && index1ButtonA == index1ButtonB) || ( Math.Abs(index1ButtonA - index1ButtonB) == 1 && index0ButtonA == index0ButtonB)
{
     twoInARow = true;
}
于 2012-11-01T15:24:17.100 回答