Выход из игры окончен, когда игрок умирает - PullRequest
1 голос
/ 27 сентября 2019

Итак, я работаю над текстовой игрой на python, которой я могу поделиться со своими друзьями.У меня большая часть игры работает, но я борюсь с игрой за часть, когда пользователь выбирает определенные команды.Я не использую Pygame для этого, потому что я не могу найти 64-битную версию.Ниже то, на что я смотрю.Что я добавлю в функцию gameOver, чтобы фактически выйти из игры, или, если игрок захочет, попробовать еще раз?

import time
import random
import sys

def searchAreas():
    print("1. Area1")
    print("2. Area2")
    print("3. Area3")
    print("4. Just give up")

def badResponse():
    print("Sorry, I don't understand " + search_area)

def gameOver():
    print("You decide to give up because life is too hard.")
    print("Would you like to try again?")
    player_choice = input("> ")
    if player_choice == "Yes":
        mainGame()
    elif player_choice == "No":
        print("# what goes here to quit the game?")
    else:
        badResponse()

def mainGame():
    search_area_options = ["1","2","3"]
    search_area = ""
    while search_area not in search_area_options:
        print("Where do you want to start looking?")
        searchAreas()
        search_area = str(input("> "))
        if search_area == "1":
            print("Text here")
        elif search_area == "2":
            print("Text here")
        elif search_area == "3":
            print("text here")
        elif search_area == "4":
            gameOver()
        else:
            badResponse()

mainGame()

При наборе чего-либо кроме четырех опций или при переходе в функцию gameOver я вижу эту ошибку:

Traceback (most recent call last):
  File "./test.py", line 45, in <module>
    mainGame()
  File "./test.py", line 43, in mainGame
    badResponse()
  File "./test.py", line 14, in badResponse
    print("Sorry, I don't understand " + search_area)
NameError: name 'search_area' is not defined

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

В вашей функции search_area не существует.

def badResponse():
    print("Sorry, I don't understand " + search_area)

Вам необходимо передать search_area в вашу функцию:

def badResponse(search_area):
    print("Sorry, I don't understand " + search_area)

Когда вы хотите вызвать функцию, используйте:

badResponce(search_area)
1 голос
/ 27 сентября 2019

При разработке игр, чаще, чем традиционное «бэкэнд» кодирование 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!")

1 голос
/ 27 сентября 2019

Чтобы выйти из скрипта, вы можете использовать

import sys
sys.exit()

Что касается вашей ошибки badResponse: вы пытаетесь использовать переменную search_area в функции плохого ответа, но эта переменная определена в другой функции, котораяозначает, что у него нет доступа к нему.Вы должны либо передать search_area в качестве параметра badResponse, либо сделать search_area глобальной переменной (определенной сверху, вне какой-либо функции).

...