3

最初的问题:对于给定的 3x3 井字棋棋盘,检查是否有玩家获胜。

到目前为止,我提出的最简单的解决方案是旋转矩阵并对每一行求和:

board
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

pr(board)
0 1 2
3 4 5
6 7 8

pr(zip(*board))
0 3 6
1 4 7
2 5 8

上面的 0..9 数字只是为了显示棋盘上的位置,通常它们会为玩家 1 填充 1,为玩家 2 填充 -1,为未填充位置填充 0。逐行进行,如果总和为 3 或 -3,则为获胜块。

但是,不检查对角线。有没有办法以优雅+高性能的方式从这样的矩阵中提取对角线?我的意思不是“手动”使用琐碎的索引(0、1、2),而是获取 nxn 矩阵的对角线。

PS pr 只是打印二维列表的辅助函数:

def pr(x):
    for row in x:
        print ' '.join(map(str, row))
4

5 回答 5

11

你可以得到一个对角线:

[r[i] for i, r in enumerate(board)]
# [0, 4, 8]

和对角线的对角线:

[r[-i-1] for i, r in enumerate(board)]
# [2, 4, 6]
于 2013-02-26T22:40:15.300 回答
3

用魔方给你的游戏领域编号

2|9|4
7|5|3
6|1|8

现在在三步之后总结并检查总和是否为 15 --> 获胜者。您必须为每个玩家检查这一点。当然你必须在第 4 步和第 5 步后重新检查(仅限开始游戏的玩家)

这就是我在我的第一个 Java 类中解决这个问题的方法。

于 2013-02-26T22:46:57.963 回答
2

可能您需要的是numpy,请参阅在 Python 中获取矩阵/列表列表中的所有对角线。也许你可以使用它,并像你一样翻转它以获得其他解决方案。

if sum(board[i][i] for i in (0, 1, 2)) in (-3, 3):
    true
于 2013-02-26T22:39:57.037 回答
2

方板上的对角线位于索引相等的位置,因此对于 3x3 板,它们是 board[0][0]board[1][1]board[2][2]或两者之和为板尺寸 1(在这种情况下为 3 个位置):例如board[0][2]board[1][1]board[2][0]--注意这board[1][1]两个集合中都包含,因为它应该是。这些事实使得编写 Python 代码来计算它们变得相当容易:

board = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
BOARD_SIZE = len(board)

diags1 = [board[i][i] for i in xrange(BOARD_SIZE)]
diags2 = [board[i][BOARD_SIZE-1-i] for i in xrange(BOARD_SIZE)]

print diags1
print diags2

输出:

[0, 4, 8]
[2, 4, 6]
于 2013-02-27T00:02:14.857 回答
1

这将为您提供一个列表,其中包含一个方向的对角线元素(从左上到右下):

[board[i][i] for i in range(len(board))]

这将对相反的方向执行相同的操作:

[board[i][len(board)-i-1] for i in range(len(board))]
于 2013-02-26T22:40:19.923 回答