pygame最简单关卡迷宫游戏核心原理

""" 0_最简单关卡迷宫游戏核心原理.py """
 
import pygame 
 
# 颜色常量定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
CYAN = (0, 250, 255)
 
# 屏幕尺寸常量定义
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
 
class Player(pygame.sprite.Sprite):
    """ 这是玩家控制的角色. """ 
   
    def __init__(self, x, y):
        # 调用父类的初始化方法
        super().__init__()
 
        # 生成图形对象,填充为白色
        self.image = pygame.Surface([15, 15])
        self.image.fill(WHITE)
 
        # 图像左上角做为角色的坐标
        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x
 
        # 设置速度向量
        self.xspeed = 0  # 水平速度
        self.yspeed = 0  # 垂直速度
        self.walls = None
 
    def changespeed(self, x, y):
        """ Change the speed of the player. """
        self.xspeed += x
        self.yspeed += y
 
    def update(self):
        """ 更新玩家坐标 """
        # 左右移动,(通过按左与右方向箭头控制xspeed从而控制横向坐标)
        self.rect.x += self.xspeed
 
        # 与所有的墙的碰撞检测,返回碰到的墙列表
        block_hit_list = pygame.sprite.spritecollide(self, self.walls, False)
        for block in block_hit_list:
            # 如果角色正在往右移动,那么把角色最右x坐标设置为block的最左x坐标
            if self.xspeed > 0:
                self.rect.right = block.rect.left
            else:
                # 否则我们在往左移,把角色最左x坐标设为block最右x坐标
                self.rect.left = block.rect.right
 
        # 上下移动
        self.rect.y += self.yspeed
 
        # 检测是否碰到所有walls之一,返回列表
        block_hit_list = pygame.sprite.spritecollide(self, self.walls, False)
        for block in block_hit_list:
 
            # 原理和左右碰撞一样,如果往下移,那么把底坐标设为block的顶坐标
            if self.yspeed > 0:
                self.rect.bottom = block.rect.top
            else:
                self.rect.top = block.rect.bottom
 
 
class Wall(pygame.sprite.Sprite):
    """ 墙类 """
    def __init__(self, x, y, width, height):
        super().__init__()
 
        # 墙的imgage,填充为青色
        self.image = pygame.Surface([width, height])
        self.image.fill(CYAN)
 
        # 墙的矩形对象
        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x
 
 
# 初始化pygame
pygame.init()
 
# 创建800x600的画面
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
 
# 设置标题
pygame.display.set_caption('最简单关卡迷宫游戏核心原理')
 
# 所有的角色列表,包括墙和移动的小方块,为了一起update和draw
all_sprite_list = pygame.sprite.Group()
 
# 所有的墙列表
wall_list = pygame.sprite.Group()
 
wall = Wall(0, 0, 10, 600)     # 实例化一睹墙
wall_list.add(wall)            # 加入到墙列表
all_sprite_list.add(wall)      # 加入到所有列表
 
wall = Wall(10, 0, 790, 10)
wall_list.add(wall)
all_sprite_list.add(wall)
 
wall = Wall(10, 200, 100, 10)
wall_list.add(wall)
all_sprite_list.add(wall)

wall = Wall(200, 50, 10, 160)
wall_list.add(wall)
all_sprite_list.add(wall)

 
# 创建玩家对象,它就是一个小方块
player = Player(50, 50)
player.walls = wall_list

# 把它加到所有角色列表
all_sprite_list.add(player)

# 建立时钟对象,用来设定帧率的
clock = pygame.time.Clock()
 
done = False
 
while not done:
 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
 
        elif event.type == pygame.KEYDOWN: # 按住了某键
            if event.key == pygame.K_LEFT: # 按住了左方向箭头
                player.changespeed(-3, 0)  # 往左移
            elif event.key == pygame.K_RIGHT:
                player.changespeed(3, 0)
            elif event.key == pygame.K_UP:
                player.changespeed(0, -3)
            elif event.key == pygame.K_DOWN:
                player.changespeed(0, 3)
 
        elif event.type == pygame.KEYUP:   # 松开按键
            if event.key == pygame.K_LEFT: # 松开的是左方向箭头
                player.changespeed(3, 0)   # 抵销刚才的左移
            elif event.key == pygame.K_RIGHT:
                player.changespeed(-3, 0)
            elif event.key == pygame.K_UP:
                player.changespeed(0, 3)
            elif event.key == pygame.K_DOWN:
                player.changespeed(0, -3)
 
    all_sprite_list.update()              # 所有角色更新坐标
    screen.fill(BLACK)                    # 重画screen
    all_sprite_list.draw(screen)          # 重画所有角色
    pygame.display.flip()                 # 更新显示
    clock.tick(60)
 
pygame.quit()