0

Snowboots = False のときに、ゲームの開始時に辞書から部屋を削除したい。Snowboots = True の場合、部屋に到達できるようにし、snowboots を拾って 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")

これは roomDirections から hallMid を削除することを意図していたので、そこからの移動は不可能です...

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")
4

3 に答える 3

1

私が理解しているように、特定の出口の通過を許可するかどうかを決定するために、いくつかの条件を追加する必要があります。現在、各部屋からの方向をマッピングする辞書、プレーヤーが各アイテムを持っているかどうかを保持するための変数、各部屋とプレーヤーのインベントリ内のアイテムのリストがあります。item 変数は冗長であることに注意してください。在庫を簡単に確認できます。

提案された方法は、必要なアイテムを取得または紛失したときに、部屋からの出口を追加および削除することです。これは可能ですが、最初にそれらを無視する必要があるのは、削除する出口を見つける複雑さだけです。それらが削除された場合にそれらを復元することは、必要に応じてそれらを除外するよりも困難です。1 つのアプローチを次に示します。

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])

部屋にアイテムのリスト、他の部屋へのリンク、および要件が実際に含まれる、よりオブジェクト指向のアプローチを使用することは理にかなっています。アイテムに同義語を追加するなどのこともできます。

于 2014-11-19T15:52:42.187 に答える
0

playerInputは文字列です。文字列をブール値にマップする必要があるようです。

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

次に変更

if "snowboots" == Falseif not items['snowboots']

playerInput == Trueitems[playerInput] = True

snowboots = lamp = treasure = False

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
>>>

すべてのコードを調べて、同様のコードをすべて解決する必要があります。

于 2014-11-19T15:03:59.350 に答える
0

ここであなたの間違いを指摘させてください。snowboots(これはオブジェクトです) がありますが、(これは文字列です) を比較しています"snowboots""snowboots"そのため、状態で比較するとiffalse が返され、その結果、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.
于 2014-11-19T04:52:26.517 に答える