0

基本的に、これは私が作成している小さなストリング ゲームの一部です。プレイヤーは「a」または「d」を押して、部屋の左または右を見て手がかりを集めることができます。プレイヤーがすでにその場所を見ている場合。「あなたはすでにここにいます」というメッセージが表示されます

ただし、一度正しいポイントに移動すると、次のポイントで「すでにここにいます」というメッセージが表示されます。例。「a」を押して「d」の代わりに「d」を押すと、すでにそこに行ったことがあると表示されますが、行ったことはありません。ヘルプ/提案??

left = 0
right = 0
#Room 1 movements
def roomOneLeft():
    global left
    left = 1
    print '-- You search the rubble and find some cloth'
    return roomOneMoves()

def roomOneRight():
    global right
    right = 1
    print '-- You find a pick under a wooden chair'
    return roomOneMoves()

#room 1 user choose
def roomOneMoves():
    global left
    global right
    move = raw_input("")
    if left == 1:
        print 'you have already been here'
        return roomOneMoves()
    if right == 1:
        print 'you have already been here'
        return roomOneMoves() 
    if move == 'a':
        roomOneLeft()     
    if move == 'd':
        roomOneRight()

roomOneMoves()

編集:ご協力いただきありがとうございます。私のコードが見ていて非常にいらだたしい場合は、申し訳ありません! 今すぐ動作しました。しかし、あなたの助けからのみ。

4

4 に答える 4

3

あなたのコードについて「疑わしい」と言えることはたくさんありますが、あなたの問題は、プレーヤーの動きに関係なく、leftとの両方rightがチェックされるという事実に起因しています。'a' をleft押すと 1 になります。その後 'd' を押すとleft、1 であるかどうかがチェックされ、メッセージが出力されます。

于 2013-01-04T14:20:39.583 に答える
2

コードを見てみましょう:

  1. 私たちは呼びますroomOneMoves()
  2. ユーザーが を押すaと、移動は次のようになります'a'
  3. leftは not1であるため、if の分岐には入りません。
  4. rightそうではない1ので、if の分岐には入りません。
  5. move 私たちは 'a'そう呼んでいますroomOneLeft()
  6. leftになり1、メッセージを出力してroomOneMoves()再度呼び出します。
  7. ユーザーがを押すとdmove'd'
  8. leftが 1 になったので、メッセージを出力してroomOneMoves()再度呼び出します。

言い換えれば、ユーザーが実際に行きたい部屋を決定する前に、部屋に行ったことがあるかどうかを確認して救済します。

于 2013-01-04T14:23:03.033 に答える
1

手遅れになるまで自分の動きを確認しません。観察:

move = raw_input("")
if left == 1:
    print 'you have already been here'
    return roomOneMoves()
if right == 1:
    print 'you have already been here'
    return roomOneMoves() 
if move == 'a':
    roomOneLeft()     
if move == 'd':
    roomOneRight()

ユーザーが実際に左に移動した場合にleft == 1のみ、その部分を評価したいですね。代わりに、次のように if ステートメントをネストします。

move = raw_input("")
if move == 'a':
    if left:
        print 'you have already been here'
        return roomOneMoves()
    roomOneLeft()
if move == 'd':
    if right:
        print 'you have already been here'
        return roomOneMoves() 
    roomOneRight()

また、データ構造を再考し、グローバル変数の代わりにブール値または類似の辞書を使用する必要があります。さらに、ほとんどの Python インタープリターは末尾再帰を効率的に評価できないため、次の関数を再帰的に呼び出す代わりに、反復メイン ループを使用することをお勧めします。

于 2013-01-04T14:21:42.253 に答える
0

問題はあなたのroomOneMoves機能にあります:

move = raw_input("")

まず、ユーザーから方向を取得します。ただし、まだ評価していません。

if left == 1:
    print 'you have already been here'
    return roomOneMoves()
if right == 1:
    print 'you have already been here'
    return roomOneMoves() 

ユーザーが左または右に移動したことがあるかどうかを確認してメッ​​セージを表示し、さらに悪いことに、最初からroomOneMovesやり直します。

if move == 'a':
    roomOneLeft()     
if move == 'd':
    roomOneRight()

その後、実際に新しい方向性を評価します。

最初に新しい方向を評価し、評価するときにのみ、方向が以前に入力されたかどうかを確認する必要があります。

move = raw_input("")
if move == 'a':
    if left == 1:
        print 'you have already been here'
    else:
        roomOneLeft()
elif move == 'd':
    if right == 1:
        print 'you have already been here'
    else:
        roomOneRight()
roomOneMoves()

また、おそらく最後に無条件にメソッドを再開したいと思うでしょう。

于 2013-01-04T14:21:41.113 に答える