陨石掉落,从零开始用Python制作飞机大战【教程第4集】

'''编完之后回头看有看不懂代码的意义?来看看我的加注释版吧,标记了各个代码的意义,如有问题敬请指出'''
# Time : 2023/6/30 22:08
# !/user/bin/env python3
# -*- coding: utf-8 -*-
import random
import pygame # 导入pygame库
# 定义常量
WIDTH = 500 # 窗口的宽
HEIGHT = 600 # 窗口的高
WHITE = (255, 255, 255) # 白色RGB常量
GREEN = (0, 255, 0) # 绿色RGB常量
RED = (255, 0, 0) # 红石RGB常量
# 游戏初始化
pygame.init() # 初始化函数
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置界面宽高
pygame.display.set_caption('飞机大战(plane_war)') # 设置标题
clock = pygame.time.Clock() # 创建时钟对象
class Player(pygame.sprite.Sprite): # 创建玩家类
def __init__(self): # 初始化函数
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((50, 40)) # 将角色设置成一个长方形
self.image.fill(GREEN) # 填充颜色
self.rect = self.image.get_rect() # 获得轮廓
self.rect.centerx = WIDTH / 2 # 设置x中心
self.rect.bottom = HEIGHT - 20 # 底部坐标
self.speedx = 8 # 设置x速度
def update(self): # 位置更新
key_pressed = pygame.key.get_pressed() # 键状态的列表
if key_pressed[pygame.K_RIGHT] or key_pressed[pygame.K_d]: # 按下右方向键向右移动
self.rect.x += self.speedx
if key_pressed[pygame.K_LEFT] or key_pressed[pygame.K_a]: # 按下左方向键向左移动
self.rect.x -= self.speedx
if self.rect.right > WIDTH: # 检测是否超过右边缘
self.rect.right = WIDTH # 条件达成则回到右边缘
if self.rect.left < 0: # 检测是否超过左边缘
self.rect.left = 0 # 条件达成则回到左边缘
class Rock(pygame.sprite.Sprite): # 创建陨石 类
def __init__(self): # 初始化函数
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((30, 30)) # 将角色设置成一个长方形
self.image.fill(RED) # 填充颜色
self.rect = self.image.get_rect() # 获得轮廓
self.rect.x = random.randrange(0, WIDTH - self.rect.width) # 设置陨石掉下来的x
self.rect.y = random.randrange(-100, -40) # 设置陨石初始y
self.speedy = random.randrange(2, 10) # 随机设置掉下速度
self.speedx = random.randrange(-3, 3) # 随机左右移动
def update(self): # 位置更新
self.rect.y += self.speedy # 陨石不断增加y坐标
self.rect.x += self.speedx # 陨石不断更新x坐标
if self.rect.top > WIDTH or self.rect.left > WIDTH or self.rect.right < 0: # 判断轮廓超出边缘就重新回到上面
self.rect.x = random.randrange(0, WIDTH - self.rect.width) # 设置陨石掉下来的x
self.rect.y = random.randrange(-100, -40) # 设置陨石初始y
self.speedy = random.randrange(2, 10) # 随机设置掉下速度
self.speedx = random.randrange(-3, 3) # 随机左右移动
all_sprites = pygame.sprite.Group() # 创建角色表
player = Player() # 创建玩家类对象
all_sprites.add(player) # 将创建的玩家类对象放入角色列表
for item in range(25): # 循环25次
rock = Rock() # 创建陨石对象
all_sprites.add(rock) # add:增加,将陨石对象加进角色列表
running = True # 定义工具变量用于控制循环
while running: # 主循环,循环至关闭窗口
clock.tick(60) # 设置帧数
for event in pygame.event.get(): # 获取事件
if event.type == pygame.QUIT: # 判断是否为事件
running = False # 如果是,则将变量设为False,停止循环
all_sprites.update() # 调用角色池里面的位置更新方法
screen.fill(WHITE) # 设置窗口界面颜色,显示画面
all_sprites.draw(screen) # 绘制角色
pygame.display.update() # 更新状态
pygame.quit() # 退出