2016-09-13 10 views
-1

私は学校用の基本的なロックペーパーはさみコードをやっていますが、私のelifステートメントは実行されていません。Elifステートメントが印刷されない

def player1(x): 
    while x != 'rock' and x != 'paper' and x != 'scissors': 
     print("This is not a valid object selection") 
     x = input("Player 1? ") 

def player2(x): 
    while x != 'rock' and x != 'paper' and x != 'scissors': 
     print("This is not a valid object selection") 
     x = input("Player 2? ") 

def winner(): 
    player1(input("Player 1? ")) 
    player2(input("Player 2? ")) 
    if player1 == 'rock' and player2 == 'rock': 
     print('Tie') 
    elif player1 == 'paper' and player2 == 'paper': 
     print('Tie') 
    elif player1 == 'rock' and player2 == 'paper': 
     print('Player 2 wins') 
    elif player1 == 'paper' and player2 == 'rock': 
     print('Player 1 wins') 
    elif player1 == 'rock' and player2 == 'scissors': 
     print('Player 1 wins') 
    elif player1 == 'scissors' and player2 == 'rock': 
     print('Player 2 wins') 
    elif player1 == 'paper' and player2 == 'scissors': 
     print('Player 2 wins') 
    elif player1 == 'scissors' and player2 == 'paper': 
     print('Player 1 wins') 
    elif player1 == 'scissors' and player2 == 'scissors': 
     print('Tie') 

winner() 

このコードを実行すると、「Player 1?」というメッセージが表示されます。岩、紙、はさみ以外のものは受け入れません。それから、player2も同様に処理を進めます。しかし、これはコードが終了するところであり、私のelifステートメントを実行せず、どのプレイヤーが勝利するかは印刷されません。

編集:解決済み。初心者を助けてくれてありがとう。私は完全に文字列を返すことを忘れて、変数に代入しました。

+1

「player1」または「player2」は変数ではなく、関数参照です...それらを文字列と比較していますか? ''勝者 ''に使用したい場合は、 '' x''を呼び出し先に返すことも考えています。 – Li357

答えて

0

あなたの比較は:player1とplayer2の両方が機能しているので、

elif player1 == "rock" and player2 == "rock": 
# etc 

は常に、失敗します。

代わりに、関数から戻り、それらを変数に割り当てる必要があります。妥当性検査を1分で切りとめて、これを少し減らしましょう。

def choose(prompt): 
    return input(prompt) 

def winner(a, b): 
    if a == 'rock': 
     if b == 'rock': return None 
     elif b == 'paper': return 2 
     elif b == 'scissors': return 1 
    elif a == 'paper': 
     # etc 

def play_game(): 
    p1_choice = choose("Player 1: ") 
    p2_choice = choose("Player 2: ") 
    return winner(p1_choice, p2_choice) 

これらのelifのチェーンは、辞書に入れて辞書にインデックスを付けることをお勧めします。

RESULT_DICT = {"rock": {"rock": None, 
         "paper": 2, 
         "scissors": 1}, 
       "paper": {"rock": 1, 
         "paper": None, 
         "scissors": 2}, 
       "scissors": {"rock": 2, 
          "paper": 1, 
          "scissors": None}} 

def winner(a, b): 
    return RESULT_DICT[a][b] 
+1

私はたぶん 'a == bの場合RESULT_DICT [a] [b]' ...を返すでしょう。その場合、そのdictの33%を削除することができます。 – TemporalWolf

+0

@TemporalWolfあまりにも、私は、あまりにも、すべての選択肢とすべての結果をクラスメンバーの列挙型にロールし、そのように入力検証を行います。しかし、それはここにもそこにはありません。 –

+0

'a == b else((2の場合はb ==" Paper "else 1)a ==" Rock "elseの場合(2ならb ==" Scissors "else 1)a ==" Paper "else(2ならb ==" Rock "else 1)))' dictは必要ありません。私は自分自身を見るでしょう。 – TemporalWolf

1

x内にはplayer1が割り当てられていません。関数が戻るとすぐに、xに割り当てられた値が削除されます。それは、あなたがあなたの意見を捨てていることを意味します!次に、ファンクションplayer1の文字列を比較しています。これは入力内容と一致する場合もあれば、一致しない場合もあります。

デバッグのための提案:制御フローに問題があるときはいつでも、制御変数を出力してください。ここで、player1を印刷すると、驚くべきことがあります。

関連する問題