❤️❤️❤️情人节必备,和女友一起玩新版飞机大战!万字只为你❤️❤️❤️收藏起来吧(代码片段)

是Dream呀 是Dream呀     2022-12-19     431

关键词:

🐲情人节必备,和女友一起玩新版飞机大战!


👻👻👻hello大家好,我是Dream,今天我又来了,带着我研究了一个星期的宝贝来了🤣🤣🤣好了,进入今天的主题: 用pygame重新定义飞机大战,请大家前排就坐!!

💦成果展示!

🚀这是展示的图片,是不是很好奇呀,先别着急,先给个点赞+收藏呗,接下来我们一起开淦!

💦应用知识

⭐️在这里我们主要用到了Python中的pygame模块来实现的,同时应用了random和math以及win32com.client库
⭐️为确保游戏平衡,我们设定了如下规则:
☀️1.设置三款子弹,分别是轻型子弹,重型子弹和全屏子弹,其中:
轻型子弹每次在屏幕中只能同时存在三枚,数量不受限,只能打一个目标;
重型子弹最多可以打11枚,每次可以攻击多个目标;
全屏子弹总共有两发,全屏受到攻击
☀️2.在这里我设置了新的图标,设定两位敌人,分别是我们熟悉的小伙伴。

☀️3.我们自由操控战斗机进行左右上下移动,通过子弹消灭敌机进行得分,只要敌机不飞到游戏屏幕低端游戏便可以继续下去!

💦游戏特色

👑1.“帅气的背景图片”,可以看到这背景图非常的贴近主题呀:

👑2.有趣的角色设定,让我们帅气吴兄担任被打的角色,实属大快人心

👑3.好玩搞笑的语音:
大碗牢饭作为背景音乐,实属增加欢快的气氛;
每次不同子弹击落不同的敌人会有不同的搞笑语音发出

👑4.子弹种类的不同和分数的设定又为游戏提供了操作性空间

💦代码展示和说明

🚩这个游戏的代码我总共写了四百多行吧,花了一周左右的时间,反复改了很多次,就是希望把最好的带给大家❤️❤️❤️

🐹背景设定

这里用pygame.image.load实现背景的选取;pygame.mixer.music.load完成背景音乐的制作;以及font.render完成字体的设定,注释详细,大家可以慢慢看:

import pygame
import random
import math  # 数学模块
import win32com.client as win

speak = win.Dispatch("SAPI.SpVoice")
# 初始化界面
pygame.init()
# 设置窗口大小
windows = pygame.display.set_mode((800, 700))
# 设置窗口标题
pygame.display.set_caption("吴亦凡版打飞机")
# 引入图片 logo
icon = pygame.image.load('吴亦凡.png')
pygame.display.set_icon(icon)

# 4.游戏获取背景
bgcolor = pygame.image.load('监狱3.png')
# 5.设置玩家飞机
playerimg = pygame.image.load('我的飞机.png')
X = 350  # 设置玩家X轴
Y = 480  # 设置玩家Y轴
# 停止移动就可以将palyerStep改为0。控制一个变量来指定飞机指定移动
plagerStep = 0
playerStep=0

# 添加背景音乐
pygame.mixer.music.load('大碗牢饭.mp3')
pygame.mixer.music.play(loops=0, start=20)
pygame.mixer.music.set_volume(0.3)
# 添加射中的音效
# bao_music = pygame.mixer.Sound('卧槽.mp3')
# bao_music.set_volume(1)
# bao_music.play()


# 分数
score = 0
# 添加字体和大小
font = pygame.font.Font('simkai.ttf', 32)


# 字体类
def show_score():
    # 显示的文字
    text = f"Score:score"

    # 渲染然后显示 显示text True表示24位的字
    score_render = font.render(text, True, (0, 255, 0))
    # 指定字体放到那个位置
    windows .blit(score_render, (10, 10))
    text = f"Bigbullets:len(Bullets)"

    # 渲染然后显示 显示text True表示24位的字
    score_render = font.render(text, True, (0, 255, 0))
    # 指定字体放到那个位置
    windows.blit(score_render, (10, 50))



# 游戏结束的变量
over = False
over_font = pygame.font.Font('simkai.ttf', 64)


# 结束的提示语
def check_over():
    if over:
        bgcolor = pygame.image.load('吴亦凡.webp')
        windows.blit(bgcolor, (175, 150))
        my_font = pygame.font.SysFont("simkai.ttf", 100)
        text = "Game over"
        render =my_font.render(text, True, (255, 0, 0),(0, 255, 0))
        windows.blit(render, (200, 50))
        defeat_music = pygame.mixer.Sound('卧槽.mp3')
        defeat_music.set_volume(0.5)
        defeat_music.play()

🐹敌人设定

🏃这里完成对敌人类的编写,pygame.image.load制作出敌人的外形; enemis = [] 以列表来储存产生的敌机,在之后便于对敌机状态的操作;
a = bx - ex
b = by - ey
return math.sqrt(a * a + b * b) # 开根号

🏃这里运用数学知识,根据三角形两边长求斜边的长度,算出斜边的长度代表子弹敌人间的距离,从而实现撞击爆炸功能;

# 敌人类
class Enemy:
    def __init__(self):
        #
        self.img = pygame.image.load('凡哥.jpg')
        self.x = random.randint(200, 600)  # 随机产生X
        self.y = random.randint(50, 250)  # 随机产生Y
        self.step = random.randint(2, 4)  # 随机产生速度

    # 当被射中时恢复位置
    def reset(self):
        self.x = random.randint(200, 600)
        self.y = random.randint(50, 180)
class Enemy1:
    def __init__(self):
        self.img = pygame.image.load('田斌.jpg')
        self.x = random.randint(0, 600)  # 随机产生X
        self.y = random.randint(0, 250)  # 随机产生Y
        self.step = random.randint(2, 3)  # 随机产生速度

    # 当被射中时恢复位置
    def reset(self):
        self.x = random.randint(200, 600)
        self.y = random.randint(50, 180)


def distance(bx, by, ex, ey):
    a = bx - ex
    b = by - ey
    return math.sqrt(a * a + b * b)  # 开根号


# 保存所有的敌人
enemis = []
for i in range(6):  # 每次循环都都在class Enemy中过一边,所以随机产生一个敌人的参数并且保存到列表中
    enemis.append(Enemy())
# Enemis= []
# if len(Bullets)>25:
#     for i in range(6):
#         Enemis.append(Enemy1())
Enemis = []

# 显示敌人并且实现敌人的移动下沉
def enemy():  # 循环保存敌人的列表,每个敌人都过在这个for循环里被限制了移动的轨迹
    global over
    for e in enemis:
        windows.blit(e.img, (e.x, e.y))
        e.x += e.step
        if e.x > 750 or e.x < 0:  # 判断敌人是否到了边界
            e.step *= -1  # 敌人碰到界面往返
            e.y += 40  # 设置敌人往下沉
            # 判断敌人的位置如果到达指定的地方则游戏结束
            if e.y > 460:
                over = True
                print("游戏结束啦")
                enemis.clear()
def enemy1():  # 循环保存敌人的列表,每个敌人都过在这个for循环里被限制了移动的轨迹
    global over
    for e in Enemis:
        windows.blit(e.img, (e.x, e.y))
        e.x += e.step
        if e.x > 750 or e.x < 0:  # 判断敌人是否到了边界
            e.step *= -1  # 敌人碰到界面往返
            e.y += 40  # 设置敌人往下沉
            # 判断敌人的位置如果到达指定的地方则游戏结束
            if e.y > 460:
                over = True
                print("游戏结束啦")

🐹飞机设定

🏃这里实现对我们飞机移动范围的控制,使其移动范围适合我们屏幕的大小:
windows.blit(playerimg, (X, Y)) 定义其在X和Y轴进行移动;
if X > 680: 预防飞机出界

# 设置飞机及飞机移动范围的函数 == 飞机类型
def fiji_type():  # 设置飞机的坐标和飞机X Y轴最大的移动位置
    global X, Y
    # 5. 设置飞机
    windows.blit(playerimg, (X, Y))
    # 6.飞机移动
    X += plagerStep
    Y += playerStep
    # 预防飞机出界
    if X > 680:
        X = 680
    if X < 0:
        X = 0
    if Y> 640:
        Y = 640
    if Y< 0:
        Y = 0

🐹 子弹设定

🏃在这里我们设定出三款子弹,以及规定他们射击不同目标的得分和发出的声音:
self.img = pygame.image.load(‘giao.jpg’) 设定子弹的形状
if distance(self.x, self.y, e.x, e.y) < 300: 设定爆炸条件
bao_music = pygame.mixer.Sound(‘怕啥来啥.mp3’) 设定不同子弹击中目标的声音

class bigbig:
    def __init__(self):
        self.img = pygame.image.load('giao.jpg')
        self.x = X -180# 设置子弹的X轴
        self.y = Y + 5  # 子弹出现在玩家的上方
        self.step =6# 子弹移动的速度
    # 击中敌人
    def hit(self):
        global score
        for e in enemis:
            if distance(self.x, self.y, e.x, e.y) < 300:
                # 射中了
                # bullets.remove(self)
                e.reset()  # 重置敌人
                bao_music = pygame.mixer.Sound('怕啥来啥.mp3')
                bao_music.set_volume(0.3)
                bao_music.play()

                # 击中加10分c
                score += 20
        for e in Enemis:
            if distance(self.x, self.y, e.x, e.y) < 300:
                # 射中了
                # bullets.remove(self)
                e.reset()  # 重置敌人
                bao_music = pygame.mixer.Sound('怕啥来啥.mp3')
                bao_music.set_volume(0.3)
                bao_music.play()

                # 击中加10分
                score += 20
class bigbig1:
    def __init__(self):
        self.img = pygame.image.load('giao.jpg')
        self.x = X-30# 设置子弹的X轴
        self.y = Y + 5  # 子弹出现在玩家的上方
        self.step = 6 # 子弹移动的速度
    # 击中敌人
    def hit(self):
        global score
        for e in enemis:
            if distance(self.x, self.y, e.x, e.y) < 300:
                # 射中了
                # bullets.remove(self)
                e.reset()  # 重置敌人
                bao_music = pygame.mixer.Sound('怕啥来啥.mp3')
                bao_music.set_volume(0.3)
                bao_music.play()

                # 击中加10分
                score += 20
class bigbig2:
    def __init__(self):
        self.img = pygame.image.load('giao.jpg')
        self.x = X+120# 设置子弹的X轴
        self.y = Y + 5  # 子弹出现在玩家的上方
        self.step = 6# 子弹移动的速度
    # 击中敌人
    def hit(self):
        global score
        for e in enemis:
            if distance(self.x, self.y, e.x, e.y) < 300:
                # 射中了
                # bullets.remove(self)
                e.reset()  # 重置敌人
                bao_music = pygame.mixer.Sound('怕啥来啥.mp3')
                bao_music.set_volume(0.6)
                bao_music.play()

                # 击中加10分
                score += 20
class bigbig3:
    def __init__(self):
        self.img = pygame.image.load('giao.jpg')
        self.x = X+270# 设置子弹的X轴
        self.y = Y + 5  # 子弹出现在玩家的上方
        self.step = 6# 子弹移动的速度
    # 击中敌人
    def hit(self):
        global score
        for e in enemis:
            if distance(self.x, self.y, e.x, e.y) < 300:
                # 射中了
                # bullets.remove(self)
                e.reset()  # 重置敌人
                bao_music = pygame.mixer.Sound('怕啥来啥.mp3')
                bao_music.set_volume(0.6)
                bao_music.play()

                # 击中加10分
                score += 20


🐹攻击设定

🏃这里是不同子弹射击不同目标时的状态:

# 显示子弹移动
def show_bullets():
    for b in bullets:
        windows.blit(b.img, (b.x, b.y))
        b. hit()  # 查看是否击中了敌人
        b.y -= b.step  # 往上移动
        # 判断子弹是否出了界面
        if b.y < 0:
            bullets.remove(b)
    for c in Bullets:
        windows.blit(c.img, (c.x, c.y))
        c.hit()  # 查看是否击中了敌人
        c.y -= c.step  # 往上移动
        # 判断子弹是否出了界面
        # if c.y < 0:
        #     Bullets.remove(b)
    for d in big_bullets:
        windows.blit(d.img, (d.x, d.y))
        d.hit()  # 查看是否击中了敌人
        d.y -= d.step  # 往上移动
        # 判断子弹是否出了界面
        # if c.y < 0:
        #     Bullets.remove(b)

🐹游戏主程序

🏃这里是我们的主循环, if event.type == pygame.KEYDOWN: 实现键盘操控我们的飞机;
🏃**#飞机移动** :fiji_type()
🏃**#调用敌人这个函数** :enemy()enemy1()
🏃 # 显示子弹show_bullets()
🏃 # 游戏结束语check_over()
🏃 # 刷新更新数据pygame.display.update()

running = True
while running:
    # 4.背景
    # 每个循环是画一张画组成的
    # 画出来bgcolor
    windows.blit(bgcolor, (0, 0))
    # 调用这个字体
    show_score()
    # event.get操作事件
    for event in pygame.event.get():
        # 判断操作类型是不是QUIT
        if event.type == pygame.QUIT:
            # 如果程序为False就会停止则关闭
            running = False
        # 7.控制飞机的移动
        # 通过控制键盘的事件来控制(playerStep值)飞机的移动
        if event.type == pygame.KEYDOWN:
            # 判断按下键盘右键,按下则移动
            if event.key == pygame.K_RIGHT:
                plagerStep = 3
                # 判断按下左键
            elif event.key == pygame.K_DOWN:
                playerStep = 3
            elif event.key == pygame.K_UP:
                playerStep = -3
            elif event.key == pygame.K_LEFT:
                plagerStep = -3
            # 判断按下空格健的反应
            elif event.key == pygame.K_c:
                # 创建一个子弹
                if len(bullets)<3:
                    b = Bullet()
                    bullets.append(b)
            elif event.key == pygame.K_SPACE:
                if len (Bullets) >10:
                     bao_music = pygame.mixer.Sound('导师.mp3')
                     bao_music.set_volume(1 )
                     bao_music.play()   

                     Enemis.append(Enemy1())
                elif len(Bullets) <50:
                    c=BigBullet()
                    Bullets.append(c)
            elif event.key == pygame.K_v:
                if len(big_bullets) < 10:
                    c = bigbig()
                    d =bigbig1()
                    e=bigbig2()
                    f=bigbig3()
                    g=bigbig4()
                    big_bullets.append(c)
                    big_bullets.append(d)
                    big_bullets.append(e)
                    big_bullets.append(f)
                    big_bullets.append(g)

💦完整代码+解析+图片+音乐

这里是此程序所有需要的东西了,需要的小伙伴自取一下,可以直接拿去用:
用pygame重新定义飞机大战,搞笑+创新十足+源码解析图片音频+拿去直接用!
快给你的小伙伴们露两手吧!

🐸最后的福利

⚽️⚽️⚽️最后一点小福利带给大家:如果想快速上手python的小伙伴们,这个详细整理PPT可以迅速帮助大家打牢python基础,需要的小伙伴们可以下载一下 Python入门基础教程全套+小白速成+学不会来找我!

好啦,这就是今天要给大家分享的全部内容了
如果你喜欢的话,就不要吝惜你的一键三连了~❤️❤️❤️

⭐️stl⭐️之list,set,map全解,❤️算法必备❤️<下>(代码片段)

文章目录😘闲聊几句👍list👍list的反转和排序👍set/multiset👍对组👍map/multimap❤️最后😘闲聊几句时间过的很快,码神马上就要开学了,这也是STL系列的最后一篇了,假期学了不少,... 查看详情

mysql--❤️‍几种启动和停止服务的风险分析☀️linux生产环境运维必备❤️‍《⭐建议收藏⭐》(代码片段)

您好,我是贾斯汀,欢迎进来学习的小伙伴~【学习背景】本文对Linux下启动和停止mysql服务最常用的几种方式进行讲解:(1)mysqld(2)mysqld_safe(3)mysql.server(4)mysqladmin关于这几种文... 查看详情

❤️一起谈一谈js中的宏任务和微任务!❤️

前面面试的文章中我们说过一道关于宏任务和微任务的题:setTimeout(function(){console.log('1')});newPromise(function(resolve){console.log('2');resolve();}).then(function(){console.log('3')});console.log('4')试问一下上面代码的执行顺序是啥 查看详情

❤️爬虫必备->selenium从黑铁到王者❤️初篇——万字博文详解(代码片段)

目录🎅第一部分——初识Selenium!🍏1.Selenium是什么?🍒2.运行环境🍓3.安装1️⃣安装selenium库:2️⃣安装ChromeDriver驱动:🍌4.selenium的作用和工作原理1️⃣作用:2️⃣工作原理:&#x 查看详情

git--❤️这些最基本和最常用的命令,你学废了吗?(新手必备❤️)(代码片段)

学习背景Git作为目前很多代码服务器(GitHub/GitLab/Gitee码云等)推行的版本控制工具,大大提高团队的开发效率,那么作为职场新人,有一些最基本和最常用的命令,是需要我们去掌握和了解一下的!&#x... 查看详情

❤️爬虫必备->selenium从黑铁到王者❤️初篇——万字博文详解(建议收藏)(代码片段)

目录🎅第一部分——初识Selenium!🍏1.Selenium是什么?🍒2.运行环境🍓3.安装1️⃣安装selenium库:2️⃣安装ChromeDriver驱动:🍌4.selenium的作用和工作原理1️⃣作用:2️⃣工作原理:&#x 查看详情

python小游戏——飞机大战代码开源(代码片段)

...,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生!♥️夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至。目录一.效果呈现 二,主代码三,cfg四,README... 查看详情

❤️爬虫必备->scrapy框架从黑铁到王者❤️初篇——万字博文详解(建议收藏)

目录 查看详情

csdn插件推荐-----❤️懒人必备❤️

前言:      插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。其只能运行在程序规定的系统平台下(可能同时支持多个平台),而不能脱离指定的平台单... 查看详情

前端小游戏——植物大战僵尸(代码片段)

给大家分享一个植物大战僵尸网页游戏源代码,感兴趣的小伙伴可收藏学习👉完整源码文章目录⌛️效果展示⌛️游戏介绍⌛️游戏内容(1)冒险模式(2)小游戏⌛️图片资源⌛️代码展示(1)H... 查看详情

esp保姆级教程玩转emqxmqtt篇②——保留消息和遗嘱消息

忘记过去,超越自己❤️博客主页单片机菜鸟哥,一个野生非专业硬件IOT爱好者❤️❤️本篇创建记录2023-02-18❤️❤️本篇更新记录2023-02-18❤️ 查看详情

2021最全算法和数据结构学习路线——java大厂面试必备❤️持续更新,建议收藏

...多家中大厂的万字总结📚《技术专家修炼》——高薪必备,企业真实场景📚《leetcode300题》——每天一道算法题,进大厂必备📚《糊涂算法》——数据结构+算法全面讲解📚《从实战学pyth 查看详情

网络总结知识点(网络工程师必备)三

♥️作者:小刘在C站♥️个人主页:小刘主页♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生!♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真... 查看详情

❤️git开发必备❤️.gitignore详解!建议收藏(代码片段)

🎈作者:Linux猿🎈简介:CSDN博客专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!🎈关注专栏:Linux (优质好文持续更新中……)🚀目录一、为... 查看详情

❤️《小黄鸭调试法》程序员必备技能!!!❤️

小黄鸭调试法场景一:我们都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题的经历,但是很多时候就在我们解释的过程中自己却想到了问题的解决方案,然后对方却一脸茫然。场景二:... 查看详情

网络总结知识点(网络工程师必备)四

♥️作者:小刘在C站♥️个人主页:小刘主页♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生!♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真... 查看详情

网络总结知识点(网络工程师必备)二

♥️作者:小刘在C站♥️个人主页:小刘主页♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生!♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真... 查看详情

java--☀️面试官:讲一下stringstringbuilder及stringbuffer区别?❤️‍⭐初学者面试必备⭐(代码片段)

哈喽,欢迎进来学习的小伙伴~【学习背景】本文会通过OpenJDK提供的Java性能测试工具JMH来测试下String、StringBuilder及StringBuffer拼接字符串的效率如何~关于JMH的介绍及具体使用,我的这篇博文中有介绍:Java–☀️面试官... 查看详情