繁体   English   中英

Python Wont返回上一个循环(Zork)

[英]Python Wont go back to a previous loop (Zork)

我一直试图修复的代码是用python编写的zork程序,但是,当我尝试循环回到另一个代码时,它会退出而没有错误,进入默认的空闲状态。 请尝试我的代码,我确实需要此问题的帮助。 运行这些命令时会发生这种情况。 往北走往北打开窗户进入窗户往东移动地毯往上走。

无效的代码在地下入口部分。

 #This sets the commands to be used
inv_command = ["inv", "inventory", "i"]
west = ["west", "w", "go west", "walk west"]
east = ["east", "e", "go east", "walk east"]
north = ["north", "n", "go north", "walk north"]
south = ["south", "s", "go south", "walk south"]
northeast = ["northeast", "ne", "go northeast", "walk northeast"]
northwest = ["northwest", "nw", "go northwest", "walk northwest"]
southeast = ["southeast", "se", "go southeast", "walk southeast"]
southwest = ["southwest", "sw", "go southwest", "walk southwest"]
up = ["up", "u", "go up", "go up stairs", "go up ladder", "up stairs", "up ladder"]
down = ["down", "d", "go down", "go down stairs", "go down ladder", "down stairs", "down ladder"]
take = ["take", "t"]

#This sets the objects
mailbox = 1
house_window = 0
house_bag = 0
knife = 0
lamp = 0
carpet = 0
rug = 0
light = 0
#This sets the inventory
class Item(object):
    def __init__(self, name, attack, armour):
        self.name = name
        self.attack = attack
        self.armour = armour

class Inventory(object):    
    def __init__(self):
        self.items = {}

    def add_item(self, item):
        self.items[item.name] = item

    def contain_item(self, item):
        self.items["Leaflet"] = item

    def print_items(self):
        print('\t'.join(['Name', 'Atk', 'Arm']))
        for item in self.items.values():
            print('\t'.join([str(x) for x in [item.name, item.attack, item.armour]]))
inventory = Inventory()

#This is the spawn area
import string
loop = 1
while loop == 1:
    inp = input("You wake up in a field surrounded by trees. The only pathway is going north \n>")
    if inp in north:
        loop = 2
    elif inp in inv_command:
        inventory.print_items()
    else:
        print("<You can't do that>")

    #This is the front of the house
    while loop == 2:
        inp = input("You face the front of a house. The windows are boarded up and the door is closed. In front there is a mailbox, and pathways leading west and further north\n>")
        if inp in south:
            loop = 1
        elif inp in inv_command:
            inventory.print_items()
        elif inp in north:
            loop = 3
        elif inp in west:
            loop = 4  
        elif inp in "open door":
            print("<The door is locked>")
        elif inp in "open window":
            print("<The windows can't be opened. They seem to be nailed shut>")
        elif inp in "read leaflet":
            if inventory.contain_item:
                print("<Welcome to the text based adventure!>")
                print("<When typing commands, please don't use capital letters.>")
                print("<have fun!>")
            else:
                print("<You don't have a leaflet>")
        elif inp in "open mailbox":
            if mailbox == 1:
                print("<The mailbox contains a leaflet>")
            else:
                print("<The mailbox is empty>")
        elif inp in "take leaflet":
            if mailbox == 1:
                inventory.add_item(Item('Leaflet', 0, 0))
                mailbox = 0
                print("<You have taken the leaflet>")
            else:
                print("<There's no leaflet in the mailbox>")   
        else:
            print("<You can't do that>")

        #This is the back of the house
        while loop == 3:
            inp = input("You face the back of the house, which has nothing except one ajar window. There is another pathway heading east \n>")
            if inp in inv_command:
                inventory.print_items()
            if inp in south:
                loop = 2
            if inp in "open window":
                house_window = 1
                print("<You opened the window enough for you to enter through>")
            if inp in "enter window":
                if house_window == 1:
                    loop = 5
                else:
                    print("<The window isn't opened enough to fit through>")
            else:
                print("<You can't do that>")

            #This is the kitchen
            while loop == 5:
                inp = input("You are inside the kitchen of the house. On the table there is a bag, there is a staircase leading up stairs and to the east there is a living room \n>")
                if inp in inv_command:
                    inventory.print_items()
                elif inp in "read manual":
                    if inventory.contain_item:
                        print("<Commands - inventory, take, open, attack>")
                        print("<Moving commands - go north, go south, go northeast, go northwest, go southeast, go southwest, up, down.>")
                        print("<Good luck!>")
                elif inp in up:
                    loop = 9
                elif inp in east:
                    loop = 8
                elif inp in "exit window":
                    loop = 3
                elif inp == "open bag":
                    print("<The bag contains a manual>")
                elif inp == "take bag":
                    print("<You would much rather take what's inside the bag then the bag itself>")
                elif inp == "take manual":
                    if house_bag == 0:
                        print("<You took the manual>")
                        house_bag = 1
                        inventory.add_item(Item('manual', 0, 0))
                    else:
                        print("<You have already taken the manual>")
                else:
                    print("<You can't do that>")
                #This is the living room
                while loop == 8:
                    if rug == 0:
                        inp = input("You are in the living room and you see a rug on the floor.\n>" )
                    if rug == 1:
                        inp = input("You are in the living room and you can see a trap door.\n>")
                    if inp == "move rug":
                        rug = 1
                        print("<You have found a trap door to the basement>")
                    if inp in down:
                        loop = 11
                    if inp in inv_command:
                         inventory.print_items()
                else:
                    print("<You can't do that>")

                #This is the Attic of the house
                while loop == 9:
                    if knife == 0:
                        if lamp == 0:
                            inp = input("You are in the attic, you can see a lamp and a knife. You see blood stains and stairs downwards \n>")
                        else:
                            inp = input("You are in the attic, you can see a knife. You see blood stains and stairs downwards \n>")
                    elif knife == 1:
                        if lamp == 0:
                            inp = input("You are in the attic, you can see a lamp. You see blood stains and stairs downwards \n>")
                        else:
                            inp = input("You are in the attic. You see blood stains and stairs downwards \n>")
                    if inp in inv_command:
                        inventory.print_items()
                    elif inp in down:
                        loop = 5

                    elif inp in "take knife":
                        if knife == 0:
                            print("You pulled the knife out from the wall and put it in your pocket")
                            print("<You have obtain a knife>")
                            knife = 1
                            inventory.add_item(Item('knife', 3, 0))
                        else:
                            print("<You have already taken the knife>")
                    elif inp in "take lamp":
                        if lamp == 0:
                            print("<You have taken the lamp>")
                            lamp = 1
                            inventory.add_item(Item('lamp', 0,0))
                        else:
                            print("<You have already taken the lamp>")
                    else:
                        print("<You can't do that>")
                #This is the underground entrance
                while loop == 11:
                    if lamp == 1:
                        if light == 0:
                            inp = input("It is dark, you can't see anything.\n>")
                            if inp in up:
                                loop = 8
                            if inp in inv_command:
                                inventory.print_items()
                            if inp == "turn on lamp" or "turn lamp on":
                                print("<You turned on the lamp>")
                                light = 1
                        if light == 1:
                            inp = input("You are below the living room, where you can see a entrance to a underground tunnel north of you.\n>")
                            if inp in up:
                                loop = 8
                            if inp in inv_command:
                                inventory.print_items()
                            if inp in north:
                                loop = 12
                    if lamp == 0:
                        inp = input("It is dark, you can't see anything you need to find a lamp.\n>")
                        if inp in up:
                            loop = 8
                        if inp in inv_command:
                            inventory.print_items()
                    else:
                        print("<You can't do that>")



        #This is the west forest entrance
        while loop == 4:
            inp = input("You are now in a dense forest. There is a fork in the road going NorthWest and SouthWest \n>")
            if inp in inv_command:
                inventory.print_items()
            elif inp in east:
                loop = 2
            elif inp in northwest:
                loop = 6
            elif inp in southwest:
                loop = 7
            else:
                print("<You can't do that>")

您遇到的问题是,当客厅中有向下命令时,用于跟踪位置的loop变量被设置为不受支持的值(10)。

#This is the living room
while loop == 8:
    if rug == 0:
        inp = input("You are in the living room and you see a rug on the floor.\n>" )
    if rug == 1:
        inp = input("You are in the living room and you can see a trap door.\n>")
    if inp in down:
        loop = 10

浏览您的代码很困难,但是我们可以while loop ==搜索字符串while loop ==以查看要处理的房间:

Line 50: while loop == 1:
Line 60:     while loop == 2:
Line 97:         while loop == 3:
Line 115:             while loop == 5:
Line 144:                 while loop == 8:
Line 162:                 while loop == 9:
Line 196:                 while loop == 11:
Line 227:         while loop == 4:

因此,如果loop等于10,则所有while语句都不为真,因此代码将完成运行。 在此类情况下,您可能希望在程序的末尾添加一行以打印游戏状态。

查看从196号线开始的代码,这是地下入口的正确位置,因此,如果将196号线更改为while loop == 10:那应该可以解决当前的问题。

但是,从长远来看,如果您重组和重构代码,它将对您有帮助。 或者考虑使用更合适的平台,例如InformTADS

编辑:为解决上述问题而进行的更改之后,从地下室向北走仍然存在问题。 loop设置为12 ,但是没有定义空间。 要检查所有这些房间转换和事件,可以搜索loop =

Line 49: loop = 1
Line 50: while loop == 1:
Line 53:         loop = 2
Line 60:     while loop == 2:
Line 63:             loop = 1
Line 67:             loop = 3
Line 69:             loop = 4  
Line 97:         while loop == 3:
Line 102:                 loop = 2
Line 108:                     loop = 5
Line 115:             while loop == 5:
Line 125:                     loop = 9
Line 127:                     loop = 8
Line 129:                     loop = 3
Line 144:                 while loop == 8:
Line 153:                         loop = 11
Line 160:                 while loop == 9:
Line 174:                         loop = 5
Line 194:                 while loop == 11:
Line 199:                                 loop = 8
Line 208:                                 loop = 8
Line 212:                                 loop = 12
Line 216:                             loop = 8
Line 225:         while loop == 4:
Line 230:                 loop = 2
Line 232:                 loop = 6
Line 234:                 loop = 7

您在这里遇到的问题是,您试图将数据结构(位置连接在一起的方式)表示为程序结构(一堆while循环),但效果并不理想。

该程序中应该只存在一个循环,这是一个非常简单的循环-我将用伪代码表示它:

while the game is still running:
    get a command
    perform that command

游戏状态的属性-包括玩家所在的位置-应该存储为变量; 有关这些位置的信息应存储为对象。 (例如:考虑拥有一个Room对象,每个位置都有一个实例,以及诸如其描述和内容之类的标准属性。)这将使您以更明智,更不重复的方式来构造程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM