#背景,音乐等位置用a,b,c,d 表示,直接修改abcd对应的文件位置即可使用
# 与敌机相撞后会扣分,但未编写复活,或无敌,在扣分判定范围内持续扣分
#路径为绝对路径可自行更改为相对路径
a = 'C:\\Users\\MI\Desktop\\fly\\resource\\ufo.png' # UFO即为界面左上角图片
y = 'C:\\Users\\MI\Desktop\\fly\\resource\\bg.png' # 背景图片
c = 'C:\\Users\\MI\Desktop\\fly\\resource\\player.png' # 玩家飞机
d = 'C:\\Users\MI\\Desktop\\fly\\resource\\beijing.mp3' # 背景音乐
x = 'C:\\Users\\MI\Desktop\\fly\\resource\\exp.wav' # 击中音效
f = 'C:\\Users\\MI\\Desktop\\fly\\resource\\enemy.png' # 敌人图片
g = 'C:\\Users\\MI\\Desktop\\fly\\resource\\bullet.png' # 子弹图片
h = 'C:\\Users\\MI\\Desktop\\fly\\resource\\laser.wav' # 发射音效
import random as rand
from math import sqrt
import pygame
import time
#********* 初始化游戏 *********
pygame.init()
screen = pygame.display.set_mode((800, 600,)) # 输出框大小
pygame.display.set_caption('黄皓打飞机')
icon = pygame.image.load(a) # 输出框位置以及名称 这是 a 对应 ufo
bgImg = pygame.image.load(y) # 这是 y 对应 bg
playerImg = pygame.image.load(c) # 这是 c 对应 player
pygame.display.set_icon(icon) # 修改左上角显示窗口图标
score = 0
#********* 玩家定义 ***********
playerX = 370 # 定义角色初始位置
playerY = 500
playerStepX = 0 # 定义玩家移动速度
playerStepY = 0
#********* 距离检测 *********
def distance(bx, by, ex, ey):
m = bx - ex
n = by - ey
return sqrt(m * m + n * n)
# 音效
# 添加背景音效
pygame.mixer.music.load(d) # 这是 d 对应 beijing
pygame.mixer.music.play(-1)
# 添加击中音效
hit_sound = pygame.mixer.Sound(x) # 这是 x 对应 exp
#添加发射音效
biu_sound = pygame.mixer.Sound(h) # 这是 h 对应 laser
# 定义游戏结束
is_over = False
def game_over():
global score
if is_over:
over_font = pygame.font.Font('freesansbold.ttf', 64) # 由于font(字体)之间相互影响 所以将font 改名为 over_font
teat = "Game over"
tebt = f"Score: {score}"
tedt = "Boy, you're playing with fire" # -500 之下
teet = "emm, Handicapped party real hammer" # -100分之下
teft = "Weak explosion, don't play" # 0 到 -100
tegt = "Plane vs True Love Party" # 0-20
teht = "It's a pity not to attack the plane" # 20-40
teit = "Big guy, please accept my knees !!!!"
game_over_color = over_font.render(teat, True, (0, 255, 255)) # 三原色 0-255
score_colors = font.render(tebt, True, (0, 255, 255)) # 使用font 与上一行对比
tedt_colors = font.render(tedt, True, (0, 255, 255)) # 使用font 与上一行对比
teet_colors = font.render(teet, True, (0, 255, 255))
teft_colors = font.render(teft, True, (0, 255, 255))
tegt_colors = font.render(tegt, True, (0, 255, 255))
teht_colors = font.render(teht, True, (0, 255, 255))
teit_colors = font.render(teit, True, (0, 255, 255))
screen.blit(game_over_color, (250, 200))
screen.blit(score_colors, (330, 280))
if score < -500:
screen.blit(tedt_colors, (220, 320))
elif -100 >= score >= -500:
screen.blit(teet_colors, (130, 320))
elif 0 >= score >= -100:
screen.blit(teft_colors, (220, 320))
elif 20 >= score >= 0:
screen.blit(tegt_colors, (230, 320))
elif 60 >= score >= 20:
screen.blit(teht_colors, (180, 320))
elif score >= 60:
screen.blit(teit_colors, (150, 330))
# score = 0 # 游戏分数分数显示
#font = pygame.font.SysFont("simsunnsimsun", 32) # 使用宋体
font = pygame.font.Font('freesansbold.ttf', 32)
def score_show():
tect = f"Score: {score}" # f 去掉{}
if t3-t1 <= timer:
score_color = font.render(tect, True, (0, 255, 255)) # 三原色 0-255
screen.blit(score_color, (10, 10))
# ******* 计时器 **********
def time_show():
global is_over
page = f"Time: {round(t3-t1,2)}" # 相减得出游戏运行时间
if t3-t1 <= timer:
time_color = font.render(page, True, (0, 255, 0)) # 三原色 font 是字体 不支持汉字显示
screen.blit(time_color, (10, 50))
if t3-t1 >= timer:
is_over = True
enemy.clear()
pygame.mixer.music.play()
#**** 敌人初始化 ******
enemy_number = 6
class Enemy:
def __init__(self):
self.img = pygame.image.load(f) # 这是 f 对应 enemy
self.x = rand.randint(0, 750)
self.y = rand.randint(0, 350)
self.speed_x = rand.randint(2, 4)
self.speed_y = rand.randint(20, 60)
def reset(self):
self.x = rand.randint(0, 750)
self.y = rand.randint(0, 500)
enemy = []
for i in range(enemy_number):
enemy.append(Enemy())
def enemy_show():
for e in enemy:
screen.blit(e.img, (e.x, e.y))
e.x += e.speed_x
if e.x <= 0 or e.x >= 750:
e.speed_x *= -1
e.y += e.speed_y
if e.y >= 530:
e.y -= 30
e.speed_y *= -1
if e.y <= 0:
e.y += 30
e.speed_y *= -1
#*** 子弹初始化 ******
class Bullet:
def __init__(self):
self.img = pygame.image.load(g)
self.x = playerX + 15
self.y = playerY - 18
# self.speed_x = rand.randint(2, 4)
self.speed_y = 3
def hit(self):
global score
for e in enemy:
if distance(self.x, self.y, e.x, e.y) < 20:
hit_sound.play()
bullet.remove(self)
e.reset()
score += 2
bullet = []
def bullet_show():
for b in bullet:
if t3 - t1 <= timer:
screen.blit(b.img, (b.x, b.y))
b.hit()
b.y -= b.speed_y
if b.x <= 0:
bullet.remove(b)
def process_event(): # 定义进程模块
global playerStepX, running, playerStepY, bullet, score # 函数内部调用全局变量
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
playerStepX = 3
elif event.key == pygame.K_LEFT:
playerStepX = -3
elif event.key == pygame.K_UP:
playerStepY = -3
elif event.key == pygame.K_DOWN:
playerStepY = 3
elif event.key == pygame.K_SPACE: # 空格
if t3 - t1 <= timer: # 时间超过则停止音效
biu_sound.play()
bullet.append(Bullet())
score -= 1
if event.type == pygame.KEYUP:
playerStepX = 0
playerStepY = 0
def player_move(): # 角色移动范围限制
global playerX, playerY, score
run = True
if run:
screen.blit(playerImg, (playerX, playerY))
playerX += playerStepX
playerY += playerStepY
if playerX >= 740:
playerX = 740
elif playerX <= 0:
playerX = 0
if playerY <= 0:
playerY = 0
elif playerY >= 530:
playerY = 530
for e in enemy:
if distance(playerX, playerY, e.x, e.y) < 25:
score -= 3
# screen.blit(playerImg, (370, 500))
#enemy.clear()
# 游戏主循环
running = True
t1 = time.time()
while running:
t3 = time.time()
timer = 120
screen.blit(bgImg, (0, 0))
score_show() # 显示分数
time_show() # 显示时间
enemy_show() # 显示敌人
process_event() # 控制按键
player_move() # 玩家移动
bullet_show() # 显示子弹
game_over()
pygame.display.update()
参考bilibili 博主,界面素材取自该博主,后自己加以改动,可以根据自身需求向该博主自己领取素材,后自己加以改动,侵权请联系删除。【Python游戏】1小时开发飞机大战游戏-Pygame版本【课程编号210】_哔哩哔哩_bilibili