Проблема с расчетом выигрыша, когда компьютер выигрывает в моем приложении «Крестики-нолики»IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Гость
 Проблема с расчетом выигрыша, когда компьютер выигрывает в моем приложении «Крестики-нолики»

Сообщение Гость »


В настоящее время я разрабатываю приложение на основе Swift для игры в крестики-нолики, и столкнулся с проблемой правильного расчета выигрышей при игре против компьютера.

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

Я внимательно просмотрел свой код и не нашел явных ошибок. Я подозреваю, что проблема может заключаться в моей функции checkForWinner() или в том, как я обрабатываю расчет выигрыша при игре против компьютера.

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

Вот мой код:

импортировать UIKit класс GameViewController: UIViewController { // Все мои торговые точки @IBOutlet слабая переменная TurnSign: UILabel! @IBOutlet кнопки var: [UIButton]! var currentPlayer: Int = 1 // Чтобы отслеживать игрока вар playerOneName: String? // Чтобы сохранить имя игрока в переменной вар playerTwoName: String? // Чтобы сохранить имя второго игрока в переменной вар победитель: Строка? var boardArray = ["", "", "", "", "", "", "", "", ""] // Массив пустых строк вар countPlayer1 = 0 вар countPlayer2 = 0 пусть playAgainstComputer = GameSettings.shared.playAgainstComputer переопределить функцию viewDidLoad() { супер.viewDidLoad() boardArray = ["", "", "", "", "", "", "", "", ""] // Если настал ход игрока 1 -> обновляем текст labelSign если (текущийPlayer == 1) { TurnSign.text = имя_игрока } еще { TurnSign.text = playerTwoName } print("Начальный currentPlayer: \(currentPlayer)") } // Функция переключения хода между игроком 1 и 2 функция переключателяPlayers() { если текущийPlayer == 1 { текущийPlayer = 2 } еще { текущийплеер = 1 } } /** В этой функции я хочу установить заголовок на кнопке, а затем переключать ее при нажатии кнопки. Все кнопки прикреплены к этой функции, поэтому «let index» будет включать одинаковые термины для всех моих кнопок. **/ @IBAction func buttonTapped (_ отправитель: UIButton) { пусть индекс = sender.tag если boardArray[индекс] == "" { если текущийPlayer == 1 { print("Перед обновлением currentPlayer: \(currentPlayer)") boardArray[индекс] = "X" sender.setTitle("X", для: .normal) } еще { boardArray[индекс] = "О" sender.setTitle("O", для: .normal) } sender.setTitle(boardArray[index], for: .normal) переключательИгроки() если текущийPlayer == 1 { print("Перед обновлением currentPlayer: \(currentPlayer)") TurnSign.text = имя_игрока } еще { TurnSign.text = playerTwoName } если letwinnerMessage = checkForWinner() { self.winner = сообщение победителя myAlertMessage (winnerMessage: winMessage) } } else if !boardArray.contains("") { myAlertMessage(winnerMessage: «Ничья!») } if GameSettings.shared.playAgainstComputer && currentPlayer == 2 { print("Перед обновлением currentPlayer: \(currentPlayer)") играть противNPC() } } // Функция для проверки победителя func checkForWinner() -> Строка? { пусть winPatterns: [[Int]] = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6] ] если GameSettings.shared.playAgainstComputer && текущийPlayer == 2 { если !boardArray.contains("") { return "Ничья!" } вернуть ноль } для шаблона в winPatterns { пусть позиции = шаблон.карта {boardArray[$0]} ifpositions == ["X", "X", "X"] { если GameSettings.shared.playAgainstComputer { если текущийPlayer == 1 { print("Перед обновлением currentPlayer: \(currentPlayer)") количество игроков1 += 1 } return "Поздравляю \(playerOneName ?? "X"), вы выиграли!" } еще { print("Перед обновлением currentPlayer: \(currentPlayer)") количество игроков1 += 1 return "Поздравляю \(playerOneName ?? "X"), вы выиграли!" } } else ifpositions == ["O", "O", "O"] { если GameSettings.shared.playAgainstComputer { если текущийPlayer == 2 { print("Перед обновлением currentPlayer: \(currentPlayer)") countPlayer2 += 1 } return "Поздравляю \(playerTwoName ?? "O"), вы выиграли!" } еще { countPlayer2 += 1 return "Поздравляю \(playerTwoName ?? "O"), вы выиграли!" } } } если boardArray.contains("") { вернуть ноль } еще { return "О, какой красивый галстук!" } } // Это мое предупреждающее сообщение после каждой победы/ничьи func myAlertMessage (winnerMessage: String) { let CrossesText = "Кресты: \(countPlayer1)" let noughtsText = "Ноли: \(countPlayer2)" let messageText = "Хочешь сыграть еще раз?\n\n\(crossesText)\n\(noughtsText)" let myAlertController = UIAlertController (title: winMessage, message: messageText,eferredStyle: .alert) let yesAction = UIAlertAction(title: "Да", стиль: .default) {_ in self.resetGame() } let noAction = UIAlertAction(title: «Нет», стиль: .cancel) {_ в self.dismissGame() } myAlertController.addAction(даДействие) myAlertController.addAction(noAction) присутствует (myAlertController, анимированный: true, завершение: ноль) } // Эта функция сбрасывает игру и готовит к новой игре функция сброса игры() { boardArray = ["", "", "", "", "", "", "", "", ""] для кнопки в кнопках { button.setTitle("", для: .normal) button.isEnabled = правда } текущийплеер = 1 TurnSign.text = имя_игрока } // Эта функция позволяет мне закрыть игру в GameViewController и вернуться в SecondViwController функция увольнения () { отклонить (анимация: правда, завершение: ноль) } /* Эта функция позволяет компьютеру сделать ход Он ищет пустые места в игре и заставляет двигаться случайным образом. */ функция makeComputerMove() { вар пустойSpots = [Int]() for (индекс, значение) в boardArray.enumerated() { если значение.isEmpty { пустойSpots.append(индекс) } } если пусть randomIndex = пустойSpots.randomElement(){ let buttonToPress = кнопки[randomIndex] buttonTapped (buttonToPress) } } /* Эта функция контролирует, происходит ли игра между пользователем и компьютером. Если это правда, это позволяет компьютеру сделать ход. */ функция playAgainstNPC() { если GameSettings.shared.playAgainstComputer == true && текущийPlayer == 2 { makeComputerMove() } } } импортный фонд класс GameSettings { статический пусть общий = GameSettings() вар playAgainstComputer = ложь } импортировать UIKit класс SecondViewController: UIViewController { let TO_GAME_SCREEN = "toGameScreen" var playAgainstComputer = GameSettings.shared.playAgainstComputer @IBOutlet слабая переменная txtPlayerOne: UITextField! @IBOutlet слабая вар txtPlayerTwo: UITextField! @IBOutlet слабая вар btnNavigate: UIButton! @IBOutlet слабая вар btnPlayNPC: UIButton! переопределить функцию viewDidLoad() { супер.viewDidLoad() } @IBAction func btnNavigate (_ отправитель: UIButton) { GameSettings.shared.playAgainstComputer = false PerformSegue (withIdentifier: TO_GAME_SCREEN, отправитель: self) } переопределить функцию подготовки (для перехода: UIStoryboardSegue, отправитель: Любой?) { если segue.identifier == TO_GAME_SCREEN { если let targetVC = segue.destination как? GameViewController { Guard let txtPlayerOne = txtPlayerOne.text еще {возврат} Guard let txtPlayerTwo = txtPlayerTwo.text еще {возврат} DestinationVC.playerOneName = txtPlayerOne.isEmpty? «X»: txtPlayerOne DestinationVC.playerTwoName = txtPlayerTwo.isEmpty? «О»: txtPlayerTwo } } } @IBAction func btnPlayNPC (_ отправитель: UIButton) { GameSettings.shared.playAgainstComputer = true txtPlayerOne.text = "Игрок" txtPlayerTwo.text = "Компьютер" PerformSegue (withIdentifier: TO_GAME_SCREEN, отправитель: self) } } Когда я играю против компьютера, он выдает:

Первоначальный currentPlayer: 1 в моем выводе.

После того, как я сделаю свой первый ход в игре, я получу следующие результаты:

До текущего обновления Player: 1
До текущего обновления плеера: 2
До текущего обновления Player: 1
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проблема с расчетом выигрыша, когда компьютер выигрывает в моем приложении Swift «TicTacToe»
    Гость » » в форуме IOS
    0 Ответы
    82 Просмотры
    Последнее сообщение Гость
  • Проблема с расчетом выигрыша, когда компьютер выигрывает в моем приложении Swift «TicTacToe»
    Гость » » в форуме IOS
    0 Ответы
    52 Просмотры
    Последнее сообщение Гость
  • Проблема с отображением «X» при первом клике в игре «Крестики-нолики»
    Anonymous » » в форуме CSS
    0 Ответы
    57 Просмотры
    Последнее сообщение Anonymous
  • Я пытаюсь написать игру «Крестики-нолики», но столкнулся с такой проблемой.
    Гость » » в форуме Python
    0 Ответы
    57 Просмотры
    Последнее сообщение Гость
  • Крестики-нолики с использованием opencv и keras
    Anonymous » » в форуме Python
    0 Ответы
    61 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»