Как создать генератор генераторов для определения выигрышной колонки в Ti c -Ta c -Toe? - PullRequest
0 голосов
/ 10 апреля 2020

Как часть Python MOO C, который я принимаю, я хочу лучше понять использование generator.

Есть упражнение ti c -ta c - То есть, я хочу реализовать проверку на выигрышную доску с помощью генератора.

Для определения выигрышной колонки Я создаю 3 разных генератора, Есть ли возможность создать генератор, чтобы создать все 3 объекты генератора?

board = [['x', '.', '.'], ['.', 'o', '.'], ['x', '.', '.']]

player_mark = 'x'
col1_winner = all(mark== player_mark for (mark, _, _) in board)
col2_winner = all(mark== player_mark for (_, mark, _) in board)
col3_winner = all(mark== player_mark for (_, _, mark) in board)

Для обнаружения выигрыша в строке Я написал это:

any(mark1 == mark2 == mark3 == player_mark for (mark1, mark2 , mark3) in board)

как проверить-проверить-если- all-elements-of-a-list-match-a-условие было полезно, но недостаточно для общего случая создания генераторов.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Вы можете использовать zip(*board), чтобы получить итератор столбцов. Например:

board = [['x', '.', 'x'], ['x', 'o', '.'], ['x', '.', '.']]

player_mark = 'x'
col_win = any(all(mark == player_mark for mark in col) for col in zip(*board) )
col_win 
#True

Это может иметь хорошую симметрию со строками:

row_win = any(all(mark == player_mark for mark in row) for row in board )
0 голосов
/ 11 апреля 2020

Если вы используете массив numpy, вы можете легко найти строку, столбцы с помощью np.sum и диагонали с помощью np.trace -

import numpy as np
x=np.array([[1,0,-1],[0,1,-1],[-1,0,1]])
-->array([[ 1,  0, -1],
          [ 0,  1, -1],
          [-1,  0,  1]])

np.sum(x,axis=1)
-->array([0, 0, 0])

np.sum(x,axis=0)
-->array([ 0,  1, -1])

np.trace(x)
-->3

np.trace(np.fliplr(x))
-->-1
...