C# используйте l oop для проверки нажатий кнопок в Windows форме - PullRequest
0 голосов
/ 15 апреля 2020

Я создаю версию игры Qwixx в C# для классного проекта. В настоящее время у меня есть кнопки от P1R2 до P1R12 подряд слева направо. Когда нажата кнопка «Завершение поворота», она отключает все кнопки, которые имеют X или - вместо числа.

        private void P1R2_Click(object sender, EventArgs e)
    {
        if (P1R2Clicked == false)
        {
            P1R2.Text = "X";
            P1R2Clicked = true;
        }
        else
        {
            P1R2.Text = "2";
            P1R2Clicked = false;
        }
    }

    private void P1R3_Click(object sender, EventArgs e)
    {
        if (P1R3Clicked == false)
        {
            P1R3.Text = "X";
            if (P1R2.Text == "2")
            {
                P1R2.Text = "-";
            }
            P1R3Clicked = true;
        }
        else
        {
            P1R3.Text = "3";
            if (P1R2.Text == "-")
            {
                P1R2.Text = "2";
            }
            P1R3Clicked = false;
        }
    }

    private void P1R4_Click(object sender, EventArgs e)
    {
        if (P1R4Clicked == false)
        {
            P1R4.Text = "X";
            if (P1R3.Text == "3")
            {
                P1R3.Text = "-";
            }
            if (P1R2.Text == "2")
            {
                P1R2.Text = "-";
            }
            P1R4Clicked = true;
        }
        else
        {
            P1R4.Text = "4";
            if (P1R3.Text == "-")
            {
                P1R3.Text = "3";
            }
            if (P1R2.Text == "-")
            {
                P1R2.Text = "2";
            }
            P1R4Clicked = false;
        }
    }

Используя приведенный выше код, я проверяю, может ли пользователь нажимать кнопку несколько раз и изменяет текст на кнопках слева, если они отображают номер. Я пытаюсь найти способ выполнить эти проверки через метод в другом классе, где я могу выполнить итерацию по al oop. Проблема в том, что я не могу найти способ проверить переменную P1R # Кликнул на pu sh через al oop. Или как запустить P1R # .Text через. Мысли?

Редактировать: Красная строка

        private void P1Red_Click(object sender, EventArgs e)
    {
        var index = Array.IndexOf(P1RedButtons, sender);
        if (index == 10)
        {
            foreach (Button s in P1RRow.Controls.OfType<Button>())
            {
                if (s.Text == "X")
                {
                    P1NoRed++;
                }
            }
            P1RedButtons[index].Text = P1NoRed < 5 ? (index + 2).ToString() : "X";
            P1RedClicked[index] = P1NoRed < 5 ? !P1RedClicked[index] : P1RedClicked[index];
            P1RedX[index] = P1NoRed < 5 ? !P1RedX[index] : P1RedX[index];
            P1NoRed = 0;
        }
        else
        {
            P1RedButtons[index].Text = P1RedClicked[index] ? (index + 2).ToString() : "X";
        }
            if (index != 0)
            {
                if (P1RedClicked[index - 1] == false)
                {
                    int red1found = Array.LastIndexOf(P1RedX, true, index - 1);

                    for (int j = index - 1; j > red1found; j--)
                    {
                        P1RedButtons[j].Text = P1RedClicked[index] ? (j + 2).ToString() : "-";
                    }
                }
            }
        P1RedClicked[index] = !P1RedClicked[index];
        P1RedX[index] = !P1RedX[index];
    }

В этом коде P1NoRed является счетчиком, чтобы проверить, были ли нажаты хотя бы 5 кнопок и имеют «X». " на них. Это не позволит нажать цифру 12, пока в строке не будет 5 других «Х». В настоящее время все работает, в том числе ставит "-" слева от числа, по которому щелкнули, и отменяет его, если щелкнуть снова. Кнопка «Конец поворота» блокирует эти кнопки и блокирует любые кнопки «X» или «-». В настоящее время я работаю над поиском способа отслеживания количества кнопок, нажимаемых за ход до нажатия кнопки «Завершение хода». В соответствии с правилами игры, на вашем ходу можно нажать 2 кнопки, 1 кнопку, если это не ваш ход. Я знаю, что где-то в событии мне нужен счетчик, возможно, сканирующий массив P1RedClicked на предмет истинных значений. Я думаю, что когда нажимается второй x, чтобы отключить любую кнопку от самого дальнего правого «X» в ряду до левого конца. Я был бы открыт для предложений, поскольку я работаю над этим. Большое спасибо @Enigmativity за всю помощь.

1 Ответ

0 голосов
/ 15 апреля 2020

Вместо того, чтобы работать с различными переменными, я предлагаю вам создать массивы ваших кнопок и проверить переменные, а затем использовать эти массивы.

Начните с этого:

private Button[] P1Buttons;
private bool[] P1ButtonsClicked;

Теперь, в Form_Load имеют этот код:

P1Buttons = new []
{
    P1R2, P1R3, P1R4, P1R5, P1R6, P1R7,
    P1R8, P1R9, P1R10, P1R11, P1R12, 
};

P1ButtonsClicked = P1Buttons.Select(b => false).ToArray();

Array.ForEach(P1Buttons, b => b.Click += P1Button_Click);

Вы присоединяете все Click события к этому методу:

private void P1Button_Click(object sender, EventArgs e)
{
    var index = Array.IndexOf(P1Buttons, sender);
    if (P1ButtonsClicked[index] == false)
    {
        P1Buttons[index].Text = "X";
        P1ButtonsClicked[index] = true;
    }
    else
    {
        P1Buttons[index].Text = "2";
        P1ButtonsClicked[index] = false;
    }
}

Вам просто нужно переписать этот код для обработки всех случаев с index == 0 (кнопка P1R2) до index == 10 (кнопка P1R12).

Я бы посоветовал вам немного изменить свое представление о том, как вы пишете этот обработчик событий. , Попробуйте это:

private void P1Button_Click(object sender, EventArgs e)
{
    var index = Array.IndexOf(P1Buttons, sender);
    P1Buttons[index].Text = P1ButtonsClicked[index] ? "2" : "X";
    P1ButtonsClicked[index] = !P1ButtonsClicked[index];
}

Исключение операторов if обычно является хорошим способом уменьшить количество повторений и ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...