Свифт вар оценка не увеличивается - PullRequest
1 голос
/ 21 февраля 2020
var players : [Player]?
var currentplayerIndex = 0
var currentQuestion : QuestionObject!
var questions = Questions()
var score = 0
var currentQuestionPos = 0


func updateUi() {
    if let score = players?[currentplayerIndex].score {
        playerPoints.text = "Points: \(score)"
    }
}

 func loadnextQuestion () {
        if(currentQuestionPos < questions.questions.count) {
        currentQuestionPos += 1

        if currentplayerIndex < players!.count - 1 {
            currentplayerIndex += 1
        } else {
            currentplayerIndex = 0
        }
            playerTurn.text = (players?[currentplayerIndex].name)
            currentQuestion = questions.questions[currentQuestionPos]
            questionText.text = currentQuestion.question
    }
}


@IBAction func submitButtonPressed(_ sender: UIButton) {
    let i = pickerView.selectedRow(inComponent: 0)
    if(currentQuestion.answer == i) {
        players?[currentplayerIndex].score += 1
        loadnextQuestion()
        updateUi()
    } else {
        updateUi()
        loadnextQuestion()
    }
}

}

Мой счет постоянно показывает только 0. Не увеличивается, когда ответ правильный. Все добавленные игроки получают 1 вопрос каждый, но рана все еще равна 0 для всех игроков.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Вы можете заменить действие кнопки работы

@IBAction func submitButtonPressed(_ sender: UIButton) {
    let i = pickerView.selectedRow(inComponent: 0)
    if(currentQuestion.answer == i) {
        players?[currentplayerIndex].score += 1
        updateUi()
        loadnextQuestion()
    } else {
        updateUi()
        loadnextQuestion()
    }
}
0 голосов
/ 21 февраля 2020

Ваш код не работает, потому что вы делаете эту серию вещей, когда ответ правильный:

players?[currentplayerIndex].score += 1
loadnextQuestion()
updateUi()

Счет игрока действительно увеличен. Но обратите внимание, что следующая вещь, которую вы делаете, это loadnextQuestion(), которая увеличивает currentplayerIndex. Это приводит к тому, что updateUi обновляет текст метки до значения следующего игрока, а не игрока, который только что правильно ответил на вопрос.

Один из способов исправить это - поменять местами последние две строки:

players?[currentplayerIndex].score += 1
updateUi()
loadnextQuestion()

Обратите внимание, что это тот же порядок, что и в ветке else, которую вы написали правильно.

Это заставляет метку всегда отображать счет последний игрок, что может быть нежелательно. Предполагая, что там не 100 игроков или что-то сумасшедшее, я думаю, что будет гораздо лучше UX, если вы отобразите все результаты игрока:

func updateUi() {
    if let scores = players?.map({ "\($0.score)" }) {
        playerPoints.text = "Points: \(scores.joined(separator: ", "))"
    }
}
...