pygame小游戏打飞机_5多个敌人


实现多个敌人同时来袭:

1.创建表示敌人数量的变量

# 新增 变量表示敌人数量
number_of_enemies = 6

2.定义表示敌人行动方式的类

注意:由于速度随机数为浮点型,使用 random.uniform 函数生成

# 新增 定义敌人的类,其中包括图片(self.img)初始位置( self.x,self.y )运动速度(self.step)
class Enemy:
    def __init__(self):
        self.img = pygame.image.load('enemy.png')
        # 通过 random 函数进行生成随机位置坐标
        self.x = random.randint(100, 380)
        self.y = random.randint(30, 70)
        # 新增 定义变量表示敌人运动速度。注意:由于速度随机数为浮点型,使用 random.uniform 函数生成
        self.step = random.uniform(0.05, 0.3)

3.创建列表,使用循环将多个敌人创建出来

# 新增 创建列表保存创建的 number_of_enemies 个敌人
enemies = []
for i in range(number_of_enemies):
    # 新增 每进行一次循环创建一个敌人保存到列表中
    enemies.append(Enemy())
    # 引入敌人图片
enemyImg = pygame.image.load('enemy.png')


# 定义显示敌人、控制敌人移动的函数
def show_enemy():
    # 新增 用循环将敌人绘制
    for e in enemies:
        # 使敌人出现在(enemyX, enemyY)的位置
        screen.blit(e.img, (e.x, e.y))
        # 使敌人飞机左右移动
        e.x += e.step
        # 控制敌人移动边界,当敌人碰到左右边界时反弹,当敌人运动到上下边界时停止
        if e.x > 378:
            e.step *= -1
            # 当碰到左右边界时下沉
            e.y += 20
        if e.x < 0:
            e.step *= -1
            e.y += 20
        # 控制边界
        if e.y > 572:
            e.y = 572
        if e.y < 0:
            e.y = 0

完整代码:

# 引用 pygame
import pygame
# 引用随机模块
import random

# 使程序初始化
pygame.init()
# 设置游戏窗口大小
screen = pygame.display.set_mode((480, 700))
# 设置标题
pygame.display.set_caption('打飞机')
# 设置游戏图标
icon = pygame.image.load('ufo.png')
pygame.display.set_icon(icon)
# 引入背景图片
bgImg = pygame.image.load('background.png')

# 引入玩家图片
playerImg = pygame.image.load('player.png')
# 定义玩家初始位置
playerX = 225
playerY = 450
# 定义变量表示玩家运动速度
playerStep = 0
# 新增 变量表示敌人数量
number_of_enemies = 6


# 新增 定义敌人的类,其中包括图片(self.img)初始位置( self.x,self.y )运动速度(self.step)
class Enemy:
    def __init__(self):
        self.img = pygame.image.load('enemy.png')
        # 通过 random 函数进行随机位置坐标生成
        self.x = random.randint(100, 380)
        self.y = random.randint(30, 70)
        # 新增 定义变量表示敌人运动速度。注意:由于速度随机数为浮点型,使用 random.uniform 函数生成
        self.step = random.uniform(0.05, 0.3)


# 新增 创建列表保存创建的 number_of_enemies 个敌人
enemies = []
for i in range(number_of_enemies):
    # 新增 每进行一次循环创建一个敌人保存到列表中
    enemies.append(Enemy())

# 定义显示敌人、控制敌人移动的函数
def show_enemy():
    # 新增 用循环将敌人绘制
    for e in enemies:
        # 使敌人出现在(enemyX, enemyY)的位置
        screen.blit(e.img, (e.x, e.y))
        # 使敌人飞机左右移动
        e.x += e.step
        # 控制敌人移动边界,当敌人碰到左右边界时反弹,当敌人运动到上下边界时停止
        if e.x > 378:
            e.step *= -1
            # 当碰到左右边界时下沉
            e.y += 20
        if e.x < 0:
            e.step *= -1
            e.y += 20
        # 控制边界
        if e.y > 572:
            e.y = 572
        if e.y < 0:
            e.y = 0


running = True
# 进行循环 游戏主循环
while running:
    # 绘制背景
    screen.blit(bgImg, (0, 0))
    # 绘制玩家
    screen.blit(playerImg, (playerX, playerY))
    # 调用显示敌人、控制敌人移动的函数
    show_enemy()
    # 获取游戏事件队列中的所有事件(涉及到玩家的各种交互,如鼠标点击、键盘操作、窗口事件等)
    for event in pygame.event.get():
        # 如果事件是QUIT事件,如点击窗口的关闭按钮,则退出循环
        if event.type == pygame.QUIT:
            # 退出循环
            running = False
        # KEYDOWN 判断键盘是否按下
        if event.type == pygame.KEYDOWN:
            # 判断按下左右键进行移动赋值
            if event.key == pygame.K_RIGHT:
                playerStep = 0.5
            elif event.key == pygame.K_LEFT:
                playerStep = -0.5
        # KEYUP 判断键盘是否抬起
        if event.type == pygame.KEYUP:
            # 抬起键盘时将移动距离改为 0
            playerStep = 0

    # 玩家左右移动
    playerX += playerStep
    # 控制玩家移动边界
    if playerX > 378:
        playerX = 378
    if playerX < 0:
        playerX = 0
    if playerY > 572:
        playerY = 572
    if playerY < 0:
        playerY = 0

    # 界面更新
    pygame.display.update()

运行效果如下: