Python 玩家死后退出游戏

Python 玩家死后退出游戏,python,python-3.x,macos,adventure,Python,Python 3.x,Macos,Adventure,所以,我正在开发一个基于python文本的游戏,可以与朋友们分享。我已经完成了游戏的大部分工作,但是当用户选择某些命令时,我正在为游戏的一部分而挣扎。我没有为此使用pygame,因为我找不到64位版本。下面是我正在看的。我应该在gameOver函数中添加什么才能真正退出游戏,或者如果玩家需要,请重试 import time import random import sys def searchAreas(): print("1. Area1") print("2. Area2"

所以,我正在开发一个基于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

要退出脚本,可以使用

import sys
sys.exit()

至于badResponse错误:您试图在bad response函数中使用变量search_区域,但该变量在另一个函数中定义,这意味着它无法访问该变量。您必须将search\u area作为参数传递给badResponse,或者将search\u area作为在顶部定义的全局变量传递给任何函数。

要退出脚本,可以使用

import sys
sys.exit()

至于badResponse错误:您试图在bad response函数中使用变量search_区域,但该变量在另一个函数中定义,这意味着它无法访问该变量。您必须将search\u area作为参数传递给badResponse,或者将search\u area作为在顶部定义的全局变量,在任何函数之外。

在您的函数search\u area中不存在

def badResponse():
    print("Sorry, I don't understand " + search_area)
您需要将搜索区域传递到函数中:

def badResponse(search_area):
    print("Sorry, I don't understand " + search_area)
要调用函数时,请使用:

badResponce(search_area)

在您的函数中,搜索区域不存在

def badResponse():
    print("Sorry, I don't understand " + search_area)
您需要将搜索区域传递到函数中:

def badResponse(search_area):
    print("Sorry, I don't understand " + search_area)
要调用函数时,请使用:

badResponce(search_area)

在设计游戏时,通常比传统的后端Python编码更需要这种模式:从内部函数跳到外部函数

因此,在游戏中,很常见的情况是,从主循环调用的函数中,您希望退出主循环,进入代码设置下一个游戏阶段的位置,或者在屏幕上显示游戏并提供开始新游戏的位置

Python有一个sys.exit调用,它可以完全停止程序,因此,虽然您可以在游戏结束时通过代码检查调用它,但它会完全退出您的程序,而不会让用户选择开始新的匹配。如果你的游戏是在图形用户界面上,而不是在控制台打印和输入游戏上,那么已经糟糕的体验就会变成灾难性的,因为游戏本身会突然关闭,没有任何痕迹

因此,虽然这可以通过状态变量进行管理,状态变量可以由这些函数设置,并且可以由mainloop(在您的例子中是mainGame函数中的while语句)进行管理,但这种设计非常繁琐且容易出错——它可能类似于:

def主游戏…: ... 游戏结束=错误 虽然游戏尚未结束: 如果搜索区域不在搜索区域选项中: 游戏结束=正确 ... 如果搜索面积=4: 游戏结束=正确 因此,请注意,在这种设计中,如果有什么东西将game_over标志更改为True, 无论在哪里,在下一次迭代中,while条件都将失败,并且 程序将自然结束主游戏功能的执行-并且 如果没有外部功能再次处理播放?屏幕上,程序结束

这很好,对于这样一个简单的游戏来说,也许是正确的做法

但是在更复杂的设计中,你在主循环my中的选择会变得更复杂-你可以调用可以自己实现小游戏的函数,或者自己的检查可能并不简单-而且,最重要的是, 退出此主要功能可能不止一个游戏结束条件,例如,一个获胜条件将引导游戏进入下一阶段

在这些情况下,您可能希望使用Python的异常机制,而不是将游戏状态记录在变量中。 异常是语言中的一种构造,在程序出错时会自然发生,它使程序能够在异常发生位置上方的函数中停止或继续运行,前提是程序员仅包含正确的try-except子句来捕获异常

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

开始 类BaseGameException BaseException:通过 类程序ExitBaseGameException:通过 类GameOverBaseGameException:传递 类MiniGameOverBaseGameException:通过 类NextStageBaseGameException:传递 def小游戏: 尽管如此: 游戏迷你游戏中的游戏代码 ... 如果某个条件决定了获胜的主要阶段: 提升下一阶段 ... def主游戏阶段: 以适当的方式获取数据、场景和变量 为现阶段辩护 尽管如此: ... 如果某个条件适用于小型游戏: 小型游戏 ... 如果条件为死亡: 筹款 ... def查询\u再次播放\u: 打印并获得messag关于是否再次播放的回复 ... 如果玩家决定退出: 这需要执行超出主要的游戏菜单功能; 升起程序退出 def主游戏菜单: 处理游戏开始/再次玩/皮革板屏幕 阶段=1 尽管如此: 打印欢迎信息,并提示游戏开始 尝试: 主配子阶段 除下一阶段外: 打印祝贺消息,并为下一阶段做好准备 阶段+=1 除GameOver外: 玩家死亡-打印正确的消息,皮革板 查询\u再次播放\u 阶段=1 如果程序返回这里,就让程序重新启动游戏 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 尝试: 主游戏菜单 除程序退出外: 再见!
在设计游戏时,通常比传统的后端Python编码更需要这种模式:从内部函数跳到外部函数

因此,在游戏中,很常见的情况是,从主循环调用的函数中,您希望退出主循环,进入代码设置下一个游戏阶段的位置,或者在屏幕上显示游戏并提供开始新游戏的位置

Python有一个sys.exit调用,它可以完全停止程序,因此,虽然您可以在游戏结束时通过代码检查调用它,但它会完全退出您的程序,而不会让用户选择开始新的匹配。如果你的游戏是在图形用户界面上,而不是在控制台打印和输入游戏上,那么已经糟糕的体验就会变成灾难性的,因为游戏本身会突然关闭,没有任何痕迹

因此,虽然这可以通过状态变量进行管理,状态变量可以由这些函数设置,并且可以由mainloop(在您的例子中是mainGame函数中的while语句)进行管理,但这种设计非常繁琐且容易出错——它可能类似于:

def主游戏…: ... 游戏结束=错误 虽然游戏尚未结束: 如果搜索区域不在搜索区域选项中: 游戏结束=正确 ... 如果搜索面积=4: 游戏结束=正确 因此,请注意,在这种设计中,如果有什么东西将game_over标志更改为True, 无论在哪里,在下一次迭代中,while条件都将失败,并且 程序将自然结束主游戏功能的执行-并且 如果没有外部功能再次处理播放?屏幕上,程序结束

这很好,对于这样一个简单的游戏来说,也许是正确的做法

但是在更复杂的设计中,你在主循环my中的选择会变得更复杂-你可以调用可以自己实现小游戏的函数,或者自己的检查可能并不简单-而且,最重要的是, 退出此主要功能可能不止一个游戏结束条件,例如,一个获胜条件将引导游戏进入下一阶段

在这些情况下,您可能希望使用Python的异常机制,而不是将游戏状态记录在变量中。 异常是语言中的一种构造,在程序出错时会自然发生,它使程序能够在异常发生位置上方的函数中停止或继续运行,前提是程序员仅包含正确的try-except子句来捕获异常

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

开始 类BaseGameException BaseException:通过 类程序ExitBaseGameException:通过 类GameOverBaseGameException:传递 类MiniGameOverBaseGameException:通过 类NextStageBaseGameException:传递 def小游戏: 尽管如此: 游戏迷你游戏中的游戏代码 ... 如果某个条件决定了获胜的主要阶段: 提升下一阶段 ... def主游戏阶段: 获取适用于当前阶段的数据、场景和变量 尽管如此: ... 如果某个条件适用于小型游戏: 小型游戏 ... 如果条件为死亡: 筹款 ... def查询\u再次播放\u: 打印并获得messag关于是否再次播放的回复 ... 如果玩家决定退出: 这需要执行超出主要的游戏菜单功能; 升起程序退出 def主游戏菜单: 处理游戏开始/再次玩/皮革板屏幕 阶段=1 尽管如此: 打印欢迎信息,并提示游戏开始 尝试: 主配子阶段 除下一阶段外: 打印祝贺消息,并为下一阶段做好准备 阶段+=1 除GameOver外: 玩家死亡-打印正确的消息,皮革板 查询\u再次播放\u 阶段=1 如果程序返回这里,就让程序重新启动游戏 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 尝试: 主游戏菜单 除程序退出外: 再见!
为什么不直接离开?为什么不直接离开?