2014-11-17 5 views
-2

파이썬으로 새롭게 태어나서 텍스트 모험을하고 함수 사용을 테스트합니다.함수를 호출하지 않고 함수를 호출했습니다.

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에, 프로그램이 종료 할 수 있어야합니다 허용해야합니다.

프로그램이 실행 중이고 "종료?" 첫 번째 입력으로 입력 된 경우 프로그램은 하단의 계속 비트로 이동합니다. 그러나 'rooms'사이를 이동 한 다음 cell1로 돌아가서 'end?'를 입력하면

Ive는 주위를 둘러 보았고 아직도 나를 괴롭 히고 있습니다. 나는 잘못된 것입니까?

도움을 주시면 감사하겠습니다.

+0

힌트 : CELL1는 옵션 1을 호출하고, 옵션 1은 CELL1을 호출하고 CELL1 단부 옵션 1은 제 끝나면 cell1 호출은 계속 실행 중입니다. – Kevin

답변

0

다른 기능을 호출 할 때 한 기능의 루프가 항상 break이 아니기 때문에 문제가 있다는 것을 확신합니다. 예를 들어, 항목이 TWO, ONE이면 end? 인 경우 자신은 여전히 ​​cell1 루프에 있음을 알 수 있습니다. 그 이유는 cell1에 대한 내부 호출이 반환 될 때 프로그램의 제어 흐름이 option1이고 loop이 이제 0이 되었기 때문에 루프가 끝나고 option1cell1에 대한 외부 호출로 반환되기 때문에 프로그램의 제어 흐름은 option1이고, 루프가 계속 실행되고있는 곳.

당신이 다른 곳으로 이동하는 것보다 다른 의미로 왔던 곳으로 돌아갈 수있는 트리 구조를 갖기를 원하지 않는다면 다른 아키텍처를 사용하는 것이 좋습니다. 각각의 함수가 적절한 경우 다음 함수를 호출하는 대신 그 함수를 반환하십시오. 그런 다음 함수를 호출하는 단일 최상위 루프를 작성합니다. 여기서 함수 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 
+0

좋아요, 그래서 함수를 호출 한 후에 ive가 추가되었습니다. 이것은 한 번에 한 함수 만 실행한다는 의미입니까? 나는 실생활에서 움직임을 원합니다. 물리적으로 가능한 한 오래 움직일 수 있습니다. 단계를 되돌아 가야하는 나무가 아닙니다. 각 함수 호출만으로 충분할 수 있습니까? – Olliekiwi

+0

글쎄, 외부 함수가 더 빨리 루핑되기보다는 돌아 오게하기 때문에 대부분 잘 작동 할 것입니다. 그러나 당신은 여전히 ​​좋은 이유가없는 함수 호출 스택을 구축 할 것입니다. 내 답변에는 단일 레벨 아키텍처가 제안되지만, 아마도 다른 접근 방식도있을 수 있습니다. – Blckknght

0

이유는 "end?" 플레이어가 첫 번째 셀 내에있을 때만 종료되는 이유는 입력 내용 만 확인하기 때문입니다. option1()option2()에 포함 된 실행은 cell1()의 실행에 영향을 미치지 않습니다. 옵션 기능에서 아무것도 반환하지 않으며 감시 가치를 변경하지 않습니다.

그래서이 문제를 해결할 수있는 두 가지 기본적인 방법이 있습니다. 당신의 방법 중 하나에서 다음

# is_running is defined globally 
while is_running: 

그리고 단지 Falseis_running를 설정 : 당신은 당신의 while 루프를 변경할 수

if option1() == "END": 
    break 

을 또는 :

첫째, 당신은 당신의 함수에서 값을 반환 할 수 사용자가 "end?"을 입력 할 때마다 아마 당신이 지금 사용하고있는 디자인으로 가장 쉬운 방법 일 것입니다.

더 많은 방을 추가하고 함수 호출이 더 중첩 될 때 일반적으로 프로그램이 기하 급수적으로 더 복잡해질 것이라고 말할 수 있습니다.

+0

좋아요, 그래서 함수를 호출 한 후에 ive가 추가되면서 한 번에 한 함수 만 실행된다는 의미입니까? 나는 실생활에서 움직임을 원합니다. 물리적으로 가능한 한 오래 움직일 수 있습니다. 단계를 되돌아 가야하는 나무가 아닙니다. 각 함수 호출만으로 충분할 수 있습니까? - – Olliekiwi

0

중첩 된 함수에서 점점 더 깊어지고 있습니다. 예를 들어,

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

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

을 변경하면, 방 두 개를 입력하여 프로그램을 실행 방 하나에 돌아갈 수 있도록하고, "end?"가 제대로 작동합니다. 세 두에서 갈 때 당신은 단순히

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

는 현재 기능을 깰 것이며에

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

를 변경 한 경우 비슷한 문제가 있기 때문에하지만 이것은 완전히 문제가 해결되지 않습니다 option1()으로 돌아가십시오 (프로그램을 실행하는 경우 두 번째 룸으로 이동 한 다음 세 번째 룸으로 이동하고 다시 한 번 이동하십시오). "end?"은 아무 것도하지 않습니다. 바라기를 이것은 바른 길에 당신을 얻는다.

+0

그래, 내가 함수를 호출 한 다음에 깰 시간이 추가되었으므로 한 번에 한 함수 만 실행된다는 의미인가? 나는 실생활에서 움직임을 원합니다. 물리적으로 가능한 한 오래 움직일 수 있습니다. 단계를 되돌아 가야하는 나무가 아닙니다. 각 함수 호출만으로 충분할 수 있습니까? - – Olliekiwi

관련 문제