连接四如何检查对角线



我已经检查了赢家的行和列,但我没有线索如何解决对角线。下面是我的获胜者判定函数:

def winner(board):
"""This function accepts the Connect Four board as a parameter.
If there is no winner, the function will return the empty string "".
If the user has won, it will return 'X', and if the computer has
won it will return 'O'."""
for row in range(7):
count = 0
last = ''
for col in range(7):
row_win = board[row][col]
if row_win == " ":
count = 0
continue
if row_win == last:
count += 1
else:
count = 1
if count >= 4:
return row_win
last = row_win
for col in range(7):
count = 0
last = ''
for row in range(7):
col_win = board[row][col]
if col_win == " ":
count = 0
continue
if col_win == last:
count += 1
else:
count = 1
if count >= 4:
return col_win
last = col_win

我想不出一种方法来检查对角线。这里是代码的其余部分,如果你需要任何参考:https://paste.pythondiscord.com/epihuvujal.py任何提示将非常感激!

这里有一个简单的示例,您可以尝试并修改它以满足您的需求:

def winner(board, length):
"""Returns the 'mark' of the winning player"""
W = range(len(board))     # width
H = range(len(board[0]))  # height
directions = [(0, 1), (1, 0), (1, 1), (1, -1)]

for dx, dy in directions:
edges = []  

if dx > 0:
edges += [(0, y) for y in H]

if dy > 0:   # scanning down
edges += [(x, 0) for x in W]

if dy < 0:   # scanning up
edges += [(x, H[-1]) for x in W]

for ex, ey in edges: 
row = 0; mark = None
x, y = ex, ey

while x in W and y in H:
if board[x][y] == mark:
row += 1
else:
mark = board[x][y]
row = 1
if mark is not None and row >= length:
return mark
x, y = x + dx, y + dy
return None
print(winner([
['X', 'O', 'O', 'O'],
['O', 'X', 'O', 'X'],
['O', 'O', 'X', 'O'],
['O', 'X', 'X', 'X'] ], 4))  # X

要检查对角线,需要嵌套循环。

for循环可以完成工作,但是while循环也可以。

你需要的for循环不是你代码中的那个,而是用i和j表示迭代的那个。

注意,从价值板[i][j]开始,有4条对角线要检查。

左上方、右上方、左下方和右下方的那个

您可以通过每次从i和j中添加1或减去1来访问它们。

就像这个棋盘[i+1][j+1]和棋盘[i][j]和棋盘[i-1][j-1]在同一对角线上。

你可以访问任何你想要的值(如果是连接3或4或K)

但是要注意不要超出板的边界(也许你可以使用try - catch)。

还有一点,不要害怕对角线被检查两次,因为你的代码最终会检查新的对角线。

您还可以添加一个您之前访问过的diags列表,这样它就不会重复工作。

最新更新