检查负对角线连接4游戏在python



我正在用python创建一个connect 4的游戏(尝试学习python)。检查行,列和+ve对角线似乎工作,然而,我正在努力与负对角线。我不能把我的头围绕索引需要检查它。

我完全意识到我所拥有的代码绝不是完整的-我只是确保检查功能在继续并改进它之前正常工作…

完整的代码是:

board = [[' ' for j in range(8)] for i in range(8)]
def check_win(game_board, player):
"""
Check if a player has won the game of Connect 4 on the given game board.
Parameters:
-----------
game_board: list of lists
The game board represented as a matrix of characters. Each element of the matrix represents a cell on the board,
which can be empty (' '), or occupied by a player ('X' or 'O').
player: str
The player to check for a win. Must be either 'X' or 'O'.
Returns:
--------
bool
"""
rows = len(game_board)
columns = len(game_board[0])
for row in range(rows-3):  # Nested loops iterate over whole board
for col in range(columns - 3):
check_row = [game_board[row][col + j] for j in range(4) if 0 <= col + j < columns]
check_col = [game_board[row + j][col] for j in range(4) if 0 <= row + j < rows]
check_posit_diag = [game_board[row + j][col + j] for j in range(4) if 0 <= row + j < rows and 0 <= col + j < columns]
check_negat_diag = [game_board[row + j][col - j] for j in range(4) if 0 <= row + j < rows and 0 <= col - j < columns]
for list in [check_row, check_col, check_posit_diag, check_negat_diag]: # Checks if the list has 4 of the same characters
if list == 4*[player]:
print("You have 4 in a row")
return True
return False

board[3][4] = board[2][5] = board[1][6] = board[0][7] = "X"
check_win(board, "X")

当我调用我的函数时,我希望得到消息"你一行有4个";打印到控制台,但没有打印出来-也就是说,因为我的支票不起作用。任何帮助整理这将是非常感激,也,如果你有任何建议,我应该提高可读性,这也将是感激。谢谢你的帮助:)

你的逻辑中有几件事需要改变,因为从根本上:

要考虑的起点范围,对于4种类型的方向是不同的

  • 当你水平测试一行中的4时,你需要尝试从0到n-3(排他)开始,就像你正在做的那样,但需要测试每一行。这是因为即使是第n-3行,第n-2行和第n-1行也是有效的位置,其中水平行的4个是赢的。

这里是8x8网格的有效起始点(*)。无效起始点显示为.

*****...
*****...
*****...
*****...
*****...
*****...
*****...
*****...
  • 同样,当测试垂直列中的4时,您需要测试每个列
********
********
********
********
********
........
........
........

对角线有双重限制。

  • 对于从下到右的对角线,您可以考虑第0到n-3行(独占)和第0到n-3列(独占)。
*****...
*****...
*****...
*****...
*****...
........
........
........
  • 然而,对于向下和向左的对角线,可接受的起始点范围是移到右侧
...*****
...*****
...*****
...*****
...*****
........
........
........

如果在四个方向

上分开循环,这样更容易编写没有错误的代码这样,你就可以明确每次在你的脑海中,你要检查的是4个单元格中的哪一组。

要压缩代码,可以压缩为两个循环

"straight"上下循环和左/右循环测试相同数目的起始点(5x8或8x5),而对角线测试不同数目的起始点(5x5)。

两个循环可以是

for i_long in range(8):
for i_short in range(8-3):

test for a horizontal run, starting from i_long down, i_short across
test for a vertica run,    starting from i_short down, i_long across
for i1 in range (8-3):
for i2 in range (8-3):
test for a diagonal(+ & +) run from (i1,i2)
test for a diagonal(+ & -) run from (i1,8-i2)

对于负对角线,您的代码无法做到这一点

您正在测试,col范围从0到4(包括),而不是从5到8(包括):

check_negat_diag = [
game_board[row + j][col - j] 
for j in range(4) if 0 <= row + j < rows and 0 <= col - j < columns
]

如果你想快速修复你现有的程序,试试这个:

check_negat_diag = [
game_board[row + j][3+col - j] 
for j in range(4) if 0 <= row + j < rows and 0 <= 3+col - j < columns
]

最新更新