最初的问题:对于给定的3x3 tic tac toe board,检查其中一个玩家是否赢了。
到目前为止,我提出的最简单的解决方案是旋转矩阵并总结每一行:
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)使用琐碎的索引,而是获得n x n矩阵的对角线。
P.S。 pr只是打印2d列表的辅助函数:
def pr(x):
for row in x:
print ' '.join(map(str, row))
答案 0 :(得分:10)
你可以得到一个对角线:
[r[i] for i, r in enumerate(board)]
# [0, 4, 8]
和对面的对角线:
[r[-i-1] for i, r in enumerate(board)]
# [2, 4, 6]
答案 1 :(得分:3)
使用魔方为您的游戏区域编号
2|9|4
7|5|3
6|1|8
现在在三次移动后总结并检查总和是否为15 - >优胜者。你必须为每个玩家检查这个。当然,你必须在第4次移动和第5次移动(只有开始游戏的玩家)后重新检查
这就是我在第一个Java类中解决这个问题的方法。
答案 2 :(得分:2)
您可能需要的是numpy
,请参阅Get all the diagonals in a matrix/list of lists in Python。也许你可以使用它,并像你那样翻转以获得其他解决方案。
if sum(board[i][i] for i in (0, 1, 2)) in (-3, 3):
true
答案 3 :(得分: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]
答案 4 :(得分:0)
这将为您提供一个列表,其中包含一个方向的对角线元素(从左上角到右下角):
[board[i][i] for i in range(len(board))]
对于相反的方向,这将做同样的事情:
[board[i][len(board)-i-1] for i in range(len(board))]