玩家死亡时退出游戏

时间:2019-09-27 14:21:42

标签: python python-3.x macos adventure

因此,我正在研究一款可以与朋友共享的基于Python文本的游戏。我已经完成了大多数游戏的工作,但是当用户选择某些命令时,我会在游戏中挣扎。我没有为此使用pygame,因为我找不到64位版本。以下是我正在查看的内容。我应该在gameOver函数中放入什么内容才能真正退出游戏,或者如果玩家愿意,请重试?

__repr__

在键入四个选项以外的任何内容时,或者在进入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()

3 个答案:

答案 0 :(得分:1)

要退出脚本,可以使用

import sys
sys.exit()

对于您的badResponse错误:您试图在不良响应函数中使用变量search_area,但是该变量在另一个函数中定义,这意味着它无法访问它。您要么必须将search_area作为参数传递给badResponse,要么使search_area成为全局变量(定义在顶部,在任何函数之外)。

答案 1 :(得分:1)

在您的函数中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)

答案 2 :(得分:1)

在设计游戏时,与传统的“后端” Python编码相比,我们发现需要这种模式:从内部函数到“跳转”再到外部函数。

因此,在游戏中,通常会发生以下情况:从您的mainloop调用的函数中,您需要退出mainloop并转至代码设置下一游戏阶段的位置,即显示游戏结束的位置屏幕,并开始新游戏。

Python具有“ sys.exit”调用,该调用将完全停止程序,因此,尽管您可以从代码中检查是否有游戏结束条件来调用它,但这将完全退出您的程序,而不会给出用户可以选择开始新比赛。 (并且,如果您的游戏是在图形用户界面上而不是在控制台上的“打印和输入”游戏上,那么本来就很糟糕的体验会变成灾难性的,因为游戏本身会突然关闭而没有任何痕迹。)

因此,尽管可以使用可由这些功能设置的“状态变量”进行管理,并由mainloop进行管理(在您的情况下,是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函数的执行- 是否没有外部功能处理“再次播放”?屏幕上,程序结束。

没关系,也许对于像这样的简单游戏正确的做法。

但是在更复杂的设计中,您在主循环中的选择会变得更加复杂-您可以调用可以自行实现迷你游戏的功能,否则检查可能就不那么容易了-最重要的是, 退出此主要功能可能不止一个“游戏结束”条件,例如,将导致游戏进入下一阶段的“获胜”条件。

在这种情况下,您可能不想使用Python的Exception机制来将游戏状态记录在变量中。 异常是一种在程序错误时自然发生的语言构造,它使程序可以停止或继续在发生异常的地方“上方”的函数中运行-如果程序员仅包括正确的“ try” -except”子句以捕获异常。

因此,可以进行复杂的游戏,可以处理任意完成的游戏,并且仍然可以通过创建命名良好的异常并适当地放置try-except子句,很容易始终知道执行将导致- 使用此策略的更复杂游戏的框架可能是这样的:

# 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!")