Форма C#, пытающаяся изменить случайное изображение PictureBox на случайное изображение с таймером

Я пытаюсь сделать следующее:

Мне нужны 4 бокса с картинками, которые я получил в форме, чтобы получить лицевые стороны карты - я имею в виду, переверните их. случайная карта из 4 будет выбрана, перевернута и покажет лицевую сторону карты, выбранной также случайным образом.

После того, как карта перевернута, она не может быть повернута снова в следующем интервале таймера, и после того, как все карты были перевернуты, появляется messageBox, и как только пользователь нажимает ОК, все перезапускается.

Проблема в том, что messageBox продолжает появляться снова и снова из-за положительного значения флага. Я не знаю, какую переменную использовать, чтобы этого не произошло.

Соответствующий код:

//This function is the timer's function, it starts every time interval:
    private void cardsChangingTimer_Tick(object sender, EventArgs e)
    {
        int chosenImage = rnd.Next(1, 17);
        int chosenCard = rnd.Next(0, 4);
        if (bucketArr[chosenCard] == 0)
        {
            bucketArr[chosenCard]++;
            switch (chosenCard)
            {
                case 0:
                    card1Pic.Image = Image.FromFile("cards\\" + chosenImage + ".png");
                    break;
                case 1:
                    card2Pic.Image = Image.FromFile("cards\\" + chosenImage + ".png");
                    break;
                case 2:
                    card3Pic.Image = Image.FromFile("cards\\" + chosenImage + ".png");
                    break;
                case 3:
                    card4Pic.Image = Image.FromFile("cards\\" + chosenImage + ".png");
                    break;

            }
        }
        gameEnded = true;
        for (int i = 0; i < bucketArr.Length; i++) 
        {
            if (bucketArr[i] == 0)
            {
                gameEnded = false;
                break;
            }
        }
        if (gameEnded)
        {
            DialogResult dialog = MessageBox.Show("All 4 cards were turned over...");
            if (dialog == DialogResult.OK)
            {
                card1Pic.Image = Image.FromFile("..\\..\\17.png");
                card2Pic.Image = Image.FromFile("..\\..\\17.png");
                card3Pic.Image = Image.FromFile("..\\..\\17.png");
                card4Pic.Image = Image.FromFile("..\\..\\17.png");
            }
            gameEnded = false;
            for(int i = 0; i < bucketArr.Length; i++)
                bucketArr[i] = 0;
        }
    }

Большое спасибо за любую помощь ...

Используйте отладчик! Вы ведь установили значение true, верно? Имеет ли для вас смысл логика после?

TaW 18.05.2018 18:20

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

MasterSplinter 18.05.2018 18:22

Я думаю, мне просто нужно изменить способ определения, есть ли в массиве ноль или больше нет в середине цикла for ... Я просто не знаю, как

MasterSplinter 18.05.2018 18:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что таймер продолжает работать, пока отображается диалоговое окно. Просто остановите таймер до того, как отобразится MessageBox, а затем перезапустите таймер после того, как окно вернется.

private void cardsChangingTimer_Tick(object sender, EventArgs e)
{
    int chosenImage = rnd.Next(1, 17);
    int chosenCard = rnd.Next(0, 4);

    /// ... Rest of the code goes here

            break;
        }
    }
    if (gameEnded)
    {
        //Get a reference to the timer and stop it.
        var timer = (Timer)sender;
        timer.Stop();

        DialogResult dialog = MessageBox.Show("All 4 cards were turned over...");
        if (dialog == DialogResult.OK)
        {
            card1Pic.Image = Image.FromFile("..\\..\\17.png");
            card2Pic.Image = Image.FromFile("..\\..\\17.png");
            card3Pic.Image = Image.FromFile("..\\..\\17.png");
            card4Pic.Image = Image.FromFile("..\\..\\17.png");
        }
        gameEnded = false;
        for(int i = 0; i < bucketArr.Length; i++)
            bucketArr[i] = 0;

        //start the timer here after everything has been re-initialized.
        timer.Start();
    }
}

Спасибо, Скотт! Работает!! Не знал, что ты сможешь это сделать. Большое спасибо.

MasterSplinter 18.05.2018 18:29

Другие вопросы по теме