2012-06-01 5 views
1

Я пытаюсь сделать две вещи:Создание цикла на основе пользовательского ввода, затем сохранить результат для MUD в Python

  1. сделать петлю в питона, который обеспечивает пользователю подсказку с 4 возможных опции; ввод «1», «2», «3» или что-то еще. Если пользователь выбирает 1,2 или 3, они представлены текстом. Если пользователь вводит что-либо еще, они представлены текстом и подсказкой снова и снова. Это повторяется до тех пор, пока они не войдут в 1,2 или 3.

  2. Я хочу, чтобы затем использовать этот вход от пользователя для использования за пределами этого цикла и продолжить игру.

Мое решение до сих пор: Перед тем, как опубликовать свой код, который я опишу его, я в основном размещен весь код, я хочу в цикле внутри функции без аргументов. Затем я вызываю эту функцию в инструкции else.

Что делает код: Код зацикливается так, как я этого хочу, но я не знаю, как «вырваться» из цикла, чтобы продолжить исходя из того, что вводил пользователь. Я знаю, что это должно быть возвращение, но я думаю, я не знаю, где его разместить.

Что я пробовал: после вызова функции я вошел:

if blackdoor(decision) == "1": 

И продолжают оттуда, но это не работает.

Кодекс:

def blackdoor(): 
    print """After having recently died you awake to find yourself standing in an all white room with a black door that seems to go into the sky forever. What do you do?\n1.Touch the door.\n2.Shout at the door.\n3.Stare at the door.""" 
    decision = raw_input("> ") 
    if decision == "1": 
     print "You touch the door. It is as cold as ice. You can feel a vibration pulsing from the door through your body.\n" 
    elif decision == "2": 
     print "You shout 'Hello?! Is anybody there?!' at the door. But nothing responds. Your voice echoes off in the distance.\n" 
    elif decision == "3": 
     print "You stare at the door intensely. You envision it opening when all of a sudden you get the feeling of something staring back at you.\n" 
    else: 
     print "You don't follow instructions very well, do you?\n" 
     blackdoor() 
    return decision 

blackdoor() 

Как я могу вытащить вход для решения вне, чтобы использовать его в качестве условия, чтобы игра происходит?

+0

Обратите внимание, что злоумышленник может вызвать функцию черного доступа до тех пор, пока ваш стек не переполнится, что может привести к произвольной вставке кода. –

ответ

1

Вы рекурсивно звоните blackdoor(), но вы не возвращаете результат вызова. Чтобы вернуть результат обратно вызывающему абоненту, вам нужно будет return blackdoor().

Простые изменения должны сделать это;

def blackdoor(): 
print """After having recently died you awake to find yourself standing in an all white room with a black door that seems to go into the sky forever. What do you do?\n1.Touch the door.\n2.Shout at the door.\n3.Stare at the door.""" 
decision = raw_input("> ") 
if decision == "1": 
    print "You touch the door. It is as cold as ice. You can feel a vibration pulsing from the door through your body.\n" 
elif decision == "2": 
    print "You shout 'Hello?! Is anybody there?!' at the door. But nothing responds. Your voice echoes off in the distance.\n" 
elif decision == "3": 
    print "You stare at the door intensely. You envision it opening when all of a sudden you get the feeling of something staring back at you.\n" 
else: 
    print "You don't follow instructions very well, do you?\n" 
    return blackdoor() 
return decision 
+0

Я пробовал это, когда я пробовал код Аладдина, по какой-то причине ему приходится вводить значение дважды до выхода цикла. Любая идея почему? – JWilkerson

+0

От вашего дизайна, похоже, у вас нет выбора. Вам нужно будет ввести «неправильный» выбор, чтобы войти в рекурсивный вызов, а затем ввести «правильный» вариант, чтобы выйти из него. Моя рекомендация заключалась бы в том, чтобы переписать его и удалить рекурсию. – AlG

1

Согласно моему пониманию вашей проблемы, ваш код кажется нормально, однако, это, вероятно, бежать из стека из-за многочисленных рекурсии, если вы не установили предел рекурсии для большого числа.

Я бы для итеративного решения, следующим образом:

def blackdoor(): 
    end_condition = False 
    while not end_condition: 
     end_condition = True 
     print """After having recently died you awake to find yourself standing in an all white room with a black door that seems to go into the sky forever. What do you do?\n1.Touch the door.\n2.Shout at the door.\n3.Stare at the door.""" 
     decision = raw_input("> ") 
     if decision == "1": 
      print "You touch the door. It is as cold as ice. You can feel a vibration pulsing from the door through your body.\n" 
     elif decision == "2": 
      print "You shout 'Hello?! Is anybody there?!' at the door. But nothing responds. Your voice echoes off in the distance.\n" 
     elif decision == "3": 
      print "You stare at the door intensely. You envision it opening when all of a sudden you get the feeling of something staring back at you.\n" 
     else: 
      print "You don't follow instructions very well, do you?\n" 
      end_condition = False 
    return decision 


decision = blackdoor() 
0

Я предполагаю, что у Вас есть многие из этих точек принятия решений по всем вашей игре, и вы заблудились, пытаясь встроить их в функции. Если это так, то вам следует изучить, используя простой Finite State Machine (FSM).

Список вариантов FSM существует на PythonWiki.

Использование FSM кажется излишним, если у вас есть только одно или два действия, но вам не составит труда запрограммировать даже простую приключенческую игру без помощи одного.

Обновление Я нашел полезный ответ на Python and FSM для справок в будущем.

+0

Я читал об этом раньше, но я буквально начал программировать на питоне, как 3 дня назад. lol – JWilkerson

+0

Да, это может быть сложно. Помните об этом предположении, когда вы некоторое время экспериментировали с этими функциями. Когда у вас есть больше уверенности, вы можете попробовать простой учебник или вводную книгу по программированию игр, чтобы узнать больше о FSM. +1 как приветствуем SO и Python. – gauden