用python实现简单的飞机大战小游戏

2023-11-04

1、下载一个包

PySide2-5.15.2.1-5.15.2-cp35.cp36.cp37.cp38.cp39.cp310-none-win_amd64

如果下载错误,就先下载shiboken2-5.15.2.1-5.15.2-cp35.cp36.cp37.cp38.cp39.cp310-none-win_amd64补丁,然后再下载Pyside2。

记得都放在同一个工程下。

2、准备好飞机大战中所需要的图片资源

(1)自身飞机

(2)飞机子弹

(3)背景

 

(4)敌机

 

将准备好的图片放入工程中的images文件夹中,且命名好

3、代码

我们一共准备六个模块

(1)主函数main模块.py

from PySide2 import QtCore, QtWidgets, QtGui
from settings import Settings
from map import Map
from hero import Hero
from enemy import Enemy
from random import randint

class MainScene(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.settings = Settings()
        self.setWindowTitle(self.settings.game_title)
        self.setWindowIcon(QtGui.QIcon(self.settings.game_ico))
        self.setFixedSize(self.settings.game_width, self.settings.game_height)

        self.map = Map() # 构造一个地图对象
        self.hero = Hero() # 构造一个英雄对象
        # 初始化敌机
        self.enemys = []
        self.enemy_interval = 0
        for i in range(self.settings.enemy_num):
            self.enemys.append(Enemy())

        self.timer_main = QtCore.QTimer(self)
        self.timer_main.setInterval(20)
        self.timer_main.timeout.connect(self.run)
        self.timer_main.start()

        self.presskeys = []
        self.timer_key = QtCore.QTimer(self)
        self.timer_key.setInterval(50)
        self.timer_key.timeout.connect(self.handleKey)
        

    def enemyToScene(self):
        self.enemy_interval += 1
        if self.enemy_interval < 30:
            return 
        self.enemy_interval = 0

        for i in range(self.settings.enemy_num):
            if self.enemys[i].free:
                self.enemys[i].free = False
                self.enemys[i].x = randint(0, self.settings.game_width-self.enemys[i].img.width())
                self.enemys[i].y = -self.enemys[i].img.height()   
                break     

    def collisionDetect(self):
        for i in range(self.settings.enemy_num):
            if self.enemys[i].free:
                continue

            for j in range(self.settings.bullet_num):
                if self.hero.bullets[j].free:
                    continue
                if self.enemys[i].rect.intersects(self.hero.bullets[j].rect):
                    self.enemys[i].free = True
                    self.hero.bullets[j].free = True


    def handleKey(self):
        x = self.hero.x 
        y = self.hero.y 
        if self.presskeys.count(QtCore.Qt.Key_Left) > 0:
            x -= self.hero.speed
        if self.presskeys.count(QtCore.Qt.Key_Right) > 0:
            x += self.hero.speed
        if self.presskeys.count(QtCore.Qt.Key_Space) > 0:
            self.hero.shoot()
        if self.presskeys.count(QtCore.Qt.Key_Q) > 0:
            self.close()

        self.hero.move(x, y)

    def keyPressEvent(self, event):
        '''按键按下时,自动调用此函数'''
        self.presskeys.append(event.key())
        if not self.timer_key.isActive():
            self.timer_key.start()

    def keyReleaseEvent(self, event):
        '''松开按键时,自动调用'''
        if self.timer_key.isActive() and len(self.presskeys) == 0:
            self.timer_key.stop()
            self.handleKey()
        
        while event.key() in self.presskeys:
            self.presskeys.remove(event.key())


    def updatePosition(self):
        self.map.move()
        '''更新子弹的位置'''
        for i in range(self.settings.bullet_num):
            if not self.hero.bullets[i].free:
                self.hero.bullets[i].move()
        '''更新敌机位置'''
        for i in range(self.settings.enemy_num):
            if not self.enemys[i].free:
                self.enemys[i].move()


    def run(self):
        self.enemyToScene()
        self.updatePosition()
        self.update()
        self.collisionDetect()


    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.drawPixmap(0, self.map.y1, self.map.img1)
        painter.drawPixmap(0, self.map.y2, self.map.img2)   
        painter.drawPixmap(self.hero.x, self.hero.y, self.hero.img)     
        '''绘制子弹'''
        for i in range(self.settings.bullet_num):
            if not self.hero.bullets[i].free:   
                painter.drawPixmap(self.hero.bullets[i].x, self.hero.bullets[i].y, self.hero.bullets[i].img)

        '''绘制敌机'''
        for i in range(self.settings.enemy_num):
            if not self.enemys[i].free:
                painter.drawPixmap(self.enemys[i].x, self.enemys[i].y, self.enemys[i].img)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    w = MainScene()
    w.show()

    app.exec_()

(2)资源调用模块setting.py

class Settings:
    def __init__(self):
        self.game_title = "python飞机大战"
        self.game_ico = r"D:\周末实训\飞机大战\images\app.ico"
        self.game_width = 512
        self.game_height = 700

        self.map_path = r"D:\周末实训\飞机大战\images\img_bg_level_2.jpg"
        self.map_speed = 2

        self.hero_path = r"D:\周末实训\飞机大战\images\hero2.png"
        self.hero_speed = 20

        self.bullet_path = r"D:\周末实训\飞机大战\images\bullet_11.png"
        self.bullet_speed = 10
        self.bullet_num = 10

        self.enemy_path = r"D:\周末实训\飞机大战\images\img-plane_5.png"
        self.enemy_speed = 3
        self.enemy_num = 10

(3)地图模块map.py

from PySide2 import QtGui
from settings import Settings


class Map:
    def __init__(self):
        self.settings = Settings()
        self.img1 = QtGui.QPixmap(self.settings.map_path)
        self.img2 = QtGui.QPixmap(self.settings.map_path)

        self.y1 = -self.settings.game_height
        self.y2 = 0

    def move(self):
        self.y1 += self.settings.map_speed
        if self.y1 >= 0:
            self.y1 = -self.settings.game_height

        self.y2 += self.settings.map_speed   
        if self.y2 >= self.settings.game_height:
            self.y2 = 0         


(4)自身飞机操作模块hero.py

from PySide2 import QtGui
from settings import Settings
from bullet import Bullet

class Hero:
    def __init__(self):
        self.settings = Settings()
        self.img = QtGui.QPixmap(self.settings.hero_path)
        self.x = self.settings.game_width*0.5 - self.img.width()*0.5
        self.y = self.settings.game_height - self.img.height()
        self.speed = self.settings.hero_speed

        # 创建一个弹夹,放入10颗子弹
        self.bullets = []
        for i in range(self.settings.bullet_num):
            self.bullets.append(Bullet())

    def move(self, x, y):
        '''飞机移动'''
        self.x = x 
        self.y = y

    def shoot(self):
        '''飞机发射子弹,按空格键时,调用此函数'''
        for i in range(self.settings.bullet_num):
            if self.bullets[i].free:
                self.bullets[i].free = False
                self.bullets[i].x = self.x + self.img.width()*0.5 - self.bullets[i].img.width()*0.5
                self.bullets[i].y = self.y - 30
                break

(5)发射子弹模块bullet.py

from PySide2 import QtGui
from settings import Settings

class Bullet:
    def __init__(self):
        self.settings = Settings()
        self.img = QtGui.QPixmap(self.settings.bullet_path)
        self.rect = self.img.rect()
        self.speed = self.settings.bullet_speed
        self.x = 0
        self.y = 0
        self.free = True

    def move(self):
        if self.free:
            return 
        
        self.y -= self.speed
        self.rect.moveTo(self.x, self.y)
        if self.y <= -self.rect.height():
            self.free = True

(6)敌机模块enemy.py

from PySide2 import QtGui
from settings import Settings

class Enemy:
    def __init__(self):
        self.settings = Settings()
        self.img = QtGui.QPixmap(self.settings.enemy_path)
        self.rect = self.img.rect()
        self.x = 0
        self.y = 0
        self.free = True
        self.speed = self.settings.enemy_speed

    def move(self):
        if self.free:
            return 
        self.y += self.speed
        self.rect.moveTo(self.x, self.y)
        if self.y >= self.settings.game_height:
            self.free = True

4、注意

代码没有问题,在同一工程目录下建6个.py文件然后将代码复制进去就行了

如果有报错,一般就是我上面说的包没有下载或者调用成功,

也可能是图片路径问题。

代码比较少,功能也不是很多,相比于正规游戏这个肯定是没得比的,如果有问题,还望各位大佬多加指点

操作方式:飞机方向由左右两键控制,空格发射子弹,Q退出游戏

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用python实现简单的飞机大战小游戏 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重

随机推荐

  • 数字电路设计之ARM m0进度(1)

    这个例子是用于测试我写的ARM这个内核 测试例子是一个求最大公约数和最小公倍数的程序 2014 10 21 1 已解决问题 LDR1这条指令的 10 i datain lt LDR1 5 b0000 1 gr0 gr2 LDR0 5 b01
  • Buildroot系列开发(五)bootloader简述

    参考 百问网 文章目录 1 什么是Boot loader 2 有哪些bootloader 哪些支持linux 3 Bootloader支持的Flash设备 4 Bootloader支持的文件系统类型 4 Bootloader支持的CPU架构
  • 【深度学习与计算机视觉】12、迁移学习

    文章目录 一 迁移学习简介 二 为什么要使用迁移学习 三 迁移学习的实现 四 迁移学习系统介绍 一 原始数据有标签 目标数据有标签 1 模型微调 model fine tune 也叫再优化 1 保守训练 Conservative Train
  • Nginx系列(十九):URI转义机制(部分转载)

    一 URI和特殊字符 源文档 https www cnblogs com upyun p 8267334 html 1 URI URI 全称是 Uniform Resource Identifiers 即统一资源标识符 用于在互联网上标识一
  • 【51单片机】LED模块和独立按键的使用

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 原理介绍
  • MIMO 从入门到精通 -科普篇 1 - 5G Massive MIMO

    参考 Our Technology Planet lt lt 5G Massive MIMO Made Simple Learn All About Massive MIMO Beam Forming In 30 minutes gt gt
  • ESP32 Wi-Fi & 蓝牙 Tx Power 调整方法

    此篇博客用来整理 ESP32 Wi Fi BLE 的 Tx Power 调整方法 此博客分为两部分 Wi Fi Tx Power 调整 BLE Tx Power 调整 BR EDR Tx Power 调整 注 当前使用 的 IDF comm
  • Kubeadm 安装 Kubernetes:kubelet 状态失败的解决方案

    Kubeadm 安装 Kubernetes kubelet 状态失败的解决方案 在使用 kubeadm 安装 Kubernetes 集群时 遇到 kubelet 状态失败的问题是比较常见的 这个问题主要出现在 kubelet 无法正常启动或
  • 如何查看微信image/*.dat文件

    背景 起因我是想看看能不能获取的到撤回的图片 于是在 WeChat Files FileStorage Image这个文件下发现了聊天记录储存的文件 却发现文件已被加密 也就有了这篇文章 关于撤回的图片这个问题 结论是获取不到 聊天记录里加
  • Apk脱壳圣战之—如何脱掉“梆梆加固”的保护壳

    一 前言 现如今Android用户的安全意识不是很强 又有一些恶意开发者利用应用的名字吸引眼球 包装一个恶意锁机收费的应用 在用户被骗的安装应用之后 立马手机锁机 需要付费方可解锁 这样的恶意软件是非常让人痛恨的 所以本文就用一个案例来分析
  • HIT-ICS2020大作业

    doc排版转换成md太恶心了 图片三四十张 推荐下载我上传的资源查看 https download csdn net download ggtged 12469782 计算机系统大作业 题 目 程序人生 Hello s P2P 专 业 人工
  • chatpdf+mindshow由论文pdf直接生成报告PPT,拯救研究牲

    chatpdf mindshow由论文pdf直接生成报告PPT 拯救研究牲 感谢AIGC技术 现在可以从论文的pdf直接生成展示的PPT STEP1 STEP2 最终效果预览 步骤 STEP1 论文PDF到PPT的markdown格式 ch
  • 配置Log4j

    来自 http www blogjava net zJun archive 2006 06 28 55511 html Log4J的配置文件 Configuration File 就是用来设置记录器的级别 存放器和布局的 它可接key va
  • DB2 SQL error: SQLCODE: -302, SQLSTATE: 22001, SQLERRMC: null

    DB2 SQL error SQLCODE 302 SQLSTATE 22001 SQLERRMC null 当向数据库中插入记录时遇到以下异常 后经查处是 我将数据库自动生成逐渐的UUID改成了在java代码中手动生成UUID造成的 其实
  • CUDA by example Chapter6 常量内存与事件

    常量内存与事件 常量内存 光线跟踪 在GPU上实现光线追踪 通过常量内存来实现光线追踪 使用事件来测量性能 常量内存 使用常量内存的原因 GPU中含有数量庞大的计算单元 因此性能瓶颈通常并不在于芯片的数学计算吞吐量 而是在于芯片的内存带宽
  • 一款很漂亮的一天只弹窗一次的公告

    一款很漂亮的可设置时间的弹窗公告 可自定义HTML代码的公告 CSS代码 核客互动公告 blog hackeus cn btn large load all popup btn popup btn o page number padding
  • 学习java中的if语句

    java中if语句 if语句 用于判断 可以单分支 也可以多分支 单分支 if 判断语句 满足 则执行的代码块 else 不满足判断语句时 执行的代码块 多分支 if 判断语句1 满足判断语句1 执行的代码块 else if 判断语句2 不
  • pycharm远程调试,python remote debug,不进断点

    不 要 直 接 在 线 上 环 境 远 程 debug 不 要 直 接 在 线 上 环 境 远 程 debug 不 要 直 接 在 线 上 环 境 远 程 debug 目录 1 操作步骤 如下图所示 1 Tools gt Deploymen
  • 总结 Underlay 和 Overlay 网络,在k8s集群实现underlay网络,网络组件flannel vxlan/ calico IPIP模式的网络通信流程,基于二进制实现高可用的K8S集群

    1 总结Underlay和Overlay网络的的区别及优缺点 Overlay网络 Overlay 叫叠加网络也叫覆盖网络 指的是在物理网络的 基础之上叠加实现新的虚拟网络 即可使网络的中的容器可 以相互通信 优点是对物理网络的兼容性比较好
  • 用python实现简单的飞机大战小游戏

    1 下载一个包 PySide2 5 15 2 1 5 15 2 cp35 cp36 cp37 cp38 cp39 cp310 none win amd64 如果下载错误 就先下载shiboken2 5 15 2 1 5 15 2 cp35