使用pygame开发飞机大战小游戏

使用pygame开发飞机大战小游戏

1,开发环境和工具

操作系统:Windows10
python版本:python3.10,如果没有下载可以点击这里下载,开发工具:PyCharm,下载PyCharm

2,飞机大战小游戏源代码

# 导入pygame
import pygame
# 导入random
import random
# 导入math
import math

"""
初始化界面
"""
# 初始化pygame
pygame.init()
# 设置宽高
screen = pygame.display.set_mode((800, 600))
# 设置标题
pygame.display.set_caption("飞机小游戏")

# 加载icon
icon = pygame.image.load("ufo.png")
# 设置icon
pygame.display.set_icon(icon)

# 加载背景图
bgImg = pygame.image.load("bg.png")

# 添加背景音乐
pygame.mixer.music.load("bg.wav")
# 单曲循环
pygame.mixer.music.play(-1)

# 添加射中音效
bao_sound = pygame.mixer.Sound("exp.wav")

# 加载飞机
player = pygame.image.load("player.png")
# 飞机默认横坐标
playerX = 350
# 飞机默认纵坐标
playerY = 500
# 飞机默认最开始不动
player_step = 0

# 分数
score = 0
# 创建字体,用来渲染文字
font = pygame.font.Font("freesansbold.ttf", 32)


def show_score() -> None:
    """
    显示分数
    """
    # 要渲染的文字
    text = f"score:{score}"
    score_render = font.render(text, True, (255, 255, 255))
    screen.blit(score_render, (10, 10))


# 游戏结束,默认游戏未结束
is_over = False
# 创建字体,用来渲染文字
font_1 = pygame.font.Font("freesansbold.ttf", 64)


def check_is_over() -> None:
    """
    检查游戏是否结束,并给出提示
    """
    if is_over:
        text = "Game Over"
        render = font.render(text, True, (255, 0, 0))
        screen.blit(render, (220, 220))


# 默认敌人个数
number_of_enemies = 6


# 敌人类
class Enemy:
    def __init__(self):
        """
        初始化敌人类
        """
        # 加载敌人图片
        self.enemyImage = pygame.image.load("enemy.png")
        # 敌人默认X坐标,坐标随机
        self.enemyX = random.randint(200, 600)
        # 敌人默认Y坐标, 坐标随机
        self.enemyY = random.randint(50, 200)
        # 敌人默认移速,移速随机
        self.enemy_step = random.randint(1, 3)

    def reset(self):
        """
        射中了,恢复原来的位置
        :return:
        """
        self.enemyX = random.randint(200, 600)
        self.enemyY = random.randint(50, 200)


# 存储敌人
enemies: list[Enemy] = []
for i in range(number_of_enemies):
    # 添加敌人进列表
    enemies.append(Enemy())


# 子弹类
class Bullets:
    def __init__(self):
        """
        初始化子弹类
        """
        # 加载子弹图片
        self.bullet_image = pygame.image.load("bullet.png")
        # 子弹X坐标
        self.bulletX = playerX + 16
        # 子弹Y坐标
        self.bulletY = playerY + 10
        # 子弹移速
        self.bullet_step = 7

    def hit(self):
        global score
        """
        子弹打击敌人
        """
        # 循环判断每一个敌人的距离
        for e in enemies:
            # 距离小于30
            if distance(self.bulletX, self.bulletY, e.enemyX, e.enemyY) < 30:
                # 播放射中音乐
                bao_sound.play()
                # 射中了
                bullets.remove(self)
                # 重置敌人
                e.reset()
                # 分数加一
                score += 1


# 保存现有的子弹
bullets: list[Bullets] = []


def process_event() -> None:
    """
    处理事件
    """
    # 提升变量作用域
    global running
    global player_step

    # 获取事件
    for event in pygame.event.get():
        # 判断事件是否是退出事件
        if event.type == pygame.QUIT:
            # 是就退出循环
            running = False
        # 判断键盘是否按下
        if event.type == pygame.KEYDOWN:
            # 按下的键是否为右键
            if event.key == pygame.K_RIGHT:
                # 是就向右移动飞机
                player_step = 3
            # 否则如果是左键
            elif event.key == pygame.K_LEFT:
                # 就向左移动飞机
                player_step = -3
            # 如果是空格键就发射子弹
            elif event.key == pygame.K_SPACE:
                # 创建子弹并加载到里面
                bullets.append(Bullets())
        # 判断键盘是否没按
        if event.type == pygame.KEYUP:
            # 键盘抬起,飞机不动
            player_step = 0


def move_player() -> None:
    """
    移动飞机
    """
    # 提升变量作用域
    global playerX

    # 移动飞机
    playerX += player_step
    """
    防止飞机出界
    """
    if playerX > 736:
        playerX = 736
    if playerX < 0:
        playerX = 0


def show_enemy() -> None:
    global is_over
    """
    显示敌人
    """
    for e in enemies:
        # 加载敌人
        screen.blit(e.enemyImage, (e.enemyX, e.enemyY))
        # 移动敌人
        e.enemyX += e.enemy_step
        # 判断敌人是否出界
        if e.enemyX > 736 or e.enemyX < 0:
            # 如果出界就让敌人反方向移动
            e.enemy_step *= -1
            # 并且敌人向下移动
            e.enemyY += 40
            # 如果敌人到达这个位置即游戏结束
            if e.enemyY > 450:
                is_over = True
                # 清除敌人
                enemies.clear()


def emission_bullet() -> None:
    """
    发射子弹
    """
    for b in bullets:
        # 加载子弹
        screen.blit(b.bullet_image, (b.bulletX, b.bulletY))
        # 是否击中
        b.hit()
        # 发射子弹
        b.bulletY -= b.bullet_step
        # 判断子弹是否离开界面
        if b.bulletY < 0:
            # 移除子弹
            bullets.remove(b)


def distance(bx: int, by: int, ex: int, ey: int) -> float:
    """
    计算两个点之间的距离
    :param bx 子弹横坐标
    :param by 子弹纵坐标
    :param ex 敌人横坐标
    :param ey 敌人纵坐标
    :return:返回距离值
    """
    # 求横模
    x = bx - ex
    # 求纵模
    y = by - ey
    return math.sqrt(x ** 2 + y ** 2)


# 游戏主循环
running = True
while running:
    # 填充背景
    screen.blit(bgImg, (0, 0))
    # 显示分数
    show_score()
    # 处理事件
    process_event()
    # 设置飞机初始位置
    screen.blit(player, (playerX, playerY))
    # 移动飞机
    move_player()
    # 显示敌人
    show_enemy()
    # 发射子弹
    emission_bullet()
    # 检查游戏是否结束
    check_is_over()
    # 更新display
    pygame.display.update()

下载源代码
提取码: 43ee

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草莓小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值