gpt4 book ai didi

python - 在 Python 二维数组中连续确定三个

转载 作者:太空狗 更新时间:2023-10-30 02:14:12 24 4
gpt4 key购买 nike

我正在使用 Python 开发一个带有 M x N 棋盘的井字游戏。我正在尝试找到一种有效的方法来确定玩家是否获胜(垂直、水平或对角线方向连续 3 个)。游戏的大多数 3x3 实现只是在每个回合后检查所有可能的获胜组合。对于一 block 巨大的木板,这似乎有点极端。

4x4 示例:(使用 1s 和 2s 而不是 Xs 和 Os)

board = ([1,0,2,1], [0,0,0,1], [2,2,0,0], [1,0,0,1])
for row in board:
print row

谢谢-乔纳森

最佳答案

虽然这种方法有一定的吸引力,但它可能不是特别快。

# A bogus game with wins in several directions.
board = (
[1,1,2,1],
[0,2,1,1],
[2,2,2,1],
[1,0,0,1],
)

# A few convenience variables.
n_rows = len(board)
lft = [ [0] * i for i in range(n_rows) ] # [[], [0], [0, 0], [0, 0, 0]]
rgt = list(reversed(lft))

# Create transpositions of the board to check for wins in various directions.
transpositions = {
'horizontal' : board,
'vertical' : zip(*board),
'diag_forw' : zip(* [lft[i] + board[i] + rgt[i] for i in range(n_rows)] ),
'diag_back' : zip(* [rgt[i] + board[i] + lft[i] for i in range(n_rows)] ),
}

# Apply Jonathan's horizontal-win check to all of the transpositions.
for direction, transp in transpositions.iteritems():
for row in transp:
s = ''.join( map(str, row) )
for player in range(1,3):
if s.find(str(player) * 3) >= 0:
print 'player={0} direction={1}'.format(player, direction)

输出:

player=1 direction=diag_back
player=2 direction=diag_forw
player=2 direction=horizontal
player=1 direction=vertical

对角线转置背后的想法是移动行,使用 lftrgt 进行左右填充。例如,diag_forw 列表在添加填充后看起来像这样(填充字符显示为句点,即使实际代码中使用了零)。

1 1 2 1 . . .
. 0 2 1 1 . .
. . 2 2 2 1 .
. . . 1 0 0 1

然后我们使用 zip(*foo) 简单地转置该数组,这允许我们使用 Jonathan 的好主意来寻找水平胜利。

关于python - 在 Python 二维数组中连续确定三个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com