2017-03-02 86 views
0

我會盡我所能來形容這個問題,但我已經很困惑了!因此,這是獲勝的功能:井字遊戲michael dawson 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函數檢查所有組合贏得勝利,並且只返回第一塊勝出的比賽,即(3,4,5)勝利將只返回'3'作爲贏家,因爲贏家=棋局[row [0]]

如果獲勝的計算機移動在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],但計算機只能通過「如果贏家(棋盤)==電腦」和贏家(棋盤)只返回贏得組合的第一個單元格來檢查「贏家=棋盤[row [0]]「 –

+0

你不理解它是如何工作的。退一步:忘記代碼本身。該函數接受一個棋盤('list')並檢查是否有勝者。對?然後,首先發布的循環決定了所有可能的移動(也就是說,他可以將一個標記放置在電路板內的任何「EMPTY」單元中)。對於這些可能的動作中的每一個,他都會生成一個應用此動作的棋盤,並檢查他是否會以此動作獲勝。如果他贏了,那麼他將這個動作應用到真正的棋盤上並贏得比賽,如果他不嘗試另一個動作的話。 – Adirio