У вас довольно много проблем в этом коде, и большей части проблемы можно избежать, отказавшись от использования глобальных переменных.
Когда вы используете глобальные переменные, вы меняете глобальное состояние, которое затрудняет понять, что происходит. У вас есть функции, которые не возвращают ничего, кроме изменения состояния, которое приведет к завершению игры или нет.
Одно простое изменение будет заключаться в том, чтобы метод check_
возвращал фактическое логическое значение и использовал это значение в l oop чтобы проверить, набрали ли вы ie или выигрыш.
Если вы не набрали ie или выигрыш, это означает, что игра не закончена. Таким образом, вам не нужно хранить глобальное значение и, конечно, не нужно изменять состояние is at ie или выигрыш где-либо еще.
Сохраняйте ваши функции как можно проще. Я часто говорю это, но подумайте, как вы на самом деле играете в игру.
В игре у вас есть 2 игрока и 1 доска, на которой вы устанавливаете значения где угодно.
Каждый ход добавляет фишку, пока игра заканчивается на ie или выигрышем.
Каждый раз, когда вы добавляете фишку, вы можете проверить состояние игры. Если это не закончено, вы можете переключить текущего игрока, ввести новую фигуру и повторить.
Ничего из этого не требует глобального состояния, и вы всегда можете передать игровое поле своим методам ...
В вашем случае это было бы так же просто, как сделать это:
def is_tie():
return ' ' not in board
def is_win():
... is_win logic
return result
while not is_tie() or not is_win():
... game logic
To go на шаг дальше, вместо того, чтобы иметь глобальные переменные, вам нужно было бы передать состояние игры как следующее:
def is_tie(game):
return ' ' not in game.board
И на go следующий шаг, ввод новой фигуры на доске вернет новое состояние. Таким образом, вместо изменения текущего состояния у вас будет основной l oop, который выглядит следующим образом:
game = Game()
while True:
position = game.prompt_choice()
if not game.position_available(position)
# loop again to select a new position
continue
game = game.execute_turn(position)
if game.is_done()
break
else:
# if game not done switch player and move to next turn
game = game.switch_player()
# current game player is winner
game.print_winner()
Замечательно то, что если вы хотите «воспроизвести» игру, вы просто необходимо сохранить состояние игры непосредственно перед повторением цикла. каждая возвращаемая «игра» является модифицированной версией предыдущего игрового объекта, поэтому вы никогда не изменяете реальный объект.