0

宿題の質問があります。以下を表す辞書を作成する必要があります。

北は庭に通じています。南はキッチンに通じています。東はダイニングルームに通じています。西側はリビングルームに通じています。

プレーヤーは方向を求められ、その方向から外れている場所で応答する必要があります。たとえば、プレーヤーが北に入ると、プログラムは次のように応答する必要があります。北は庭につながります。プレーヤーが無効な方向を入力した場合、プログラムは入力を無視して別の方向を要求する必要があります。プレーヤーが終了すると、プログラムは終了します。

私の問題は、ユーザーが「終了」と入力してもプログラムが終了しないことです。そのため、while ステートメントが機能しない理由がわかりません。これが私のコードです:

 #Create a Dictionary to represent the possible
 #exits from a location in an adventure game

 game = {"north" : "North leads to garden.",
    "south" : "South leads to the kitchen.",
    "east" : "East leads to the dining room.",
    "west" : "West leads to the living room."}
 print "Press quit to exit"

 direction = raw_input("Enter your direction: ")
 while direction != "quit":
     direction = direction.lower()

     if direction in game:
         location = game[direction]
         direction = direction.lower()
         print location


     if direction not in game:
         direction = raw_input("Enter your direction: ")
         location = game[direction]
         direction = direction.lower()
         print location

     raw_input("\n\nPress quit to exit")
4

3 に答える 3

3

コードをどのようにインデントしたかはわかりませんが、問題は次のとおりだと思います。

raw_input("\n\nPress quit to exit")

次のようにする必要があります。

direction = raw_input("\n\nPress quit to exit")

ただし、いくつか問題があります。

if direction not in game:        
     direction = raw_input("Enter your direction: ")
     location = game[direction]
     direction = direction.lower()
     print location

コードのこの時点で、入力された方向は quit ではなく、辞書にもありません。したがって、この時点で quit と入力すると、次のようになります。

Traceback (most recent call last):
  File "homework.py", line 21, in <module>
    location = game[direction]
KeyError: 'quit'

これを解決するには 2 つの方法があります。試してから例外を処理するか、辞書のメンバーシップを再度確認するかです。例えば:

if direction not in game:        
     try:
         direction = raw_input("Enter your direction: ")
         location = game[direction]
         direction = direction.lower()
         print location
     except KeyError:
          pass

except KeyErrorデバッグ中に貴重な情報が失われるため、すべての例外を黙らせたくない場合にのみ使用しました。それが辞書にあるかどうかを確認する方法を知っていることを示したので、そのアプローチを再度示す必要はありません。

したがって、それをまとめると、次のようになります。

#Create a Dictionary to represent the possible
#exits from a location in an adventure game

game = {"north" : "North leads to garden.",
        "south" : "South leads to the kitchen.",
        "east" : "East leads to the dining room.",
        "west" : "West leads to the living room."
}

direction = raw_input("Enter your direction: ")

while direction != "quit":
    direction = direction.lower()
    if direction in game:
        location = game[direction]
        direction = direction.lower()
        print location

    if direction not in game:        
         try:
             direction = raw_input("Enter your direction: ")
             location = game[direction]
             direction = direction.lower()
             print location
         except KeyError:
             pass

    direction = raw_input("\n\nPress quit to exit: ")

ここまで来たら、プログラムがどのように実行されているかを確認する必要があります。スクリプトの実行中に、同じ変数を設定して、ユーザーに複数回入力を求めていることがわかります。これで、必要な呼び出しを削除することを検討する必要があります。ブロックを追加したtry: exceptので、以前の辞書のメンバーシップのチェックは必要ありません。

#Create a Dictionary to represent the possible
#exits from a location in an adventure game

game = {"north" : "North leads to garden.",
        "south" : "South leads to the kitchen.",
        "east" : "East leads to the dining room.",
        "west" : "West leads to the living room."
}    
# Initialize the direction variable
direction = ""
# Keep looping user types in quit
while direction != "quit":   
         try:
             # Take the user input at the start of the loop
             direction = raw_input("Enter your direction Or quit to exit: ")
             # Get the location string if it exists
             location = game[direction]
             # Make the string lower case
             direction = direction.lower()
             # Display location message
             print location
         # If this KeyError is raised user has entered a location not in the
         # dictionary
         except KeyError:
             # We can do nothing because we are just going to get new user input
             # next time the loop runs!
             pass

この時点で、貨物コードを削除するのが良いと思います。なぜ使用するのですか:

location = game[direction]
direction = direction.lower()

小文字の指示が必要な場合は、上の 10 行で小文字として定義できます。次に、同じメッセージを常に尋ねるのは面倒なので、中隔の終了メッセージを尋ねます。したがって、不要な行を削除すると、次のようになります。

game = {"north" : "North leads to garden.",
       "south" : "South leads to the kitchen.",
       "east" : "East leads to the dining room.",
        "west" : "West leads to the living room."
}

direction = ""

while direction != "quit":   
         try:
             direction = raw_input("Enter your direction: ").lower()
             print game[direction]
         except KeyError:
             direction = raw_input("The direction you have entered is invalid\nEnter a direction or quit to exit: ")

ここでは、場所変数も削除しました。この例では、方向が重要な情報であるため不要です。また、存在しない Key を出力しようとすると KeyError が発生するので、これはすばらしいことです。

また、呼び出したい場合.lower()は、最初に変数を設定する必要がないことに注意してください。次のように、辞書にアクセスしているときに実行できます。

print game[direction].lower()
于 2013-08-23T16:40:15.493 に答える
1

As with the others here, I can't be entirely sure of what your code is trying to do because of the lack of indents, but taking a shot in the dark, it may be easier to use a method for getting the direction that will handle bad directions. So your code can become:

   #Create a Dictionary to represent the possible
   #exits from a location in an adventure game

def get_dir():
    good_answers = ["north", "south", "east", "west", "quit"]
    direction = raw_input("Enter your direction: ").lower()
    while direction not in good_answers:
        direction = raw_input("Bad direction, try again: ").lower()
    return direction

game = {"north" : "North leads to garden.",
    "south" : "South leads to the kitchen.",
    "east" : "East leads to the dining room.",
    "west" : "West leads to the living room."}

print "Press quit to exit"
direction = get_dir()
while direction != "quit":
    print game[direction]
    direction = get_dir()

print "Quitting..."
于 2013-08-23T17:23:46.880 に答える
0

とにかく入力を待つ場合は、終了する場合に「if」を1つ、実際の方向である場合に「elif」を、最後に単純な「else」を実行する方が簡単です。意味不明に入力します。

于 2013-08-23T17:16:07.013 に答える