pygame转圈圈的方块收集小游戏核心代码.

"""转圈圈的方块收集小游戏核心代码.py"""
 
import pygame
import random
import math
 
# 定义颜色常量
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
 
 
class Block(pygame.sprite.Sprite):
    """ 方块类,继承自角色类 """ 
    def __init__(self, color, width, height):
        """ 初始化方法,先调用父类的同名方法,然后创建image """
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
        self.rect = self.image.get_rect()
 
        # 转圈圈的中心点坐标
        self.center_x = 0
        self.center_y = 0
 
        # 转圈圈的起始角度
        self.angle = 0
 
        # 离中心点的距离,也就是半径
        self.radius = 0
 
        # 每帧增加的角度数
        self.speed = 0.05
 
    def update(self):
        """ 更新角色的坐标 """
        # 用三角函数计算新的坐标
        self.rect.x = self.radius * math.sin(self.angle) + self.center_x
        self.rect.y = self.radius * math.cos(self.angle) + self.center_y
 
        # 下一个回合(下一帧)的角度
        self.angle += self.speed 
 
class Player(pygame.sprite.Sprite):
    """ 玩类类,继承自角色类. """
    def __init__(self, color, width, height):
        """ 调用基类的同名方法,创建玩家图像 """
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
        self.rect = self.image.get_rect()
 
    def update(self):
        """更新为鼠标指针的坐标"""
        pos = pygame.mouse.get_pos()
        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])
 
# 方块“列表”,由组来创建.
block_list = pygame.sprite.Group()
 
# 所有角色列表,由Group来创建。
all_sprites_list = pygame.sprite.Group()
 
for i in range(50):
    # 实例化一个小方块
    block = Block(BLACK, 20, 15)
 
    # 设置一个随机的旋转中心点
    block.center_x = random.randrange(SCREEN_WIDTH)
    block.center_y = random.randrange(SCREEN_HEIGHT)
    # 设置一个随机的半径
    block.radius = random.randrange(10, 200)
    # 从 0 to 2派的起始旋转角度
    block.angle = random.random() * 2 * math.pi
    # 每帧增加的角度数
    block.speed = 0.008
    # 增加到方块列表和所有角色列表
    block_list.add(block)
    all_sprites_list.add(block)
 
# 创建一个红色的小方块
player = Player(RED, 20, 15)
all_sprites_list.add(player)
 
# 用户单击了关闭按钮会触发QUIT事件,把此变量设为True会退出while循环
# 所以,它初始化的值为False
done = False
 
# 设置屏幕刷新率的时钟对象
clock = pygame.time.Clock()
 
score = 0
 
# -------- 主程序循环 -----------
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
 
    all_sprites_list.update()
 
    # 给屏幕填充为白色
    screen.fill(WHITE)
 
    # 检测是否玩家方块和其它方块有碰撞
    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)
 
    # 显示
    pygame.display.flip()
 
    # 设置帧率为60
    clock.tick(60)
 
pygame.quit()