Игра пятнадцати (Swift): дополнительное касание, чтобы подтвердить расположение всех кнопок - PullRequest
1 голос
/ 11 января 2020

Может кто-нибудь сказать мне, что не так с логикой c?
Я играю в Пятнадцать и столкнулся с проблемой. Мне нужно убедиться, что все пятнадцать кнопок расположены правильно:

logi c:
Каждый раз, когда нажимается кнопка
1. функция makeMove () меняет положение Кнопка.
2. Функция checkGameOver () проверяет, все ли кнопки расположены правильно, если да, то функция showAlert () отображает всплывающее окно.

проблема:
когда все кнопки расположены, showAlert () не срабатывает, и мне нужно снова нажать любую кнопку, чтобы открыть всплывающее окно

Спасибо.

func makeMove(button: UIButton) {
        var currentButtonNumber = button.tag - 1
        if ( currentButtonNumber >= 0 && currentButtonNumber <= 15 ) && button.tag != 4 && button.tag != 8 && button.tag != 12 {
            guard buttons[button.tag - 1].backgroundColor != .none else {
                buttons[button.tag - 1].backgroundColor = .yellow
                buttons[button.tag - 1].setTitle(button.titleLabel?.text, for: .normal)
                buttons[button.tag].backgroundColor = .none
                button.setTitle("", for: .normal)
                return
            }
        }

        currentButtonNumber = button.tag + 1
        if ( currentButtonNumber >= 0 && currentButtonNumber <= 15 ) && button.tag != 3 && button.tag != 7 && button.tag != 11 {
            guard buttons[button.tag + 1].backgroundColor != .none else {
                buttons[button.tag + 1].backgroundColor = .yellow
                buttons[button.tag + 1].setTitle(button.titleLabel?.text, for: .normal)
                buttons[button.tag].backgroundColor = .none
                button.setTitle("", for: .normal)
                return
            }
        }

        currentButtonNumber = button.tag - 4
        if currentButtonNumber >= 0 && currentButtonNumber <= 15 {
            guard buttons[button.tag - 4].backgroundColor != .none else {
                buttons[button.tag - 4].backgroundColor = .yellow
                buttons[button.tag - 4].setTitle(button.titleLabel?.text, for: .normal)
                buttons[button.tag].backgroundColor = .none
                button.setTitle("", for: .normal)
                return
            }
        }

        currentButtonNumber = button.tag + 4
        if currentButtonNumber >= 0 && currentButtonNumber <= 15 {
            guard buttons[button.tag + 4].backgroundColor != .none else {
                buttons[button.tag + 4].backgroundColor = .yellow
                buttons[button.tag + 4].setTitle(button.titleLabel?.text, for: .normal)
                buttons[button.tag].backgroundColor = .none
                button.setTitle("", for: .normal)
                return
            }
        }

    }
    func showAlert() {
        var minutes = 0
        var seconds = 0

        if timerCounter < 60 {
            seconds = timerCounter
        } else if timerCounter == 60 {
            minutes = 1
            seconds = 0
        } else {
            seconds = timerCounter % 60
            minutes = (timerCounter - seconds) / 60
        }

        let alert = UIAlertController(title: "Congratulations!",
                                      message: "You spent \(minutes) minutes and \(seconds) seconds", preferredStyle: .alert)

        let action = UIAlertAction(title: "OK",
                                   style: .default, handler: {
                                    action in
                                    self.setNewGame() 
        })

        alert.addAction(action)

        present(alert, animated: true, completion: nil)
    }

    func checkGameOver() -> Bool {
        var isGameOver = false
        var rightOrderCounter = 0

        for number in 0...14 {
            if (buttons[number].titleLabel?.text == String(number + 1)) {
                rightOrderCounter += 1
            } else {
                rightOrderCounter = 0
                break
            }
        }

        if rightOrderCounter == 15 {
            isGameOver = true
        }

        return isGameOver

    }

    @IBAction func moveButton(button: UIButton) {

        makeMove(button: button)

        if self.checkGameOver() {
            self.stopTimer()
            self.showAlert()
        }

    }

1 Ответ

0 голосов
/ 11 января 2020

Ваша ошибка - использование названий кнопок в качестве модели. Проблема в том, что установка заголовка кнопки с помощью setTitle(:for:) не обязательно происходит до тех пор, пока вы не покинете основной поток. Поэтому, когда вы проверяете текущую titleLabel, она еще не была обновлена ​​и отражает предыдущее состояние.

Лучшим подходом является использование массива от Int до модели вашей головоломки и обновите заголовки кнопки, используя этот массив. Ваш checkGameOver() метод должен проверять порядок этого массива вместо заголовков кнопки.

Общее правило: Никогда не используйте элементы пользовательского интерфейса для хранения вашего состояния

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