2017-11-01 30 views
0

私は非常に単純なtictactoeゲームを作成しようとしています。その後、Python:if文が正しく機能しないのはなぜですか?

#Defining the board. 3 rows with 3 cells 
board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

#Player icons 
p1_icon = "X" 
p2_icon = "O" 

#Player input 
p1_input_row = 0 
p1_input_cell = 0 
p2_input_row = 0 
p2_input_cell = 0 
#Player input text 
p1_turn = "Player 1's turn: " 
p2_turn = "Player 2's turn: " 

#String for invalid answer 
invalid = "Invalid answer! Try again." 

#Function for printing the board 
def print_board(): 
    print("-------") 
    print("|" + str(board[0][0]) + "|" + str(board[0][1]) + "|" + str(board[0][2]) + "|") 
    print("-------") 
    print("|" + str(board[1][0]) + "|" + str(board[1][1]) + "|" + str(board[1][2]) + "|") 
    print("-------") 
    print("|" + str(board[2][0]) + "|" + str(board[2][1]) + "|" + str(board[2][2]) + "|") 
    print("-------") 

#Main game-loop 
while True: 
    #Player 1's turn 
    print(p1_turn) 
    p1_input_row = int(input("Row: ")) 
    #Check player 1's input 
    if p1_input_row == 1 or 2 or 3: 
     p1_input_cell = int(input("Cell: ")) 
     if p1_input_cell == 1 or 2 or 3: 
      board[(p1_input_row - 1)][(p1_input_cell - 1)] = p1_icon 
      print_board() 
     else: 
      print(invalid) 
    elif p1_input_row == 4: 
     print("WTF") 
    else: 
     print(invalid) 
    break 

私はプレーヤー(p1_input_row)は1と3の間の行を選択した場合もしそうならチェックしたい:

は私が望むように動作するように見えるdosen'tこのif文を持っていますプログラムはプレーヤーにセルの選択を依頼する必要があります:p1_input_cell = int(input("Cell: "))。プレーヤーが1〜3の行を選択しなかった場合は、エラーメッセージを表示します。同じif文がp1_input_cellになります。

例えば、4と書くと、エラーメッセージは表示されません。プログラムは代わりにセルを要求します。何故ですか?

+2

..または2または3常に真です –

答えて

2

テスト:Pythonで

すべての非ゼロ値はTrueとして解釈されます。Pythonはあなたが期待するかもしれないとは異なる、これを解釈するため

p1_input_row == 1 or 2 or 3 

は常に、Trueを返します。 or文は、それがコードを解釈しp1_input_row

に対する対互いに対する実体のそれぞれを比較しているように:

if p1_input_row == 1 or p1_input_row == 2 or p1_input_row == 3: 

OR

を:

p1_input_row == 1 or True or True 

次のようにあなたは、あなたのテストを書き換える必要があります

if p1_input_row in [1, 2, 3]: 
    # do something 
+0

コード: '' [1、2、3]のp1_input_row: '':あなたが尋ねます: '' p1_input_row''が '' in''の場合、新しいリスト '' [1、2、 3] ''それから行動を起こす? –

+1

可能な値のコレクションが少ない場合は、 'in'ステートメントを使用して、コレクション内の値と既知の値を比較することは、複数の 'if'ステートメントを使用するか、複数の 'or'ステートメントを使用する代わりに妥当な方法です。ここではあなたの質問に基づいて3つの可能な値しかないので、それらをリストに入れ、p1_input_rowに関連付けられた値がリストに存在するかどうかをテストするために 'in'を使用しました。 –

+0

回答ありがとう! –

関連する問題