NxN检测井字游戏获胜

时间:2020-06-23 17:46:00

标签: pygame

我试图将我的井字游戏概括为NxN网格。我一切正常,但发现很难获得检测胜利所需的代码。 这是我遍历电路板的行和列的功能。我不知道为什么它当前无法正常工作。谢谢

def check_win(array_board):
    global winner
    for row in range(N):
        for i in range(N-1):
            if array_board[row][i] != array_board[row][i+1] or array_board[row][i] == 0:
                break
        if i == N-1:
            winner = array_board[row][0]
            pygame.draw.line(board, (0, 0, 0), (75, (row * round(height / N) + 150)), (825, (row * round(height / N) + 150)), 3)

    for col in range(N):
        for j in range(N-1):
            if array_board[j][col] == 0 or array_board[col][j] != array_board[col][i+1]:
                break
        if j == N - 1:
                winner = array_board[0][col]
                pygame.draw.line(board, (0, 0, 0), (col * round(width / N) + 150, 75), (col * round(width / N) + 150, 825), 3)

1 个答案:

答案 0 :(得分:2)

您没有在问题中指定,所以 my 交叉网格是2D字符数组,带有一些默认的“空”字符串(单个空格)。

def getEmptyBoard( size, default=' ' ):
    """ Create a 2D array <size> by <size> of empty string """
    grid = []
    for j in range( size ):
        row = []
        for i in range( size ):  # makes a full empty row
            row.append( default )
        grid.append( row )
    return ( size, grid )

因此,给定一个2D的字符串网格,如何检查n个非零交叉点Win?这就是在特定行或列中相同字符的计数等于网格的大小时。

因此,如果您有5x5的网格,则任何具有5个相同项目(例如“ x”)的row都是赢家。同样,对于专栏... 5个“ o”是胜利。

因此,给定2D数组,您如何检查这些条件。一种方法是计算每个单元格中单独符号的出现次数。如果该计数达到5(网格大小),那么无论该符号是什么,它都是赢家。

def checkForWin( board, default=' ' ):
    winner = None
    size = board[0]
    grid = board[1]

    ### Tally the row and column
    for j in range( size ):
        col_results = {}

        ### Count the symbols in this column
        for i in range( size ):
            value = grid[i][j]
            if ( value in col_results.keys() ):
                col_results[ value ] += 1
            else:
                col_results[ value ] = 1

        ### Check the tally for a winning count
        for k in col_results.keys():
            if ( k != default and col_results[k] >= size ):
                winner = k     # Found a win
                print("Winner: column %d" % ( j ) )
                break

        if ( winner != None ):
            break

    # TODO: also implement for rows
    # TODO: also implement for diagonals

    return winner  # returns None, or 'o', 'x' (or whatever used for symbols)

上面的函数使用两个循环和一个python字典来保存找到的内容的列表。可以在同一循环中同时检查行和列,因此它并不是真正的逐行或逐列,而只是两个size循环。

无论如何,因此在循环中,当我们第一次遇到x时,它将被添加到字典中,其值为1。下次我们找到x时,将使用字典来对整个列中的事件dict['x'] → 2进行计数。

在循环结束时,我们遍历字典键(可能是 ox)来检查计数。当计数与行或列的大小相同时,这就是获胜线。

很显然,如果找不到胜利,我们将计数归零,并使用外循环移动到下一列/行。