2017-03-02 34 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