玩家在迷宫Python 3.8 pygame中穿过墙

时间:2020-02-25 17:41:27

标签: python pygame

迷宫由一堆红色方块组成,以便作为迷宫来吸引人,我取了边界中所有正方形的坐标,并在边界下标记了它们。我希望玩家#1和#2不能走到例如左边,如果那里有边界,但是我已经尝试了2种方法来解决。两者都不成功。首先要说的是,他搬家后,如果他处于其中之一,他会搬回去。第二是如果有障碍物,则阻止其移动。我真的可以帮忙!

import pygame
import sys
import random

pygame.init()

width = 800
height = 800

white = (255,255,255)
blue = (0,0,255)
light_blue = (0,255,255)
red = (255,0,0)
black = (0,0,0)

player_pos = (50,50)
player_size = (50)
player_speed = (50)
player2_pos = (700,700)

border = ((50, 300) or (50, 350) or (50, 400) or (100, 50) or (100, 100) or (100, 150) or (100, 200) or (100, 300) or (100, 350) or (100, 400) or (100, 500) or (100, 550) or (100, 600) or (100, 650) or (150, 300) or (150, 400) or (150, 500) or (150, 650) or (200, 100) or (200, 150) or (200, 200) or (200, 250) or (200, 300) or (200, 400) or (200, 500) or (200, 600) or (200, 650) or (250, 400) or (250, 500) or (300, 50) or (300, 100) or (300, 200) or (300, 250) or (300, 300) or (300, 350) or (300, 400) or (300, 500) or (300, 550) or (300, 600) or (300, 650) or (350, 650) or (400, 50) or (400, 100) or (400, 150) or (400, 200) or (400, 300) or (400, 350) or (400, 400) or (400, 450) or (400, 500) or (400, 550) or (400, 600) or (400, 650) or (450, 200) or (450, 300) or (500, 100) or (500, 200) or (500, 300) or (500, 400) or (500, 450) or (500, 500) or (500, 550) or (500, 600) or (500, 650) or (550, 100) or (550, 200) or (550, 300) or (550, 550) or (600, 100) or (600, 300) or (600, 400) or (600, 450) or (600, 550) or (600, 650) or (650, 100) or (650, 150) or (650, 200) or (650, 250) or (650, 300) or (650, 400) or (650, 450) or (650, 550) or (650, 650) or (650, 700) or (650, 750) or (700, 450) or (0, 0) or (50, 0) or (100, 0) or (150, 0) or (200, 0) or (250, 0) or (300, 0) or (350, 0) or (400, 0) or (450, 0) or (500, 0) or (550, 0) or (600, 0) or (650, 0) or (700, 0) or (750, 0) or (0, 50) or (0, 100) or (0, 150) or (0, 200) or (0, 250) or (0, 300) or (0, 350) or (0, 400) or (0, 450) or (0, 500) or (750, 50) or (750, 100) or (750, 150) or (750, 200) or (750, 250) or (750, 300) or (750, 350) or (750, 400) or (750, 450) or (750, 500) or (750, 550) or (750, 600) or (750, 650) or (750, 700) or (50, 750) or (100, 750) or (150, 750) or (200, 750) or (250, 750) or (300, 750) or (350, 750) or (400, 750) or (450, 750) or (500, 750) or (550, 750) or (600, 750) or (650, 750) or (700, 750) or (750, 750) or (0, 200) or (0, 250) or (0, 300) or (0, 350) or (0, 400) or (0, 450) or (0, 500) or (0, 550) or (0, 600) or (0, 650) or (0, 700) or (0, 750))

screen = pygame.display.set_mode((width, height))

game_over = False

clock = pygame.time.Clock()

while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:

            x = player_pos[0]
            y = player_pos[1]

            a = player2_pos[0]
            b = player2_pos[1]

            if event.key == pygame.K_LEFT:
                x -= player_speed
                if player_pos == border:
                    x += player_speed
            elif event.key == pygame.K_RIGHT:
                x += player_speed
            elif event.key == pygame.K_UP:
                y -= player_speed
            elif event.key == pygame.K_DOWN:
                y += player_speed
            elif event.key == pygame.K_a:
                a -= player_speed
            elif event.key == pygame.K_d:
                a += player_speed
            elif event.key == pygame.K_w:
                b -= player_speed
            elif event.key == pygame.K_s:
                b += player_speed

            player_pos = [x,y]
            player2_pos = [a,b]

        print(event)

    screen.fill(black)

    pygame.draw.rect(screen, blue, (player_pos[0], player_pos[1], player_size, player_size))
    pygame.draw.rect(screen, light_blue, (player2_pos[0], player2_pos[1], player_size, player_size))

    pygame.draw.rect(screen, red, (50, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (50, 350, player_size, player_size))
    pygame.draw.rect(screen, red, (50, 400, player_size, player_size))

    pygame.draw.rect(screen, red, (100, 50, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 150, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 350, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 500, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 550, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 600, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 650, player_size, player_size))

    pygame.draw.rect(screen, red, (150, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (150, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (150, 500, player_size, player_size))
    pygame.draw.rect(screen, red, (150, 650, player_size, player_size))

    pygame.draw.rect(screen, red, (200, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 150, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 250, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 500, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 600, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 650, player_size, player_size))

    pygame.draw.rect(screen, red, (250, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (250, 500, player_size, player_size))

    pygame.draw.rect(screen, red, (300, 50, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 250, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 350, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 500, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 550, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 600, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 650, player_size, player_size))

    pygame.draw.rect(screen, red, (350, 650, player_size, player_size))

    pygame.draw.rect(screen, red, (400, 50, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 150, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 350, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 450, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 500, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 550, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 600, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 650, player_size, player_size))

    pygame.draw.rect(screen, red, (450, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (450, 300, player_size, player_size))

    pygame.draw.rect(screen, red, (500, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 450, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 500, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 550, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 600, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 650, player_size, player_size))

    pygame.draw.rect(screen, red, (550, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (550, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (550, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (550, 550, player_size, player_size))

    pygame.draw.rect(screen, red, (600, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (600, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (600, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (600, 450, player_size, player_size))
    pygame.draw.rect(screen, red, (600, 550, player_size, player_size))
    pygame.draw.rect(screen, red, (600, 650, player_size, player_size))

    pygame.draw.rect(screen, red, (650, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 150, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 250, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 450, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 550, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 600, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 650, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 700, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 750, player_size, player_size))

    pygame.draw.rect(screen, red, (700, 450, player_size, player_size))

    pygame.draw.rect(screen, red, (0, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (50, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (150, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (250, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (350, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (450, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (550, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (600, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (700, 0, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 0, player_size, player_size))

    pygame.draw.rect(screen, red, (0, 50, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 150, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 250, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 350, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 450, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 500, player_size, player_size))

    pygame.draw.rect(screen, red, (750, 50, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 100, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 150, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 250, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 350, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 450, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 500, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 550, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 600, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 650, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 700, player_size, player_size))

    pygame.draw.rect(screen, red, (50, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (100, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (150, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (200, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (250, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (300, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (350, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (400, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (450, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (500, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (550, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (600, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (650, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (700, 750, player_size, player_size))
    pygame.draw.rect(screen, red, (750, 750, player_size, player_size))

    pygame.draw.rect(screen, red, (0, 200, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 250, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 300, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 350, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 400, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 450, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 500, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 550, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 600, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 650, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 700, player_size, player_size))
    pygame.draw.rect(screen, red, (0, 750, player_size, player_size))

    clock.tick(20)  

    pygame.display.update()

1 个答案:

答案 0 :(得分:2)

border = ((50, 300) or (50, 350) or (50, 400) or ...)

不是一组元素,它是一个表达式语句。

相反,创建职位列表:

border = [(50, 300), (50, 350), (50, 400), (100, 50), ...]

通过该列表,您可以评估职位是否在(例如if (x, y) in border:)中。当刨床移动时,然后计算玩家的下一个位置。如果新位置在border列表中,请放弃机芯:

while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:

            x = player_pos[0]
            y = player_pos[1]

            a = player2_pos[0]
            b = player2_pos[1]

            if event.key == pygame.K_LEFT:
                x -= player_speed
            elif event.key == pygame.K_RIGHT:
                x += player_speed
            # [...]

            if not (x, y) in border:
                player_pos = [x,y]
            if not (a, b) in border:
                player2_pos = [a,b]

请注意,由于边界存储在列表中,因此可以在for循环中绘制迷宫:

while not game_over:
    # [...]

    screen.fill(black)
    pygame.draw.rect(screen, blue, (player_pos[0], player_pos[1], player_size, player_size))
    pygame.draw.rect(screen, light_blue, (player2_pos[0], player2_pos[1], player_size, player_size))
    for bpos in border:
        pygame.draw.rect(screen, red, (*bpos, player_size, player_size))
    pygame.display.update()

完整的示例代码:

import pygame
import sys
import random

pygame.init()

width = 800
height = 800

white = (255,255,255)
blue = (0,0,255)
light_blue = (0,255,255)
red = (255,0,0)
black = (0,0,0)

player_pos = (50,50)
player_size = (50)
player_speed = (50)
player2_pos = (700,700)

border = [
  (50, 300), (50, 350), (50, 400), (100, 50), (100, 100), (100, 150), (100, 200), (100, 300), (100, 350), (100, 400), (100, 500),
  (100, 550), (100, 600), (100, 650), (150, 300), (150, 400), (150, 500), (150, 650), (200, 100), (200, 150), (200, 200), (200, 250), (200, 300),
  (200, 400), (200, 500), (200, 600), (200, 650), (250, 400), (250, 500), (300, 50), (300, 100), (300, 200), (300, 250),
  (300, 300), (300, 350), (300, 400), (300, 500), (300, 550), (300, 600), (300, 650), (350, 650), (400, 50), (400, 100),
  (400, 150), (400, 200), (400, 300), (400, 350), (400, 400), (400, 450), (400, 500), (400, 550), (400, 600), (400, 650),
  (450, 200), (450, 300), (500, 100), (500, 200), (500, 300), (500, 400), (500, 450), (500, 500), (500, 550), (500, 600),
  (500, 650), (550, 100), (550, 200), (550, 300), (550, 550), (600, 100), (600, 300), (600, 400), (600, 450), (600, 550),
  (600, 650), (650, 100), (650, 150), (650, 200), (650, 250), (650, 300), (650, 400), (650, 450), (650, 550), (650, 650), 
  (650, 700), (650, 750), (700, 450), (0, 0), (50, 0), (100, 0), (150, 0), (200, 0), (250, 0), (300, 0),
  (350, 0), (400, 0), (450, 0), (500, 0), (550, 0), (600, 0), (650, 0), (700, 0), (750, 0), (0, 50),
  (0, 100), (0, 150), (0, 200), (0, 250), (0, 300), (0, 350), (0, 400), (0, 450), (0, 500), (750, 50),
  (750, 100), (750, 150), (750, 200), (750, 250), (750, 300), (750, 350), (750, 400), (750, 450), (750, 500), (750, 550),
  (750, 600), (750, 650), (750, 700), (50, 750), (100, 750), (150, 750), (200, 750), (250, 750), (300, 750), (350, 750),
  (400, 750), (450, 750), (500, 750), (550, 750), (600, 750), (650, 750), (700, 750), (750, 750), (0, 200), (0, 250),
  (0, 300), (0, 350), (0, 400), (0, 450), (0, 500), (0, 550), (0, 600), (0, 650), (0, 700), (0, 750)]

screen = pygame.display.set_mode((width, height))

game_over = False

clock = pygame.time.Clock()

while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:

            x = player_pos[0]
            y = player_pos[1]

            a = player2_pos[0]
            b = player2_pos[1]

            if event.key == pygame.K_LEFT:
                x -= player_speed
            elif event.key == pygame.K_RIGHT:
                x += player_speed
            elif event.key == pygame.K_UP:
                y -= player_speed
            elif event.key == pygame.K_DOWN:
                y += player_speed
            elif event.key == pygame.K_a:
                a -= player_speed
            elif event.key == pygame.K_d:
                a += player_speed
            elif event.key == pygame.K_w:
                b -= player_speed
            elif event.key == pygame.K_s:
                b += player_speed

            if not (x, y) in border:
                player_pos = [x,y]
            if not (a, b) in border:
                player2_pos = [a,b]

    screen.fill(black)
    pygame.draw.rect(screen, blue, (player_pos[0], player_pos[1], player_size, player_size))
    pygame.draw.rect(screen, light_blue, (player2_pos[0], player2_pos[1], player_size, player_size))
    for bpos in border:
        pygame.draw.rect(screen, red, (*bpos, player_size, player_size))
    pygame.display.update()

    clock.tick(20)