如何在自定义尺寸的井字棋对角线中检查获胜

时间:2019-07-30 23:29:37

标签: python list logic tic-tac-toe

我正在制作一个简单的井字游戏,用户可以在其中指定网格的大小(列和行的数量)。
我需要创建一个函数,该函数可以检查网格中所有对角线的胜利。

对于网格,我使用的是二维列表,看起来像这样(3x3示例):

grid = [['x', '-', 'o'], 
        ['o', 'x', '-'], 
        ['-', '-', 'x']]
grid[row][col]

这应该是一个成功的情况

我已经为垂直和水平获胜创建了一个检查,但是我不太清楚如何检查对角线。

这是我在代码中检查行赢的方法:

min_win_streak是最小的连胜纪录(例如,在经典的3x3井字游戏中为3)

def check_rows(grid, min_win_streak):
    winner = '-'
    for row in grid:
        win_streak = 0
        for element in row:
            if element != '-':
                if element == winner:
                    win_streak += 1
                    winner = element
                    if win_streak >= min_win_streak:
                        return True, winner
                else:
                    win_streak = 1
                    winner = element
            else:
                win_streak = 0
                winner = '-'
    return False, None



我需要check_diags()函数,返回值应该是:

  • 为x赢,该功能应返回True,'x'
  • 为o赢,该函数应返回True,'x'
  • 不获胜,该功能应返回False,无

2 个答案:

答案 0 :(得分:0)

您可以使用以下嵌套的for循环检查2x2中的对角线:

for i in range(len(grid)-2):
    for j in range(len(grid)-2):
        if grid[i][j] == grid[i+1][j+1] == grid[i+2][j+2] and grid[i][j] != '-':
            print('Winner')
        elif grid[i][j+2] == grid[i+1][j+1] == grid[i+2][j] and grid[i][j+2] != '-':
            print('Winner')

根据需要将其插入到具有所需返回值的函数中,以代替打印语句。应该可以轻松地更改为3x3、4x4等。

答案 1 :(得分:0)

感谢您发布代码。我用all函数替换了win_streak检查循环。下面的代码完成的工作比您想要在庞大的网格上使用的工作还要多,但是它易于理解(易于)和适应,并且足够快地用于go-moku游戏(19x19上连续5个)板)。

我留下了一条跟踪print语句来说明它正在检查的对角线。您应该能够使其适应NE-SW对角线(check_slash_diag)。

grid = [['x', '-', 'o', 'o'],
        ['o', 'x', 'o', '-'],
        ['-', 'o', 'x', 'x'],
        ['-', 'x', 'o', '-']]

def check_backslash_diag(grid, min_win_streak):

    grid_size = len(grid)
    grid_extra = grid_size - min_win_streak   # This is the "extra" space in a long line

    # This pair of loops will iterate through the upper-left square of side 
    #   grid_extra+1, starting points of any diagonals long enough to contain a win.
    for start_row in range(grid_extra+1):
        for start_col in range(grid_extra+1):
            # Extract a diagonal "row" of length min_win_streak
            diag = [grid[start_row+i][start_col+i] for i in range(min_win_streak)]
            print(start_row, start_col, diag)  # DEBUG: Display checked diagonals
            if all(diag[i] == diag[0] for i in range(min_win_streak)):
                print(diag[0], "wins on NW-SE diagonal at", start_row, start_col)

check_backslash_diag(grid, 3)

输出:

0 0 ['x', 'x', 'x']
x wins on NW-SE diagonal at 0 0
0 1 ['-', 'o', 'x']
1 0 ['o', 'o', 'o']
o wins on NW-SE diagonal at 1 0
1 1 ['x', 'x', '-']