Python矩阵检查对角线和水平线是否正确以赢得游戏

2024-09-27 19:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个类似Connect4的游戏,用户可以连接任何号码。我在检查水平线和对角线时遇到问题:

def WinningSequenceCheck(board,piece,row_count):
    #Horizontal Check
    piecePlayer1=0
    piecePlayer2=0
    win_sequence=board[0]["TamanhoSequência"]
    width=board[0]["CumpGrelha"]
    height=row_count

    for c in range(height+1):
        for r in range(width):
            if board[0]["Tabuleiro"][c][r]==1:
                piecePlayer1+=1
                if piecePlayer1==win_sequence:
                    return True                    
            if board[0]["Tabuleiro"][c][r]==2:
                pecasPlayer2+=1
                if pecasPlayer2==win_sequence:
                    return True

#For diagonals i did this:
    diag1=0
    diag2=0
    a=0
    b=height
    d=0
    for c in range(width):
        for l in range(height+1):
            if board[0]["Tabuleiro"][b-l][l+a]==1:
                diag1+=1
                if diag1==win_sequence:
                    return True                    
            if board[0]["Tabuleiro"][b-l][l+a]==2:
                diag2+=1
                if diag2==win_sequence:
                    return True
            if (b-l<height):
                b=height
                if l<=l-1:
                    a=a
                elif(a+l<width-1):
                    a+=1 
                elif(a+l<=width-1):
                    return        
                else:
                    break 

对角线的问题是它从左向右移动,但它没有正确地检查是否有一行1或2的获胜序列 如果它发现它应该返回true,因为每次他发现1或2时,我都会递增

我在做水平检查吗? 有没有更好的方法在对角线上登记

水平线的预期结果是,如果它找到数字1,它将添加到变量piecePlayer1(对于播放器1) 如果piecePlayer1等于胜利序列(例如胜利序列为5),则游戏返回true,因为在其中一行中,他找到了5个1

Winning Sequence=5
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0] ---> Win

对角线检查也是如此:

Winning Sequence =4
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0] Diagonal WIN
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Tags: inboardtrueforreturnifrangewidth
1条回答
网友
1楼 · 发布于 2024-09-27 19:23:59

@stuna,下面是检查diagonal值的简单示例代码,您可以尝试并修改它以适合您的主模块:

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
Share

相关问题 更多 >

    热门问题