【Python 飞机大战】

#背景,音乐等位置用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值