音效:
引入游戏背景音效和敌人爆炸的音效,并且使背景音乐单曲循环
# 新增 引入音效
pygame.mixer.music.load("game_music.ogg")
# 新增 背景音单曲循环
pygame.mixer.music.play(-1)
# 新增 添加敌人爆炸的音效
exp_sound = pygame.mixer.Sound("exp.wav")
当敌人爆炸时播放敌人爆炸音效
# 定义击中的函数
def hit(self):
# 判断是否射中敌人
for e in enemies:
if distance(self.x,self.y,e.x,e.y)<30:
# 当击中敌人则移除子弹
bullets.remove(self)
# 当击中敌人则调用reset函数将敌人位置重置
e.reset()
# 新增 播放爆炸音效
exp_sound.play()
积分:
创建 score 变量用于记录得分,创建显示得分的函数
# 新增 定义分数变量
score = 0
# 新增 创建字体,使用 pygame 自带的字体(freesansbold.ttf 是字体名称,ttf 是字体格式,32 是字体大小)
font = pygame.font.Font("freesansbold.ttf",32)
# 新增 显示分数的函数
def show_score():
# 新增 输入的文字
text=f"Score:{score}"
# 新增 创建显示文字的变量 True是开启抗锯齿
score_render=font.render(text ,True,(0,225,0) )
# 新增 显示文字
screen.blit(score_render,(10,10))
# 定义击中的函数
def hit(self):
# 新增 将score设置为全局变量
global score
# 判断是否射中敌人
for e in enemies:
if distance(self.x,self.y,e.x,e.y)<30:
# 当击中敌人则移除子弹
bullets.remove(self)
# 当击中敌人则调用reset函数将敌人位置重置
e.reset()
# 新增 播放爆炸音效
exp_sound.play()
# 新增 当击中时加分
score += 1
print (score)
游戏结束:
与积分同理,用变量控制游戏结束的状态,用函数显示 game over 的提示文字
当敌人和玩家在同一水平线上则游戏结束并清空所有敌人
# 新增 游戏结束
is_over = False
over_font = pygame.font.Font("freesansbold.ttf",64)
# 新增 表示游戏结束的函数
def check_is_over():
# 新增 将is_over设置为全局变量
global is_over
# 新增 进行判断is_over是否为True
if is_over == True:
# 新增 输入的文字
text="game over"
# 新增 创建显示文字的变量 True是开启抗锯齿
render=font.render(text ,True,(225,0,0) )
# 新增 显示文字
screen.blit(render,(200,300))
# 定义显示敌人的函数
def show_enemy():
# 新增 将is_over设置为全局变量
global is_over
# 循环控制所有敌人的显示、移动、边界反弹
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 += 60
if e.x < 0:
e.step *= -1
e.y += 60
# 控制边界
if e.y > 572:
e.y = 572
if e.y < 0:
e.y = 0
# 新增 当敌人和玩家在同一高度时清空所有敌人并将is_over值变为True
if e.y > 370:
is_over=True
enemies.clear()
完整代码:
# 引用 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
# 新增 引入背景音效
pygame.mixer.music.load("game_music.ogg")
# 新增 背景音乐单曲循环
pygame.mixer.music.play(-1)
# 新增 添加敌人爆炸的音效
exp_sound = pygame.mixer.Sound("exp.wav")
# 新增 定义分数变量
score = 0
# 新增 创建字体,使用 pygame 自带的字体,(freesansbold.ttf 是字体名称,ttf 是字体格式,32 是字体大小)
font = pygame.font.Font("freesansbold.ttf", 32)
# 新增 游戏结束
is_over = False
over_font = pygame.font.Font("freesansbold.ttf", 64)
# 新增 显示分数的函数
def show_score():
# 新增 输入的文字
text = f"Score:{score}"
# 新增 创建显示文字的变量 True是开启抗锯齿
score_render = font.render(text, True, (0, 225, 0))
# 新增 显示文字
screen.blit(score_render, (10, 10))
# 新增 表示游戏结束的函数
def check_is_over():
# 新增 将is_over设置为全局变量
global is_over
# 新增 进行判断is_over是否为True
if is_over == True:
# 新增 输入的文字
text = "game over"
# 新增 创建显示文字的变量 True是开启抗锯齿
render = font.render(text, True, (225, 0, 0))
# 新增 显示文字
screen.blit(render, (200, 300))
# 定义敌人的类,其中包括图片(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, 360)
self.y = random.randint(50, 100)
# 定义变量表示敌人运动速度。注意:由于速度随机数为浮点型,使用 random.uniform 函数生成
self.step = random.uniform(0.05, 0.3)
# 定义重置敌人位置的函数
def reset(self):
# 重复显示敌人的操作
self.x = random.randint(100, 360)
self.y = random.randint(50, 60)
# 定义子弹的类,其中包括图片(self.img)初始位置( self.x,self.y )运动速度(self.step)
class Bullet:
def __init__(self):
self.img = pygame.image.load('bullet.png')
# 将子弹显示在玩家上方
self.x = playerX + 48
self.y = playerY + 5
# 定义变量表示子弹运动速度。
self.step = 1
# 定义击中的函数
def hit(self):
# 新增 将score设置为全局变量
global score
# 判断是否射中敌人
for e in enemies:
if distance(self.x, self.y, e.x, e.y) < 30:
# 当击中敌人则移除子弹
bullets.remove(self)
# 当击中敌人则调用reset函数将敌人位置重置
e.reset()
# 新增 播放爆炸音效
exp_sound.play()
# 新增 当击中时加分
score += 1
print(score)
# 保存现有的子弹
bullets = []
# 创建列表保存创建的 number_of_enemies 个敌人
enemies = []
for i in range(number_of_enemies):
# 每循环一次创建一个敌人保存到列表中
enemies.append(Enemy())
# 欧式距离计算函数
def distance(bx, by, ex, ey):
a = bx - ex
b = by - ey
# 返回两者距离值
return (a ** 2 + b ** 2) ** 0.5
# 定义显示敌人的函数
def show_enemy():
# 新增 将is_over设置为全局变量
global is_over
# 循环控制所有敌人的显示、移动、边界反弹
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 += 60
if e.x < 0:
e.step *= -1
e.y += 60
# 控制边界
if e.y > 572:
e.y = 572
if e.y < 0:
e.y = 0
# 新增 当敌人和玩家在同一高度时清空所有敌人并将is_over值变为True
if e.y > 370:
is_over = True
enemies.clear()
# 定义显示子弹的函数
def show_bullet():
# 循环控制所有子弹的显示、移动和删除
for b in bullets:
# 使子弹出现在(b.x,b.y)的位置
screen.blit(b.img, (b.x, b.y))
# 调用hit函数判断子弹是否击中敌人
b.hit()
# 使子弹向上移动
b.y -= b.step
# 判断子弹是否出界,是则移除
if b.y < 0:
bullets.remove(b)
running = True
# 进行循环 游戏主循环
while running:
# 绘制背景
screen.blit(bgImg, (0, 0))
# 新增 显示分数
show_score()
# 绘制玩家
screen.blit(playerImg, (playerX, playerY))
# 调用显示敌人函数
show_enemy()
# 显示子弹
show_bullet()
# 新增 检测游戏是否结束
check_is_over()
# 获取游戏事件队列中的所有事件(涉及到玩家的各种交互,如鼠标点击、键盘操作、窗口事件等)
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
# 判断按下空格键
elif event.key == pygame.K_SPACE:
# 创建一颗子弹
bullets.append(Bullet())
# 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()
运行效果如下:
用 pygame 实现打飞机小游戏的学习笔记到此结束。
相关学习资料:1小时开发飞机大战游戏
来源链接:https://www.cnblogs.com/cyber120/p/19021566
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容