【Python 飞机大战】

【Python 飞机大战】,第1张

#            这是一个提神醒脑的游戏!!!!!
#              成年人建议在小孩陪同下使用
#为了方便修改将敌人,背景,音乐等位置用a,b,c,d 表示,直接修改abcd对应的文件位置即可使用
#加一个斜杠 C:\\Users\\MI\\Desktop\\fly\\resource 复制粘贴到pycharm再再后面补充一个\\ufo.png或者其他即可
# a b c d  字母不要改!!
# 这个人很懒,与敌机相撞后会扣分,但是懒得编写复活,或者几秒无敌,如果一直在扣分判定范围内那么会一直扣分
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'  # 子d图片
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 = []  # 保存现有子d
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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/921026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存