Индекс изображения не всегда меняется - PullRequest
0 голосов
/ 11 апреля 2020

Итак, я пытаюсь закодировать простую игру памяти в Windows формах, но я столкнулся с простой проблемой, которую почему-то не могу пройти. Это код одной кнопки (все они выглядят очень похоже):

    Match CheckForMatches = new Match();
    private void Pathfinder_Click(object sender, EventArgs e)
    {
        CheckForMatches.AddButton(Pathfinder);
        CheckForMatches.Matched();
    }

(где объект CheckForMatches совместно используется всеми кнопками в заданной форме)

И здесь называются коды методов:

    public void AddButton(Button newButton)          
    {
        if (firstButtonPressed == null)
        {
            firstButtonPressed = newButton;
            firstButtonPressed.ImageIndex = 0;                      //uncovering card
        }
        else
        { 
            secondButtonPressed = newButton;
            secondButtonPressed.ImageIndex = 0;
            Thread.Sleep(1000);
        }
    }

    public bool Matched()
    {
        if (firstButtonPressed != null && secondButtonPressed != null )
        {
            if (firstButtonPressed.Name != secondButtonPressed.Name)
            {
                if (firstButtonPressed.Text == secondButtonPressed.Text)
                {
                    DisposeButtons();
                    return true;
                }
                else
                {
                    NullButtons();
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

Теперь этот метод вызывает одну из двух других, в зависимости от того, являются ли последние 2 нажатые кнопки парой или нет (в зависимости от их имени и текста):

В случае успеха располагаются кнопки. и нуль Переменные класса соответствия:

    public void DisposeButtons()
    {
        firstButtonPressed.Dispose();
        secondButtonPressed.Dispose();

        firstButtonPressed = null;
        secondButtonPressed = null;
    }

Это случай сбоя охватывает карты, а также нулевые переменные класса соответствия:

    public void NullButtons()
    {
        firstButtonPressed.ImageIndex = 1;              //covering cards
        secondButtonPressed.ImageIndex = 1;

        firstButtonPressed = null;
        secondButtonPressed = null;
    }

Дело в том, где бы я ни размещал Thread.Sleep (1000), пользователь никогда не увидит вторую карточку, которую выберет. Он всегда видит первую, а затем, когда выбирает вторую, либо удаляются обе карты (приложение зависает из-за этой задержки), либо первая закрывается, не открывая вторую.

РЕДАКТИРОВАТЬ: Я добавил вывод в окно отладчика, так что теперь метод AddButton выглядит следующим образом:

        public void AddButton(Button newButton)
    {
        if (firstButtonPressed == null)
        {
            firstButtonPressed = newButton;
            Debug.WriteLine("Before index chaning: " + firstButtonPressed.ImageIndex);
            firstButtonPressed.ImageIndex = 0;                      //uncovering card
            Debug.WriteLine("After index chaning: " + firstButtonPressed.ImageIndex);
        }
        else
        { 
            secondButtonPressed = newButton;
            Debug.WriteLine("Before index chaning: " + secondButtonPressed.ImageIndex);
            secondButtonPressed.ImageIndex = 0;
            Debug.WriteLine("After index chaning: " + secondButtonPressed.ImageIndex);
            Thread.Sleep(1000);
        }
    }

Я вижу там, что свойство кнопок ImageIndex фактически изменяется между 1 и 0. Однако на практике это видно только тогда, когда первый, если вызывается блок этого метода. Буду благодарен за ответ, почему и как это изменить.

1 Ответ

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

Хорошо, я узнал, может быть, не лучшее решение, но оно работает. Я просто заставил кнопку refre sh. Правильная форма метода AddButton:

    public void AddButton(Button newButton)
    {
        if (firstButtonPressed == null)
        {
            firstButtonPressed = newButton;
            Debug.WriteLine("Before index changing: " + firstButtonPressed.ImageIndex);
            firstButtonPressed.ImageIndex = 0;                                           //uncovering card
            Debug.WriteLine("After index changing: " + firstButtonPressed.ImageIndex);
        }
        else
        { 
            secondButtonPressed = newButton;
            Debug.WriteLine("Before index changing: " + secondButtonPressed.ImageIndex);
            secondButtonPressed.ImageIndex = 0;
            secondButtonPressed.Refresh();
            Debug.WriteLine("After index changing: " + secondButtonPressed.ImageIndex);
            Thread.Sleep(500);
        }
    }

Надеюсь, он кому-нибудь пригодится однажды.

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