Как удалить словарную статью в зависимости от состояния элемента

Я хочу, чтобы комната была удалена из моего словаря с самого начала игры, пока snowboots = False. Когда snowboots = True, я хочу, чтобы комната была доступна, и я хочу поднять снежные ботинки, чтобы сделать их True.

если в этом есть смысл.

roomDirections = {
    "hallEnt":{"e":"hallMid"},
    "hallMid":{"s":"snowRoom", "e":"giantNature", "w":"hallEnt"},
    "snowRoom":{"n":"hallMid"},
    "giantNature":{"s":"strangeWall", "e":"riverBank", "w":"hallMid"},
    "strangeWall":{"s":"hallOuter", "e":"riverBank", "n":"giantNature"},
    "riverBank":{"e":"lilyOne", "w":"giantNature"},
    "lilyOne":{"e":"lilyTwo", "w":"riverBank", "n":"riverBank", "s":"riverBank"},
    "lilyTwo":{"e":"riverBank", "w":"lilyThree", "n":"riverBank", "s":"riverBank"},
    "lilyThree":{"e":"riverBank", "w":"lilyFour", "n":"riverBank", "s":"riverBank"},
    "lilyFour":{"e":"riverBank", "w":"treasureRoom", "n":"riverBank", "s":"riverBank"},
    "treasureRoom":{"w":"hallEnt"},
}


roomItems = {
    "hallEnt":["snowboots"],
    "snowRoom":["lamp"],
    "treasureRoom":["treasure"],
    }

snowboots = lamp = treasure = False

это мои словари и мои предполагаемые переменные.

if "snowboots" == False:
            del roomDirections["hallMid"]
        else:
            print ("you cannot go that way")

это было предназначено для удаления hallMid из roomDirections, поэтому движение из него невозможно, пока ...

elif playerInput in roomItems[currentRoom]:
        print("picked up", playerInput)
        invItems.append(playerInput)
        playerInput == True
        for i in range(0, len(roomItems[currentRoom])):
            if playerInput == roomItems[currentRoom][i]:
                del roomItems[currentRoom][i]
                break

the snowboots = True, это то, что должен был сделать этот кусок, но он, похоже, не работает, я близок или полностью сбился с пути?

РЕДАКТИРОВАТЬ - Мой основной игровой цикл -

while True:
    playerInput = input("What do you want to do? ")
    playerInput = playerInput.lower()
    if playerInput == "quit":
        break

    elif playerInput == "look":
        print(roomDescriptions[currentRoom])




    elif playerInput in dirs:
        playerInput = playerInput[0]
        if playerInput in roomDirections[currentRoom]:


            currentRoom = roomDirections[currentRoom][playerInput]
            print(roomEntrance [currentRoom])
        else:
            print("You can't go that way")

    elif playerInput == "lookdown":
        if currentRoom in roomItems.keys():
            print ("You see", roomItems[currentRoom])
        else:
            print ("You see nothing on the ground")

    elif playerInput == "inventory" or playerInput == "inv":
        print (invItems)




    elif playerInput in roomItems[currentRoom]:
        print("picked up", playerInput)
        invItems.append(playerInput)       
        for i in range(0, len(roomItems[currentRoom])):
            if playerInput == roomItems[currentRoom][i]:
                del roomItems[currentRoom][i]
                break

    elif playerInput in invItems:
        print("dropped", playerInput)
        roomItems[currentRoom].append (playerInput)
        for i in range (0, len(invItems)):
            if playerInput == invItems[i]:
                del invItems[i]
                break
    else:
        print ("I don't understand")

person kebab    schedule 19.11.2014    source источник
comment
Вы хотите сказать, что хотите, чтобы этот elif пакет назначил True snowboots? Если это так, просто добавьте оператор присваивания. playerInput == True - это неработающий оператор?   -  person wwii    schedule 19.11.2014
comment
Я не знаю, что такое оператор присваивания, извините, я очень новичок в python. РЕДАКТИРОВАТЬ: набор elif также предназначен для сбора всех трех предметов в игре, но только если игрок находится в нужной комнате   -  person kebab    schedule 19.11.2014
comment
a = 3 - это оператор присваивания - он присваивает 3 a.   -  person wwii    schedule 19.11.2014
comment
хорошо, да, у меня мои снежные ботинки = False в первом окне кода. это установлено с самого начала, так что комната недоступна с самого начала. но затем, когда подбирают снежные сапоги, мне нужно, чтобы они стали True, тогда snowboots = True вернет комнату, сделав ее доступной.   -  person kebab    schedule 19.11.2014
comment
Может быть, поменять playerInput == True на playerInput = True.   -  person wwii    schedule 19.11.2014


Ответы (3)


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

Предлагаемый вами метод - добавлять и удалять выходы из комнат, когда требуемые предметы приобретены или потеряны. Это можно сделать, но сложность поиска тех выходов, которые нужно удалить, - это все, что вам нужно, чтобы игнорировать их в первую очередь; восстановить их, если они были удалены, сложнее, чем отфильтровать их по мере необходимости. Вот один из подходов:

requirements = {'snowRoom': 'snowboots', 'darkCave': 'lamp'}
reasons = {'snowboots': "You'd sink into the snow.",
           'lamp': "It would be too dark to see."}

Затем вы можете использовать их, чтобы игнорировать направление, если условие не было выполнено:

elif playerInput in dirs:
    playerInput = playerInput[0]
    if playerInput in roomDirections[currentRoom]:
        newRoom = roomDirections[currentRoom][playerInput]
        required = requirements.get(newRoom)
        if required and required not in invItems:
            print("You can't go that way. " + reasons[required])
        else:
            currentRoom = newRoom
            print(roomEntrance [currentRoom])
    else:
        print("You can't go that way")

Вы также можете сделать так, чтобы игроки не могли убрать необходимый предмет из комнаты:

elif playerInput in invItems:
    if playerInput != requirements[currentRoom]:
        print("dropped", playerInput)
        roomItems[currentRoom].append (playerInput)
        invItems.remove(playerInput)
    else:
        print("You still need " + playerInput + ". " + reasons[required])

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

person Yann Vernier    schedule 19.11.2014

Позвольте мне указать на вашу ошибку здесь. У вас есть snowboots (который является объектом), но вы сравниваете "snowboots" (который является строкой). Поэтому, когда вы сравниваете "snowboots" в if состоянии, оно вернет false и в результате всегда будет переходить к else части. Попробуйте следующий код и дайте мне знать, поможет ли он вам.

snowboots = False
if snowboots == False:              ## notice the absence of double quotes here 
    del roomDirections["hallMid"]
else:
    print ("you cannot go that way")

РЕДАКТИРОВАТЬ: Для большей ясности я отредактировал ваш код, чтобы показать, что del работает. Я удалил

roomDirections = {
    "hallMid":{"s":"snowRoom", "e":"giantNature", "w":"hallEnt"},
}

print roomDirections  ## print dictionary before your deleting.

snowboots = lamp = treasure = False

if snowboots == False:              ## notice the absence of double quotes here 
    del roomDirections["hallMid"]
else:
    print ("you cannot go that way")

print roomDirections                ## print dictionary after deleting

Выход:

    {'hallMid': {'s': 'snowRoom', 'e': 'giantNature', 'w': 'hallEnt'}}   ## before deleting

     {}     ## after deleting.
person d-coder    schedule 19.11.2014
comment
Он все еще позволяет мне перемещаться по комнате (hallMid) и в следующие комнаты - person kebab; 19.11.2014
comment
@kebab позволяет мне перемещаться по комнате, я не понимаю. - person d-coder; 19.11.2014
comment
Я знаю, что это работает. Я использую его в других частях своего проекта, но как только hallMid будет удален из roomDirections, я не смогу перейти в новую комнату из hallMid, но я все еще могу? - person kebab; 19.11.2014
comment
Не могли бы вы предоставить нам еще часть вашего кода? или это все? - person d-coder; 19.11.2014
comment
Я добавил остальную часть своего игрового цикла, это большая часть кода, остальное - просто описательный текст - person kebab; 19.11.2014
comment
Извините, я не могу понять почему. Вот как я могу помочь - person d-coder; 19.11.2014
comment
хорошо, в любом случае спасибо :) вы мне помогли, я смогу понять это правильно, если я немного поиграю с этим - person kebab; 19.11.2014

playerInput - строка. Похоже, вам нужно сопоставить строки с логическими значениями.

items = {'snowboots' : False,
         'lamp' : False,
         'treasure' : False}

затем измените

if "snowboots" == False to if not items['snowboots']

playerInput == True to items[playerInput] = True

snowboots = lamp = treasure = False to

for item in items:
    items[item] = False

Похоже, у вас концептуальная проблема со строками и именами, и вы, кажется, смешиваете их в своем коде. "foo" - это не то же самое, что foo.

>>> 
>>> foo = 2
>>> "foo" = 2
SyntaxError: can't assign to literal
>>> foo = "foo"
>>> foo
'foo'
>>> "foo" = foo
SyntaxError: can't assign to literal
>>> foo = False
>>> bool("foo")
True
>>> bool(foo)
False
>>>

Вам нужно будет просмотреть весь свой код и разрешить все похожие коды.

person wwii    schedule 19.11.2014