pygame收集反弹的彩色小方块.py

"""pygame收集反弹的彩色小方块.py"""
 
import pygame
import random
 
# 定义颜色常量
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0) 
 
class Block(pygame.sprite.Sprite):
    """    方块类,继承自角色类    """
 
    def __init__(self, color, width, height,screen):
        """ 初始化方法,传递的参数有颜色和宽度、高度 """
        # 调用父类的初始化方法
        super().__init__()
 
        # 根据宽度和高度创建图形对象,并用颜色填充
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
 
        # 图形的矩形对象有x,y,width,height属性,这里用rect引用矩形对象
        self.rect = self.image.get_rect()        
 
        # 方块所在屏幕的最左、最右、最上、最底边界坐标
        self.left_boundary = 0
        self.right_boundary = screen.get_width()
        self.top_boundary = 0
        self.bottom_boundary = screen.get_height()
        
        # 设置方块的随机x,y坐标
        self.rect.x = random.randrange(self.right_boundary)
        self.rect.y = random.randrange(self.bottom_boundary)        
 
        # 水平速度和垂直速度,也代表着方向
        self.dx = random.randrange(-3, 4) 
        self.dy = random.randrange(-3, 4) 
  
    def update(self):
        """ 更新方块的坐标. """
        self.rect.x += self.dx
        self.rect.y += self.dy
        # “碰”到边缘就反弹,如果超过右边界,或小于左边界,则dx取反,dy同理
        if self.rect.right >= self.right_boundary or self.rect.left <= self.left_boundary:
            self.dx *= -1
 
        if self.rect.bottom >= self.bottom_boundary or self.rect.top <= self.top_boundary:
            self.dy *= -1
 
 
class Player(Block):
    """ 玩家类继承自方块类,但是重写了update方法,它用鼠标指针来操控 """
    def update(self):
        # 获取鼠标指针坐标
        pos = pygame.mouse.get_pos()
 
        # 把鼠标指针坐标设为玩家矩形的x和y坐标
        self.rect.x = pos[0]
        self.rect.y = pos[1]
 
# 初始化pygame引擎
pygame.init()
 
# 设置宽度和高度并且新建屏幕对象
screen_width = 700
screen_height = 400
screen = pygame.display.set_mode([screen_width, screen_height])
pygame.display.set_caption("pygame收集反弹的彩色小方块 www.scratch8.net")
 
# 这是所有方块角色“列表”,它是Group类建立的
block_list = pygame.sprite.Group()
 
# 这是所有的角色列表,包括方块和玩家
all_sprites_list = pygame.sprite.Group()
 
for i in range(50):
    # 实例化一个方块
    r = random.randint(0,255)
    g = random.randint(0,255)
    b = random.randint(0,255)    
    block = Block((r,g,b), 20, 15,screen)
 
 
    # 所有的方块加到方块列表和所有角色列表
    block_list.add(block)
    all_sprites_list.add(block)
 
# 创建红色玩家对象,并且增加到所有角色列表
player = Player(RED, 20, 15,screen)
all_sprites_list.add(player)
 
# 用来控制while循环结束的逻辑变量
done = False
 
# 用来管理刷新率的逻辑变量
clock = pygame.time.Clock()
 
score = 0
 
# -------- 主程序循环 -----------
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
 
    # 清屏为黑色
    screen.fill(BLACK)
 
    # 所有角色更新
    all_sprites_list.update()
 
    # 检测玩家方块是否碰到了其它方块
    blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True)
 
    # 迭代所碰到的每个小方块
    for block in blocks_hit_list:
        score += 1
        print(score)
 
    # 重画所有角色
    all_sprites_list.draw(screen)
 
    # 设置帧率为60
    clock.tick(60)
 
    # 所有的都重画后,再显示出来
    pygame.display.flip()
 
pygame.quit()