При разработке игр, чаще, чем традиционное «бэкэнд» кодирование Python, мы находим необходимость в этом паттерне: от функции intern до «перехода» к внешней функции.
Так что в играх это будетраспространенным явлением является то, что из функции, вызываемой из основного цикла, вы захотите выйти из основного цикла и перейти к месту, где код устанавливает следующую стадию игры, или к тому, где отображается экран завершения игры и предлагается начать новую игру.,
В Python есть вызов "sys.exit", который полностью останавливает программу, поэтому, хотя вы можете вызывать ее из кода, проверяющего условия конца игры, который полностью выйдет из вашей исходной программы, ине дает пользователю возможность начать новый матч.(и если ваша игра использует графический интерфейс, а не консольную игру «печать и ввод», и без того плохой опыт становится катастрофическим, поскольку сама игра внезапно закрывается без следов).
Итак, покаэто может быть выполнено с помощью «переменной состояния», которая может быть установлена этими функциями, и управляется основной цепью (в вашем случае, оператором while
в функции mainGame
), этот дизайн утомителен и подвержен ошибкам -это будет что-то вроде:
def mainGame(...):
...
game_over = False
while not game_over:
if search_area not in search_area_options:
game_over = True
...
if search_area == "4":
game_over = True
Итак, обратите внимание, что с этим дизайном, если что-то изменит флаг game_over на True, независимо от того, где на следующей итерации условие while будетне удастся, и программа естественным образом завершит выполнение вашей mainGame
функции - и если нет внешней функции, обрабатывающей «play again?»экран, программа заканчивается.
Все в порядке, и, возможно, это правильная вещь для такой простой игры, как эта.
Но в более сложных проектах ваши параметры в главном цикле моиусложняются - вы можете вызывать функции, которые могли бы самостоятельно реализовывать мини-игры, или сами проверки могли бы быть не тривиальными - и, прежде всего, для выхода из этой основной функции могло бы быть нечто большее, чем условие «игра окончена»,Например, условие «выигрыша», которое приведет игру к следующему этапу.
В этих случаях вместо учета состояния игры в переменных вы можете использовать механизм исключений Python.Исключения - это конструкция на языке, которая естественным образом возникает при ошибке программы, которая позволяет программе либо останавливаться, либо продолжать работать в функции «над» местом, где произошло исключение - если программист просто включил правильную «попытку»-except ", чтобы поймать исключение.
Таким образом, может иметь место сложная игра, которая может произвольно обрабатывать игры, и, тем не менее, путем создания исключений с хорошими именами и надлежащего размещения предложений try-exc, легко всегда знать, где будет выполнятьсяпривести к - скелет для более сложной игры, использующей эту стратегию, может быть чем-то вроде:
# start
class BaseGameException(BaseException): pass
class ProgramExit(BaseGameException): pass
class GameOver(BaseGameException): pass
class MiniGameOver(BaseGameException): pass
class NextStage(BaseGameException): pass
def minigame():
while True:
# code for game-within-game mini game
...
if some_condition_for_winning_main_game_stage:
raise NextStage
...
def main_game(stage):
# get data, scenarios, and variables as appropriate for the current stage
while True:
...
if some_condition_for_minigame:
minigame()
...
if condition_for_death:
raise GameOver
...
def query_play_again():
# print and get messag reponse on whether to play again
...
if player_decided_to_quit:
# This takes execution to outsude the "main_game_menu" function;
raise ProgramExit
def main_game_menu():
"""Handle game start/play again/leatherboard screens"""
stage = 1
while True:
# print welcome message, and prompt for game start
try:
main_game(stage)
except NextStage:
# print congratulations message, and prepare for next stage
stage += 1
except GameOver:
# player died - print proper messages, leatherboard
query_play_again()
stage = 1
# if the program returns here, just let the "while" restart the game
if __name__ == "__main__":
try:
main_game_menu()
except ProgramExit:
print("Goodbye!")