如何确定C#标签阵列中同一颜色的一行中的5个标签

本文关键字:标签 一行 5个 何确定 颜色 阵列 | 更新日期: 2023-09-27 18:21:48

我创建了一个标签的二维数组[19,19]。单击时,用户会根据迭代将标签的颜色更改为黑色或白色。当有五个相同颜色的标签水平排列时,我希望弹出一个消息框。这是在没有递归的情况下完成的。任何帮助都将不胜感激。

    public partial class Form1 : Form
{
int labelCount = 0;
        int iteration = 0;
        public Label[,] board = new Label[19,19];
        const int WinLength = 5;
        const int BoardWidth = 19;
        const int BoardHeight = 19;
        gamePlay obj = new gamePlay();
    public Form1()
    {
        InitializeComponent();
}
private void labelClick (object sender, EventArgs e)
{
Label x = (Label)sender;
            if (x.BackColor == Color.Transparent)
            {
                if (iteration % 2 == 0)
                {
                    x.BackColor = Color.Black;
                }
                else
                {
                    x.BackColor = Color.White;
                }
                iteration++;
            }
            else
            {
            }
for (int r = 0; r < BoardHeight; r++)
        {
            for (int c = 0; c < BoardWidth; c++)
            {
                if (board[r, c] == x)
                {
                    Color? winner = obj.CheckForWinner(board, r, c);
                    if (winner == Color.Black)
                    {
                        MessageBox.Show("Black is the winner!");
                    }
                    else if (winner == Color.White)
                    {
                        MessageBox.Show("White is the winner!");
                }
                // else winner is null, meaning no winner yet. 
            }
        }
    }
    private int[] FindClickedLabelCoordinates(Label[,] board, Label label)
    {
        for (int r = 0; r < BoardHeight; r++)
        {
            for (int c = 0; c < BoardWidth; c++)
            {
                if (board[r, c] == label)
                    return new int[] { r, c };
            }
        }
        return null;
        }
}
    class gamePlay
{
        const int WinLength = 5;
const int BoardWidth = 19;
const int BoardHeight = 19;
private Color? CheckForWinner(Label[,] board, int r, int c)
{
    Color startColor = board[r, c].BackColor;
    for (int c1 = c - WinLength + 1; c1 <= c; c1++)
    {
        if (c1 >= 0 && c1 < BoardWidth && board[r, c1].BackColor == startColor)
        {
            MessageBox.Show("you win!");
            bool win = true;
            for (int c2 = c1 + 1; c2 < c1 + WinLength; c2++)
            {
                if (c2 < 0 || c2 >= BoardWidth || board[r, c2].BackColor != startColor)
                {
                    win = false;
                    break;
                }
            }
            if (win)
            {
                return startColor;
            }
        }
    }
    return null;
}

如何确定C#标签阵列中同一颜色的一行中的5个标签

您只需在方法调用中传递它:

new abc().checkWin(board);

您还需要修复checkWin()方法签名:

public void checkWin(Label[,] board)
{
    ...
}

顺便说一句,checkWin()似乎是一个应该返回bool(如果获胜则为true,否则为false)而不是void的方法。

        int iteration = 0;
        public Label[,] board = new Label[19,19];
        const int WinLength = 5;
        const int BoardWidth = 19;
        const int BoardHeight = 19;
        gamePlay obj = new gamePlay();
    public Form1()
    {
        InitializeComponent();
}
private void labelClick (object sender, EventArgs e)
{
Label x = (Label)sender;
            if (x.BackColor == Color.Transparent)
            {
                if (iteration % 2 == 0)
                {
                    x.BackColor = Color.Black;
                }
                else
                {
                    x.BackColor = Color.White;
                }
                iteration++;
            }
            else
            {
            }
for (int r = 0; r < BoardHeight; r++)
        {
            for (int c = 0; c < BoardWidth; c++)
            {
                if (board[r, c] == x)
                {
                    Color? winner = obj.CheckForWinner(board, r, c);
                    if (winner == Color.Black)
                    {
                        MessageBox.Show("Black is the winner!");
                    }
                    else if (winner == Color.White)
                    {
                        MessageBox.Show("White is the winner!");
                }
                // else winner is null, meaning no winner yet. 
            }
        }
    }
    private int[] FindClickedLabelCoordinates(Label[,] board, Label label)
    {
        for (int r = 0; r < BoardHeight; r++)
        {
            for (int c = 0; c < BoardWidth; c++)
            {
                if (board[r, c] == label)
                    return new int[] { r, c };
            }
        }
        return null;
        }
}
    class gamePlay
{
        const int WinLength = 5;
const int BoardWidth = 19;
const int BoardHeight = 19;
private Color? CheckForWinner(Label[,] board, int r, int c)
{
    Color startColor = board[r, c].BackColor;
    for (int c1 = c - WinLength + 1; c1 <= c; c1++)
    {
        if (c1 >= 0 && c1 < BoardWidth && board[r, c1].BackColor == startColor)
        {
            MessageBox.Show("you win!");
            bool win = true;
            for (int c2 = c1 + 1; c2 < c1 + WinLength; c2++)
            {
                if (c2 < 0 || c2 >= BoardWidth || board[r, c2].BackColor != startColor)
                {
                    win = false;
                    break;
                }
            }
            if (win)
            {
                return startColor;
            }
        }
    }
    return null;
}