0

私は三目並べゲームを作るためのpythonコードを書いています。ボード、x、y の 3 つの入力を受け取る関数を作成する必要があります。Board はボードの現在の表示で、x と y は 0、1、または 2 の値です。ゲームは、ユーザーに座標を尋ねるように設定されています。

def CheckVictory(board, x, y):

    #check if previous move was on vertical line and caused a win
    if board[0][y] == ('X') and board[1][y] == ('X') and board [2][y] == ('X'):
        return True
    if board[0][y] == ('O') and board[1][y] == ('O') and board [2][y] == ('O'):
        return True

    #check if previous move was on horizontal line and caused a win
    if board[x][0] == ('X') and board[x][1] == ('X') and board [x][2] == ('X'):
        return True
    if board[x][0] == ('O') and board[x][1] == ('O') and board [x][2] == ('O'):
        return True

    #check if previous move was on the main diagonal and caused a win
    if board[0][0] == ('X') and board[1][1] == ('X') and board [2][2] == ('X'):
        return True
    if board[0][0] == ('O') and board[1][1] == ('O') and board [2][2] == ('O'):
        return True
    #check if previous move was on the secondary diagonal and caused a win
    if board[0][2] == ('X') and board[1][1] == ('X') and board [2][0] == ('X'):
        return True
    if board[0][2] == ('O') and board[1][1] == ('O') and board [2][0] == ('O'):
        return True

    return False 
#end of CheckVictory function

関数はゲームループで次のように呼び出されます

p_x, p_y = playerTurn(board)    #let player take turn
displayBoard(board)             #show board after move has been made
if CheckVictory(board, p_x, p_y):   #see if user has won
    print("CONGRATULATIONS, you win!")
    newGame(board)  #game over start new one
    continue

コンピューターのターンでも同様です

この関数を書くためのより良い方法があるように感じます。x と y をもっと使うべきだと思います。あるいは、すべての可能性を書くよりも、もっと良いチェック方法があると思います。では、これを書くためのより良い方法は何ですか?短く簡潔にするために。

4

1 に答える 1

3

パラメータが必要な理由がわかりません.3つのX文字または3つのO文字が連続しているかどうかを確認する必要があります.そのための座標は必要ありませんx. y代わりに、最初にボードを編集して、プレイヤーが入力した座標を更新してから、勝利が発生したかどうかを確認します。

これが私が行う方法ですが、あなたの方法を使用したい場合は、お気軽に。あなたはまだ私のバージョンから何かを学ぶことができます.

def check_victory(board):
    combinations = [
        # horizontal
        ((0,0), (1,0), (2,0)),
        ((0,1), (1,1), (2,1)),
        ((0,2), (1,2), (2,2)),
        # vertical
        ((0,0), (0,1), (0,2)),
        ((1,0), (1,1), (1,2)),
        ((2,0), (2,1), (2,2)),
        # crossed
        ((0,0), (1,1), (2,2)),
        ((2,0), (1,1), (0,2))
    ]

    for coordinates in combinations:
        letters = [board[y][x] for x,y in coordinates]
        if len(set(letters)) == 1:
            return letters[0] # returns corresponding letter for winner (X/O)

    return False

リスト内包表記とセットを使用していることに注意してください。それらに慣れていない場合は、このソリューションを使用する前に学習することをお勧めします。

于 2013-04-05T17:10:45.490 に答える