首页 > 解决方案 > 即使列表的迭代到位,墙壁碰撞也不起作用

问题描述

我的墙壁碰撞代码不起作用。我没有收到任何错误消息,播放器只是穿过墙壁。这是我的代码:

def drawRect(x, y):
    pygame.draw.rect(screen, BLUE, [pxl(x), pxl(y), pxl(1), pxl(1)])
def drawLevel(level):
    global gameDrawn, wallsCoord
    x = y = 0

    wallsCoord = []

    walls = []

    ends = []

    
    
    if gameDrawn == False:
        screen.fill(WOODY)
        
        drawRect(1, 8)
        showTimer()
        
        for row in levels[level]:
            for col in row:
                if col == "W":
                    wall = Wall((x, y))
                    walls.append(wall)
                    wallsCoord.append((x, y))
                if col == "E":
                    end = End((x, y))
                    ends.append(end)
                if col == "P":
                    drawRect(1, 9)
                x += 80
            y += 80
            x = 0
        for wall in walls:
            pygame.draw.rect(screen, BLACK, wall.rect)
        for end in ends:
            pygame.draw.rect(screen, RED, end.rect)
    gameDrawn = True  
    return walls, ends

def drawPlayerPath(players):
    global wallsCoord
    for x, y in players:
        if (x, y) in wallsCoord:
            state = "gameover"
            init_state = True
        else:
            drawRect(x, y)

def getPlayerPath(players):
    global move_list, player_x, player_y
    player_x, player_y = players[0]
    for i in move_list:
        if i == 1:
            player_y -= 1
        elif i == 2:
            player_y += 1
        elif i == 3:
            player_x += 1
        elif i == 4:
            player_x -= 1
        players.append((player_x, player_y))

我真的不明白,为什么它不起作用,因为我已经在墙壁的坐标列表上迭代了玩家列表的 x 和 y 值。

标签: pythonpygame

解决方案


global当您想在函数内更改全局命名空间中的变量时,您必须使用该语句:

def drawPlayerPath(players):
    global state, init_state    # <---
    for x, y in players:
        if (x, y) in wallsCoord:
            state = "gameover"
            init_state = True
        else:
            drawRect(x, y)

推荐阅读