使用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