2012-09-12 5 views
0

저는 텍스트 기반 게임을 만들고 있으며 모든 텍스트 입력에서 끌어 올 수있는 응용 프로그램 전체 명령 줄이 필요합니다. 내 계획은 명령을 모듈 내에 포함시키고 command()를 실행하여 사용자가 명령을 입력 (또는 목록 가져 오기) 한 다음 (동일한 모듈에 포함) 실행할 수있게하는 것이 었습니다. 사용자가있는 곳으로 돌아갈 방법이 필요하기 때문에 작동하지 않았습니다. 명령 모드에 들어가기 전에 사용자가 있던 곳으로 돌아가는 방법이 있습니까? 아니면 더 좋은 방법이 있습니까? 다음 갔다함수를 실행 한 후 코드로 돌아 가기

import commands 

def something(): 
    print "a question" 

    action = raw_input("> ") 

    if action == "command": 
     commands.commands() 
    elif "something else" in action: 
     do something 
    else: 
     error.error(1) 
     something() 

commands.py하기 : 사용자가 중단 된

def commands(): 
    print "Enter a command, help for a list, blah blah blah." 

    command = raw_input("$ ") 

    if command == "bag": 
     bag() 
    elif command == "other": 
     other() 

def bag(): 
    print "Action listing things in bag" 

문제는 반환

내 생각이었다.

while game.is_running: 
    command = get_user_input() 
    user_do(command) 
    update_world() 

이 한 game.is_runningTrue 그대로의 while 루프 내에서 코드의 세 줄을 반복 할 것이다 : 당신이 필요로하는 무엇

+0

권자 모험 모듈을보고 ... 그리고 소스를 보면 ... 아마도 –

+0

미안 해요, 무엇을 당신의 말 아무 생각이 없습니다. 주의를 기울여야겠습니까? –

답변

2

는 메인 게임 루프입니다. 먼저 사용자 입력을 얻습니다. 다음으로, 당신은 그것에 행동합니다. 마지막으로, 몬스터를 움직이거나 산란시키는 것과 같이 게임에 필요한 다른 모든 업데이트를 수행합니다. 이 시점에서, 그것은 되돌아와 사용자에게 다른 명령을 요구합니다.

업데이트 : 속인 적이과 사용자 입력에 의존하고,이 예에서

# In commands.py: 
def bag(): 
    print 'bag' 

def other(): 
    print 'other' 

def unrecognized(): 
    print 'unknown command' 

# In main.py: 
import commands 

def user_input(): 
    print 'a question' 
    return raw_input('>') 

def user_do(command): 
    # get the matching command out of commands, or pass back 
    # the unrecognized function if it's not found 
    action = getattr(commands, command, commands.unrecognized) 
    action() 

is_running = True 
while is_running: 
    command = user_input() 
    if command == 'quit': 
     is_running = False 
    else: 
     user_do(command) 

호출되는 함수의 이름과 동일되는 명령 : 여기은 작업 예입니다. 에서 getattr 호출은 사용자가 입력 한 문자열을 command 모듈의 내용과 비교하여 같은 이름의 함수가 있으면 반환하거나 그렇지 않은 경우 대체 함수 unrecognized을 반환합니다. action은 이제 명령 함수 또는 unrecognized을 보유하게됩니다.

당신이 사용자를하지 않으려는 경우가 너무 밀접하게 실제 기능 자체에 바인딩 명령 대신 if/elif/else 문을 많이 가진 당신은 분기 구조로 dict을 사용할 수 있습니다 (또는 을 파견) :

# Modified main.py 
import commands 

COMMAND_DISPATCH = { 
    'bag': commands.bag, 
    'sack': commands.bag, 
    'other': commands.other, 
    # ... 
} 

# ... 

def user_do(command): 
    action = COMMAND_DISPATCH.get(command, commands.unrecognized) 
    action() 

이 예에서는 commands 모듈의 기능을 조회하지 않고 대신 COMMAND_DISPATCH에서 찾았습니다.

조언이 한 번 더 있습니다. 곧 사용자 입력을 하나의 명령 이상으로 파싱하는 것이 좋습니다. 이 예제에서는 "command ..."형식의 입력을 받아 들일 수 있기를 원한다고 가정 해 봅시다. 당신이 알아서하는 user_input 기능을 확장 할 수

def user_input(): 
    print 'a question' 
    user_input = raw_input('>').split(' ') 
    command = user_input[0] 
    arguments = user_input[1:] 
    return command, arguments 

당신이 'foo는 바 바즈'를 입력 그렇다면,이 튜플 ('foo', ['bar', 'baz'])을 반환합니다. 다음으로 인수를 다루기 위해 메인 루프를 업데이트합니다.텍스트 모험

def bag(arguments): 
    for argument in arguments: 
     print 'bagged ', argument 

:

def user_do(command, arguments): 
    action = COMMAND_DISPATCH.get(command, commands.unrecognized) 
    action(arguments) 

그리고 마지막으로, 우리가 수락하고 인수를 처리하는 명령을 수정

while is_running: 
    # use tuple unpacking to split into command, argument pairs 
    command, arguments = user_input() 
    if command == 'quit': 
     is_running = False 
    else: 
     user_do(command, arguments) 

그런 다음 우리는 명령에 전달할 확인 command object, command object preposition subject 및 심지어 command adjective object ...을 처리하는보다 실질적인 파서를 원할 것입니다.

+0

나는 너를 잘 모르겠다. 사용자가 질문에 대답 할 수있을 때 명령을 실행하는 옵션이 필요하며 제안을 구현하는 방법을 잘 모르겠습니다. –

+1

나는 무슨 뜻인지 실습 예제를 추가했습니다. 하지만 실제로 루핑 구문이 여기에서 혼란 스럽다면 일부 파이썬 자습서부터 시작하는 것이 좋습니다. –

+0

그것은 나를 혼란시키는 루핑 구조가 아니며, 사용자가 게임과 어떻게 상호 작용했는지입니다. 제 아이디어는 질문을 인쇄하고 사용자에게 입력을 요구 한 다음 키워드를 찾고 다른 모듈을 실행하는 것입니다.예제에서 프롬프트 및 사용자 입력이 어떻게 작동했는지 간략하게 설명하지 않으려 고하면 크게 감사하겠습니다. 이것은 실제로 파이썬 튜토리얼을위한 것이기 때문에 나는 그것에 익숙하지 않다. –

0

당신은 "파이썬 유한 상태 기계"를 연구해야한다. 그것은 당신이 원하는 것과 거의 같습니다.

  • Finite-state machine
  • wiki.python.org/moin/FiniteStateMachine
  • 상태 머신은 무엇입니까

    • Charming Python: Using state machines
    • ?

      상태 시스템에 대한 지나치게 정확한 설명은 방향 그래프이며 노드 집합과 이에 해당하는 전환 기능 세트 으로 구성됩니다. 기계는 일련의 이벤트에 응답하여 "실행 중"입니다. 각 이벤트는 "현재"노드에 속하는 전환 함수 의 도메인에 있습니다. 여기서 함수의 범위는 노드의 하위 집합 입니다. 이 함수는 "다음"(아마도 같은) 노드를 반환합니다. 이 중 적어도 하나는 종료 상태 여야합니다. 종료 상태에 도달하면 시스템이 중지됩니다.

      상태 머신 (state machine)를 사용하는

      ... 초기 상태에서

      1. 시작.
      2. 입력란을 읽습니다.
      3. 입력 및 현재 상태이든 새로운 상태로 천이하거나, 현재 상태에 대한 적절한 라인 처리에 따라. @MatthewTrevor는 그의 대답에 제시된 것과 유사

    , 당신은 메인 루프를 가지고 있고, 첫 번째 항목 지점 호출 (start 또는 intro 또는 무엇이든)에 "상태"컨텍스트를 통과 할 것입니다. 이 호출은 상태 컨텍스트를 다른 것을 가리 키도록 변경할 수 있습니다. 제어가 다시 주 루프로 돌아가고 상태를 확인하면 새로운 상태가 실행됩니다.

    관련 문제