2017-02-07 17 views
2

私はpython(とそのことについてはコーディング)には新しく、ロック、ペーパー、はさみの運動を行っています。 2番目のゲームの後で、私のコードは私が別のものをプレイしたいのであれば私に尋ねるのではなく、自動的にゲームの関数を呼び出します。誰かが私が間違って行くことができるか知っていますか?あなただけ依頼する必要がありロック、ペーパー、はさみのゲームは意図したとおりにループしません

import sys 

print("Welcome to rock, paper, scissors!") 

player_a = input("Player A input one of the following; rock, paper or scissors: ") 
player_b = input("Player B input one of the following; rock, paper or scissors: ") 

def game(p1, p2): 
    if p1 == p2: 
     print("It is a draw!") 
    elif p1 == "rock" and p2 == "scissors": 
     print("Player A wins!") 
    elif p1 == "rock" and p2 == "paper": 
     print("Player B wins!") 
    elif p1 == "paper" and p2 == "rock": 
     print("Player A wins!") 
    elif p1 == "paper" and p2 == "scissors": 
     print("Player B wins!") 
    elif p1 == "scissors" and p2 == "rock": 
     print("Player A wins!") 
    elif p1 == "scissors" and p2 == "paper": 
     print("Player B wins!") 

game(player_a, player_b) 

playAgain = input("Would you like to play again? (Insert Y or N): ") 

while playAgain == "Y": 
    player_a = input("Player A input one of the following; rock, paper or scissors: ") 
    player_b = input("Player B input one of the following; rock, paper or scissors: ") 
    game(player_a, player_b) 
else: 
    print("Thanks for playing!") 
    sys.exit() 
+8

「あなたはもう一度やりたいですか?」と尋ねるビットはループ内にないので、一度だけ実行されます。 – khelwood

答えて

5

"もう一度再生できますか?"あなたのループ内の質問。

重要なコーディングの原則はDRY:Don't Repeat Yourselfです。少しの再編成によって、あなたのコードでいくつかの繰り返しを取り除くことができます。

以下のコードでは、プログラムの開始時に、ユーザーは既に「再生」に「Y」と答えています。質問。 sys.exit()をコールする必要はありませんことを

print("Welcome to rock, paper, scissors!") 

def game(p1, p2): 
    if p1 == p2: 
     print("It is a draw!") 
    elif p1 == "rock" and p2 == "scissors": 
     print("Player A wins!") 
    elif p1 == "rock" and p2 == "paper": 
     print("Player B wins!") 
    elif p1 == "paper" and p2 == "rock": 
     print("Player A wins!") 
    elif p1 == "paper" and p2 == "scissors": 
     print("Player B wins!") 
    elif p1 == "scissors" and p2 == "rock": 
     print("Player A wins!") 
    elif p1 == "scissors" and p2 == "paper": 
     print("Player B wins!") 

playAgain = "Y" 
while playAgain == "Y": 
    player_a = input("Player A input one of the following; rock, paper or scissors: ") 
    player_b = input("Player B input one of the following; rock, paper or scissors: ") 
    game(player_a, player_b) 
    playAgain = input("Would you like to play again? (Insert Y or N): ") 
else: 
    print("Thanks for playing!") 

注、私たちは、プログラムが自然に終了させることができます。


また、gameの機能をかなり凝縮することもできます。それがドローではなく、Aが勝たなければ、B に勝つ必要があります。だから私たちはすべてのBテストを行う必要はありません。 orオペレータを使用して、Aテストを1つのテストに組み合わせることができます。

def game(p1, p2): 
    if p1 == p2: 
     print("It is a draw!") 
    elif ((p1 == "rock" and p2 == "scissors") 
     or (p1 == "paper" and p2 == "rock") 
     or (p1 == "scissors" and p2 == "paper")): 
     print("Player A wins!") 
    else: 
     print("Player B wins!") 

テストを行うには、より高度な(そして少しPython的)な方法は、タプルを使用することです:

def game(p1, p2): 
    if p1 == p2: 
     print("It is a draw!") 
    elif (p1, p2) in (("rock", "scissors"), ("paper", "rock"), ("scissors", "paper")): 
     print("Player A wins!") 
    else: 
     print("Player B wins!") 
1

それとも

while True: 
    if input("Would you like to play again? (Insert Y or N): ") == "Y": 
     player_a() 
     player_b() 
    else: 
     print('thanks for playing') 
     break 
2

あなたのコード上の点のカップル:

1)私は1つのために "はさみ"を正確に綴ることはほとんどできません。主な機能が 'r'、 'p'、または 's'を予期している場合、ゲームのプレイがより楽になるかもしれないので、入力の最初の文字をgame()に渡すのはなぜですか?次のようなものがあります。

player_a = input("Player A input one of the following; rock, paper or scissors: ") 
payer_a = player_a.strip().lower()[0] 

と同様にplayer_bです。私は常にループとしてじゃんけんを視覚

2):

R 
/\ 
S -- P 

あらゆる可能性が時計方向にあるアイテムに負け、およびplayer_2か否かから時計回りになっていますplayer_1は、モジュラ算術を介して決定することができます。

def game(p1,p2): 
    if p1 == p2: 
     print("It is a draw!") 
    else: 
     i = "rps".index(p1) 
     if "rps"[(i+1)%3] == p2: 
      print("Player B wins!") 
     else: 
      print("Player A wins!") 

この方法であなたが例増殖を避けます。さらに、この種のことは、Big Bang(宇宙の起源ではなく、ショー)の "rock-paper-scissors-Spock-lizard"にゲームを拡張したい場合に、より簡単に拡張できます。インデックス上のモジュラー算術演算は、( "rock-paper-scissors-Spock-lizard"は単純な方向よりも少しは必要ですが)行く方法です。

+0

私はちょうど 'r、p、s、l、k 'を提案しようとしていました(あなたが' ro、pa、sc、li、sp'などを望んでいない限り)。 –

+0

@WayneWerner良い観察。私が "rock-paper-scissors-Spock-lizard"を行う場合は、インデックスを参照して入力を実行し、0-4の数値のペアを 'game( ) '。入力の最初の2文字を使用することは、キーの自然な選択のように思えます(貧しいスペルは、 "はさみ"が "si"ではなく "sc"を始めることを少なくとも思い出さなければなりません。予期しないスペルミス) –

+0

'input(" Choice [ro、pa、sc、li、sp]: ")'のようなものを使うこともできます。 –

関連する問題