2015-10-18 3 views
0

Я пытаюсь создать простую игру Tic-Tac-Toe в python, чтобы проверить выигрыш. Я использую вложенный цикл для поиска соответствия во вложенных списках. По какой-то причине мой код будет искать только первый вложенный список, а не остальные, как я ожидал.Вложенные циклы во вложенных списках

board = [ 'O', 'X', ' ', 'O', ' ', 'X', 'O', 'X', 'X' ] 
wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]] 

def checkWin(player): 
    win = False 
    for test in wins: 
     print (test) 
     count = 0 
     for squares in test: 
      if board[squares] == player: 
       count = count + 1 
      if count == 3: 
       win = True 
     return win 

if __name__ == '__main__': 
    print ("\nChecking board for X win ...\n") 
    if checkWin("X"): 
     print ("Game over, X wins!") 

    print ("\nChecking board for O win ...\n") 
    if checkWin("O"): 
     print ("Game over, O wins") 

Основываясь на плате предусмотрен выигрыш для вывода, как ожидается, вместо этого, это выход я получаю:

Checking board for X win ... 

[0, 1, 2] 

Checking board for O win ... 

[0, 1, 2] 

Кто-нибудь знает, почему это происходит?

+0

Вы немедленно вернуться, что вам нужно сделать отступ возвращаемого значения обратно. – zeroth

+0

Вы возвращаетесь после первой итерации по тесту, присваиваете 'return win' в соответствии с вашим первым' for' –

ответ

1

Вы возвращаетесь из первого теста вложенного списка, независимо от от того, что три квадрата соответствуют. Вместо этого, только вернуться, если win верно:

def checkWin(player): 
    win = False 
    for test in wins: 
     count = 0 
     for squares in test: 
      if board[squares] == player: 
       count = count + 1 
      if count == 3: 
       win = True 
     if win: 
      return True 
    return False 

Если win ложно, выше продолжается до следующего вложенного списка для следующего теста.

еще лучше, просто вернуться, когда count установлен в 3, так как вы знаете, что вы нашли матч на этом этапе:

def checkWin(player): 
    for test in wins: 
     count = 0 
     for squares in test: 
      if board[squares] == player: 
       count = count + 1 
      if count == 3: 
       return True 
    return False 

Вместо подсчета, вы можете использовать all() function:

def checkWin(player): 
    for test in wins: 
     if all(board[square] == player for square in test): 
      return True 
    return False 

all() возвращает False рано, как только один из тестов в выражении генератора выходит из строя.

И окончательная версия добавляет any() для завершения теста в одной строке:

def checkWin(player): 
    return any(all(board[square] == player for square in test) 
       for test in wins) 

Демо:

>>> board = [ 'O', 'X', ' ', 'O', ' ', 'X', 'O', 'X', 'X' ] 
>>> wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]] 
>>> def checkWin(player): 
...  return any(all(board[square] == player for square in test) 
...    for test in wins) 
... 
>>> checkWin('X') 
False 
>>> checkWin('O') 
True 
Смежные вопросы