# 这是一个提神醒脑的游戏!!!!!
# 成年人建议在小孩陪同下使用
#为了方便修改将敌人,背景,音乐等位置用a,b,c,d 表示,直接修改abcd对应的文件位置即可使用
#加一个斜杠 C:\Users\MI\Desktop\fly\resource 复制粘贴到pycharm再再后面补充一个\ufo.png或者其他即可
# a b c d 字母不要改!!
# 这个人很懒,与敌机相撞后会扣分,但是懒得编写复活,或者几秒无敌,如果一直在扣分判定范围内那么会一直扣分
a = 'C:\Users\MIDesktop\fly\resource\ufo.png' # UFO即为界面左上角图片
y = 'C:\Users\MIDesktop\fly\resource\bg.png' # 背景图片
c = 'C:\Users\MIDesktop\fly\resource\player.png' # 玩家飞机
d = 'C:\UsersMI\Desktop\fly\resource\beijing.mp3' # 背景音乐
x = 'C:\Users\MIDesktop\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 # 直接调用要使用的部分,在使用时直接使用sqrt() 无需math.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) # -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}" # f似乎是去掉{} 我的没安装宋体相关插件
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: # 能大于等于就不要等于,等于容易出bug
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 # 如果不减去30可能会出现值恰好等于530这样会出现e.speed_y反复变化出现bug从而部分敌人溢出界面
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) # 这是 g 对应 bullet
self.x = playerX + 15 # 子弹射出位置,与玩家x轴保持一致
self.y = playerY - 18 # 子弹y轴
# self.speed_x = rand.randint(2, 4) # 无需x轴变化,如果后期添加特殊弹可使用
self.speed_y = 3 # 子弹速度
# 击中
def hit(self): # 方法 的使用
global score
for e in enemy: # 使用enemy中存储的六名敌人
if distance(self.x, self.y, e.x, e.y) < 20: # 有一个bug同时两个或多个敌人在子弹判定范围内时同时消失有bug
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() # 判断是否击中,击中则调用 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