2015-01-15 3 views
0

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

Идеи?

class grab(): 
    #Checks the player's pockets for items. 
    def pocket_check(inventory, pocket, thing, input, state, list, room): 
     if inventory[pocket] != None: 
      print("You find that your %s is stuffed full.")%(input) 
     if inventory[pocket] == None: 
      inventory[pocket] = thing 
      del room["Items"][thing] 
      state["Strain"] += list[thing]["Weight"] 
      print("You put the %s in your %s.")%(thing, input) 

    #Takes items and putting them in the player's inventory 
    def grab(inventory, thing, list, state, room): 
     go = True 
     while go: 
      if list != "WEAPON" and state["Strain"]+list[thing]["Weight"] <= state["Strength"]: 
       inp = input("Where will you put it?").lower() 
       inp_broke = inp.split(" ") 
       if inp_broke[0] == "stop": 
        go = False 
       elif inp_broke[0] != "put": 
        inp = input("Where will you PUT it?").lower() 
        inp_broke = inp.split(" ") 
       elif inp_broke[0] == "put": 
        if inp_broke[1:3] == "shirt pocket": 
         pocket_check(inventory, "Shirt Pocket", thing, "shirt pocket", state, list, room) 
        if inp_broke[1:4] == "left front pocket": 
         pocket_check(inventory, "Left Front Pocket", thing, "left front pocket", state, "ITEM", room) 
        if inp_broke[1:4] == "right front pocket": 
         pocket_check(inventory, "Right Front Pocket", thing, "right front pocket", state, "ITEM", room) 
        if inp_broke[1:3] == "back pocket": 
         pocket_check(inventory, "Back Pocket", thing, "back pocket", state, "ITEM", room) 
+1

Будьте осторожны при расщеплении пространства: 'inp.split (" ")'. Любое (случайное) двойное пространство приведет к пустому значению в 'inp_broke'. Вместо этого используйте разделение пробелов по умолчанию: 'inp_broke = inp.split()'. – Evert

+1

Вы должны поощрять стандарты именования PEP 8 - например, имена классов, начинающиеся с заглавной буквы. – wwii

+0

Вы должны позволить игроку использовать кокос в качестве кармана. Затем позже дайте ему лайм. Достижение Получите: Налейте известь в кокосовый орех. – mbomb007

ответ

0

Это

if inp_broke[1:3] == "shirt pocket": 

не будет работать. inp_broke - это список (строк) и не волшебным образом объединяется в строку. Вы можете использовать str.join метод:

if " ".join(inp_broke[1:3]) == "shirt pocket": 

Это будет сочетать в себе отдельные элементы списка в строку, разделенной исходная строка (в данном случае, один пробел).

+0

Все еще есть проблемы. он по-прежнему возвращается к вершине цикла, заявляя: «Куда вы его поместите». Мы поставили некоторые инструкции для печати, чтобы проверить, проходила ли она через всю функцию, какая она была, но она не продвинулась бы дальше конец последнего заявления elif. –

0

Из фрагмента:

np_broke = inp.split(" ") 
... 
if inp_broke[1:3] == "shirt pocket": 

нарезка список из раскола() возвращает список строки, а не строка:

>>> inp = "put shirt pocket" 
>>> inp_broke = inp.split(" ") 
>>> inp_broke[1:3] 
['shirt', 'pocket'] 
0

while go будет зацикливаться навсегда, если только False не назначен в пределах цикла go. Метод pocket_check может возвращать логическое значение в зависимости от его успеха и его возвращаемого значения, назначенного go при вызове.

Смежные вопросы