被告知的函数被调用

时间:2014-11-17 19:22:44

标签: python function testing

擅长python,正在进行文本冒险,测试函数的使用。

def cell1():
    loop = 1
    while loop == 1:
        print("ONE")
        cave1 = input()
        if cave1 == ("end?"):
            print("\nthis should end program")
            loop = 0
            break
        elif cave1 == ("TWO"):
            global testvar
            testvar = 1
            option1()
        else:
            print("INVALID")

def option1():
    print("TWO")
    loop = 1
    while loop == 1:
        print("test1 definition")
        print (testvar)
        test1 = input()
        if test1 == ("ONE"):
            print("you pick up the cheese")
            loop = 0
            cell1()
        elif test1 == ("THREE"):
            option2()
        else:
            print("INVALID")

def option2():
    print("THREE")
    loop = 1
    while loop == 1:
        print("This is option 3")
        test2 = input()
        if test2 == ("ONE"):
            print("testering2")
            cell1()
        elif test2 == ("TWO"):
            global testvar
            testvar = 2014
            option1()
        else:
            print("INVALID")
run = True
while run == (True):
    print ("testing 123")
    cell1()
    print("restart about to activate")
    cont = input("Restart? ")

    if (cont) != "yes":
       break

这个程序应该允许你在选项之间(什么是房间)和最终在cell1中,程序应该是可以终止的。

如果程序运行并“结束?”键入作为第一个输入,程序进入底部的继续位,但是,如果你进入'房间'然后回到cell1,输入“结束?”将调用选项2。

我环顾四周,仍然困扰着我,我错了什么?

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:0)

"end?"仅在玩家位于第一个单元格内时退出的原因是因为您只在其中检查该输入。 option1()option2()中包含的执行不会影响cell1()的执行。您没有从选项功能中返回任何内容,也没有更改标记值。

所以,有两种基本方法可以解决这个问题。

首先,您可以从函数中返回一个值:

if option1() == "END":
    break

或者,你可以改变你的while循环:

# is_running is defined globally
while is_running:

然后只要用户输入is_running,就可以在任何方法中将False设置为"end?"。对于您现在正在使用的设计,这可能是最简单的方法。

我确定你可以说,一般来说,当你添加更多房间并且你的函数调用进一步嵌套时,你的程序会变得越来越复杂。

答案 1 :(得分:0)

问题是你在嵌套函数中越来越深入。例如,更改

if test1 == ("ONE"):
        print("you pick up the cheese")
        loop = 0
        cell1()

if test1 == ("ONE"):
        print("you pick up the cheese")
        loop = 0
        break

允许您运行程序,进入第二个房间,返回第一个房间,"end?"将正常运行。这不会完全解决您的问题,因为有一个类似的问题,当你从两到三时,如果你只是改变了

if test2 == ("ONE"):
        print("testering2")
        cell1()

if test2 == ("ONE"):
        print("testering2")
        break

它会破坏当前的功能并返回option1()(如果您运行程序,请转到第二个房间,然后转到第三个房间,然后再返回到第一个房间),"end?"不会这样做。做任何事。希望这能让你走上正轨。

答案 2 :(得分:0)

我很确定你遇到的问题是因为当你调用另一个函数时,你不会总是break在一个函数中循环TWO。例如,如果您的条目为ONEend?,然后是cell1,您仍然会发现自己仍处于cell1循环中。这是因为当option1的内部调用返回时,程序的控制流程会返回到调用该函数的位置,即loop,因为0现在是option1,循环结束,cell1返回外部调用state,循环仍在运行。

除非你想要你设计的游戏有一个树形结构,你可以用不同的语义回到你来自哪里而不是移动到其他地方,我建议使用不同的架构。而不是每个函数在适当时调用下一个函数,而是返回该函数。然后你编写一个调用该函数的顶级循环。这是一个示例,其中顶级循环调用的函数保存在名为def cell1(): print("In cell1!") while True: choice = input("pick 'ONE' or 'TWO' (or type 'quit' to exit):") if choice == "ONE": return option1 elif choice == "TWO": return option2 elif choice == "quit": return None else: print("I'm sorry, I didn't understand that.") def option1(): # these other two functions are very basic in my example print("In option1!") # but you can make them as complex as you want return option2 def option2(): print("in option2!") return cell1 def control_loop(initial_state=cell1): state = initial_state while state is not None: state = state() # the next state is the return value of the previous state 的变量中:

{{1}}