2017-03-02 1 views
0

私は質問を説明するために最善を尽くしますが、私はすでに非常に混乱しています!チックタックトーゲームマイケルドーソンのcomputer_move関数

def winner(board): 
    WAYS_TO_WIN = ((0, 1, 2), 
        (3, 4, 5), 
        (6, 7, 8), 
        (0, 3, 6), 
        (1, 4, 7), 
        (2, 5, 8), 
        (0, 4, 8), 
        (2, 4, 6)) 

    for row in WAYS_TO_WIN: 
     if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY: 
      winner = board[row[0]] 
      return winner 

ですから、その動きを取る場合、これは、コンピュータが勝つことができるかどうかを確認するためにcomputer_move関数内のループである:これは勝利の関数である

for move in legal_moves(board): 
    board[move] = computer 
    if winner(board) == computer: 
     print(move) 
     return move 

私の質問は、winnerです関数は勝つためにすべての組み合わせをチェックし、勝者の最初の部分のみを返します。すなわちwinner = board [row [0]]

のように(3、4、5)もし勝利したコンピュータの移動がboard[row[2]]にあり、th e winner関数はboard[row[0]]を返すので、勝利移動であっても条件if winner(board) == computerと一致しませんか?

答えて

0

最初の機能は、いずれかの入賞組み合わせの3つのセルが同じ値を保持していて、これがEMPTYではないかどうかをチェックし、その値をプレーヤーまたはコンピュータに戻します。

コンピューターはすべての法的な動きをシミュレートし、彼がこの動きで勝利するかどうかを確認し、彼が勝つように動くことを見つけたら、彼はそれを行います。例えば

player computer EMPTY 
EMPTY computer player 
EMPTY EMPTY player 

コンピュータは、空のセルのいずれかが、彼が勝つ行った場合、彼が中心EMPTYセルを満たしたときに何が起こるか、チェックし、したがって、彼はそれに到達するためにしなければならなかった動きになります勝つ位置。

+0

しかし、勝利の動きが[2]であっても、コンピュータは「勝者(ボード)==コンピュータ」だけをチェックし、勝者(ボード)は勝者の組み合わせの最初のセルを返します。 [行[0]] " –

+0

あなたはそれがどのように動作するのか理解していません。一歩踏み出す:コードそのものを忘れる。この関数はボード( 'list')を受け取り、勝者があるかどうかをチェックします。右?次に、あなたが最初に投稿したループは、可能なすべての動きを決定します(これは、ボード内の 'EMPTY'セルのどれかにトークンを置くことができます)。これらの可能な動きのそれぞれについて、彼はこの動きが適用されたボードを生成し、この動きで勝つかどうかをチェックする。彼が勝った場合、彼は実際のボードにこの動きを適用し、別の動きを試していなければゲームに勝つ。 – Adirio