一、前言

今天已经初四,舒服的在家躺尸的春节也算过去了,又要开始辛勤的(苦逼的)学习和工作了。说点题外话,今年春节的病毒疫情真的弄的人心惶惶,我也在这为国家和武汉加油,也向一线工作人员致敬,希望早日结束这场疫情。
好了,题外话说的有点多,下面开始介绍用python写的小游戏飞机大战。心急的小伙伴们可以直接到博客底部找链接,我给你们提供了代码源码和开发文档,哈哈。

二、编译软件及用到的python库

1.编译软件

我用的是编译软件是比较常用的用来写python大型工程的PyCharm,这个软件总体来说是比较好用的。大家可以在网上自行下载,当然一般好用的软件都需要付费。哈哈,PyCharm也不例外,我记得这个软件是有30天的免费体验期,不过经常用破解软件的苦逼码农一般都去网上找秘钥破解。

2.python库

在这就简单说一下主要用到的一些:
(1)pygame库
Pygame是跨平台Pyth,Pygame 作者是 Pete Shinners, 协议为 GNU Lesser General Public License。Pygame包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。
(2)random库
Random是产生随机数的库,即随机数发生器,random产生的是伪随机数或者说是用一种复杂的方法计算得到的序列值,因此每次运算时需要一个不同的种子值。种子值不同,得到的序列值也不同。
(3) time库
time库是Python中处理时间的标准库,用于计算机时间的表达,提供获取系统时间并格式化输出功能,提供系统级精确计时功能,也可用于程序性能分析。
(4) sys库
sys.exit([ arg ])用于程序的退出,sys.exit(n) 退出程序,正常退出时exit(0)。这是通过引发SystemExit 异常来实现的,因此遵循finally语句的子句所指定的清理操作try ,并且可以拦截外层的退出尝试。可选参数arg可以是一个整数,给出退出状态(默认为零)或其他类型的对象。如果它是整数,则零被认为是“成功终止”,并且任何非零值等视为“异常终止”。

三、游戏操作及游戏规则

1.游戏操作及游戏规则
(1)通过键盘上下左右键或者WASD键控制飞机的移动方向来射击敌机。
(2)通过键盘空格键释放导弹,将游戏界面的敌机全部击败,初始有三颗导弹,游戏过程中会出现导弹补给对导弹进行补充,最多可获取三颗。
(3)根据击败敌机的等级来获得不同的得分,得分进行累计,对应五个难度等级,分数越高难度越大。
(4)在飞机移动射击过程中,不能碰撞敌机,每次碰撞敌机损失一条生命,飞机共有三条生命,损失三条命后游戏结束。
2.游戏总体设计

四、游戏运行测试(截图)

游戏运行截图

游戏结束截图

五、详细介绍游戏整体架构和游戏的各个py文件

1.游戏整体架构

(1)定义一个显示窗口(480*700px);根据帧数控制飞机子弹射速,敌机刷新时间和补给刷新时间;
(2)定义玩家控制机、敌机、子弹类和补给类,并在窗口上把玩家控制机、敌机、得分、导弹数量、生命数量、补给和暂停键显示出来;
(3)定义游戏循环;
(4)定义玩家控制机的移动和导弹的触发,通过检测键盘输入来控制飞机的移动和触发导弹效果;
(5)检测游戏结束,显示本局得分、最高得分、重新开始和退出游戏选项。

2.游戏的各个py文件

main.py文件:主函数文件,用来实现游戏的运行。以下介绍的其余文件都作main.py文件的包用import导入。

(1)初始化游戏主界面

#pygame初始化
pygame.init()
pygame.mixer.init()
#设置背景尺寸(根据背景图片尺寸设置)
bg_size = width, height = 480, 700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption('飞机大战') #标题
#初始飞机数量,可直接修改
enemy3_num = 12
enemy2_num = 8
enemy1_num = 2
#加载背景图片
background = pygame.image.load('images/background.jpg').convert_alpha()

(2)定义main函数,用于实现玩家控制机、敌机和补给的生成。统计得分并根据得分增加游戏难度,难度共5个等级,分别对应得到50、200、500、1200分时对大中小型敌机数量和速度进行增加。实现游戏的暂停并判断游戏是否结束,并绘制结束界面。

#播放背景音乐,循环播放pygame.mixer.music.play(-1)#生成控制机me = myplane.MyPlane(bg_size)# 生成敌方飞机enemies = pygame.sprite.Group()# 生成大型敌机big_enemies = pygame.sprite.Group()add_big_enemies(big_enemies, enemies, enemy3_num)# 生成中型敌机mid_enemies = pygame.sprite.Group()add_mid_enemies(mid_enemies, enemies, enemy2_num# 生成小型敌机small_enemies = pygame.sprite.Group()add_small_enemies(small_enemies, enemies, enemy1_num)# 生成普通子弹bullet1 = []bullet1_index = 0BULLET1_NUM = 4for i in range(BULLET1_NUM):bullet1.append(bullet.Bullet1(me.rect.midtop)) #在飞机顶部中央生成子弹# 生成超级子弹bullet2 = []bullet2_index = 0BULLET2_NUM = 8for i in range(BULLET2_NUM // 2):bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery)))bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery)))# 用于延迟delay = 100clock = pygame.time.Clock()#中弹图片索引e1_destroy_index = 0e2_destroy_index = 0e3_destroy_index = 0me_destroy_index = 0# 统计得分score = 0score_font = pygame.font.Font('font/MSYH.TTF', 36)# 是否暂停游戏paused = Falsepause_nor_image = pygame.image.load('images/pause_nor.png').convert_alpha()pause_pressed_image = pygame.image.load('images/pause_pressed.png').convert_alpha()resume_nor_image = pygame.image.load('images/resume_nor.png').convert_alpha()resume_pressed_image = pygame.image.load('images/resume_pressed.png').convert_alpha()pause_rect = pause_nor_image.get_rect()pause_rect.left, pause_rect.top = width - pause_rect.width - 10, 10pause_image = pause_nor_image# 难度级别level = 1# 炸弹bomb_image = pygame.image.load('images/bomb.png').convert_alpha()bomb_rect = bomb_image.get_rect()bomb_font = pygame.font.Font('font/MSYH.TTF', 40)bomb_num = 3# 生命数量life_image = pygame.image.load('images/life.png').convert_alpha()life_rect = life_image.get_rect()life_font = pygame.font.Font('font/MSYH.TTF', 40)life_num = 3# 每30秒发放一个补给包bullet_supply = supply.Bullet_Supply(bg_size)bomb_supply = supply.Bomb_Supply(bg_size)life_supply = supply.Life_Supply(bg_size)SUPPLY_TIME = USEREVENT  # 自定义计时事件pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)# 超级子弹定时器DOUBLE_BULLET_TIME = USEREVENT + 1# 是否使用超级子弹is_double_bullet = False#  无敌时间计时器INVINCIBLE_TIME = USEREVENT + 2# 防止重复打开记录文件recorded = Falserunning = Trueplay_fly_sound = False # 是否播放大型敌机fly的音效

myplane.py文件 :玩家控制机文件,用定义玩家控制机类。

(1)定义玩家控制机类,继承pygame中的sprite类,实现对玩家控制机的初始化,将玩家控制机图片的导入,在游戏界面初始位置的设定,速度的设定等。

#导入控制机self.image = pygame.image.load('images/me1.png').convert_alpha()self.destroy_images = []self.destroy_images.extend([\pygame.image.load('images/me_destroy_1.png'),\pygame.image.load('images/me_destroy_2.png'),\pygame.image.load('images/me_destroy_3.png'),\pygame.image.load('images/me_destroy_4.png'),])#获取rectself.rect = self.image.get_rect()self.width, self.height = bg_size[0], bg_size[1]#控制机初始位置self.rect.left, self.rect.top = \(self.width - self.rect.width) // 2, \self.height - self.rect.height - 60self.speed = 10   #控制机速度self.active = Trueself.invincible = False #无敌状态标志self.mask = pygame.mask.from_surface(self.image)  #将传入图片非透明部分标记为mask

(2)定义玩家控制机上下左右移动的函数(类中的函数)。

def moveUp(self): #向上走if self.rect.top > 0:self.rect.top -= self.speedelse:self.rect.top = 0def moveDown(self):  #向下走if self.rect.bottom < self.height - 60: self.rect.top += self.speedelse:self.rect.bottom = self.height - 60def moveLeft(self): #向左走if self.rect.left > 0: self.rect.left -= self.speedelse:self.rect.left = 0def moveRight(self): #向右走if self.rect.right < self.width: self.rect.left += self.speedelse:self.rect.right = self.width

(3)重置函数,在玩家控制机飞机损失一条命之后重新初始化玩家控制机的函数(类中的函数)。

def reset(self):self.rect.left, self.rect.top = \(self.width - self.rect.width) // 2, \self.height - self.rect.height - 60self.active = Trueself.invincible = True

enemy.py文件 :敌机文件,用来定义大、中、小型敌机类。

(1)定义小型敌机类(SmallEnemy),继承pygame的sprite类,初始化小型敌机。

self.image = pygame.image.load('images/enemy1.png').convert_alpha()self.active = Trueself.rect = self.image.get_rect()self.width, self.height = bg_size[0], bg_size[1]self.speed = 2self.mask = pygame.mask.from_surface(self.image)#设置小型敌机能够出现范围的矩形大小self.rect.left, self.rect.top = \randint(0, self.width - self.rect.width), \randint(-5 * self.rect.height, 0)

(2)定义小型敌机移动函数(类中的函数),设定其移动方向。

 #设置敌机移动def move(self):if self.rect.top < self.height:self.rect.top += self.speedelse:self.reset()

(3)定义小型敌机重置函数(类中的函数),进行重新初始化。

def reset(self):self.active = Trueself.rect.left, self.rect.top = \randint(0, self.width - self.rect.width), \randint(-7 * self.rect.height, 0)

(4)定义中型敌机类(MidEnemy)和大型敌机类(BigEnemy),基本操作与小型敌机类一样。

bullet.py文件 :子弹文件,用来定义普通子弹和超级子弹类。

(1)定义普通子弹类(Bullet1),初始化普通子弹,导入普通子弹图片到程序,设定普通子弹的速度等。

 self.image = pygame.image.load('images/bullet1.png').convert_alpha()
self.rect = self.image.get_rect()self.rect.left, self.rect.top = positionself.speed = 12self.active = Falseself.mask = pygame.mask.from_surface(self.image)

(2)定义普通子弹移动函数(类中的函数),控制子弹的一点方向。

def move(self):self.rect.top -= self.speedif self.rect.top < 0:self.active = False

(3)定义普通子弹重置函数(类中的函数),重新初始化普通子弹。

def reset(self, position):self.rect.left, self.rect.top = positionself.active = True

(4)定义超级子弹类(Bullet2),继承pygame的sprite类,基本操作与普通子弹类一样。

supply.py文件:补给文件,用来定义导弹、超级子弹和生命补给类。

(1)定义超级子弹补给类(Bullet_Supply),继承pygame的sprite类,初始化超级子弹补给,导入超级子弹补给的图片到程序,设置补给下落速度等。

self.image = pygame.image.load('images/bullet_supply.png').convert_alpha()
self.rect = self.image.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.rect.left, self.rect.bottom = randint(0, self.width - self.rect.width), -100
self.speed = 5
self.active = False
self.mask = pygame.mask.from_surface(self.image)

(2)定义超级子弹补给移动函数(类中的函数),规定补给的移动方向。

def move(self):if self.rect.top < self.height:self.rect.top += self.speedelse:self.active = False

(3)定义重置函数(类中的函数),重新初始化超级子弹补给。

def reset(self):self.active = Trueself.rect.left, self.rect.bottom = \randint(0, self.width - self.rect.width), -100

(4)定义导弹补给类(Bomb_Supply)和生命补给类(Life_Supply),基本操作与超级子弹类类似。

六、源代码和视频教程

1.源代码链接

Python编写小游戏–飞机大战
如果下载积分不够,可以加我微信获取(Up_Long_),有偿,私信只能24小时回复5个人,可能看到了但是无法回复消息。

【Python】Python小游戏--飞机大战相关推荐

  1. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  2. 用JAVA制作小游戏——飞机大战(三)

    本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...

  3. 用JAVA制作小游戏——飞机大战(二)

    本篇博客是对飞机大战游戏使用代码的展示 重难点: 首先需要鼠标能够控制战机,使鼠标在窗口内时始终能够使战机的位置与鼠标相同,实现鼠标控制战斗机移动. 其次需要能够以一定的速度产生子弹和敌机,并且以一定 ...

  4. java小游戏-java小游戏-飞机大战

    java小游戏-java小游戏-飞机大战 1 窗口创建 2 背景图片添加 3 启动页面制作 4 启动页面点击事件 5 游戏物体父类的编写 6 背景的移动 7 双缓存的添加 8 背景图片的循环出现 9 ...

  5. 【游戏开发实战】使用Unity 2019制作仿微信小游戏飞机大战(七):主角飞机碰撞与爆炸

    文章目录 零.教程目录 一.前言 二.本篇目标 三.飞机机碰撞组件:BoxCollider2D.Rigidbody2D 四.添加Tag:Enemy 五.主角飞机碰撞处理:OnTriggerEnter2 ...

  6. c语言小游戏-飞机大战

    今天我们来尝试用easyx图形库实现c语言小游戏-飞机大战(源代码和图片已经在结尾给出) 先引用头文件 #include<stdio.h> #include<time.h>// ...

  7. python代码示例500行源代码-500行代码使用python写个微信小游戏飞机大战游戏

    这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右 ...

  8. python小游戏——飞机大战小游戏(附源码)

    写在前面的一些P话: 大家之前用python编写过飞机大战的部分代码, 只能够展示英雄飞机,背景,敌机和发射子弹, 今天把背景音乐,击毁敌机,爆炸特效,得分等等相关功能一并加入进来, 代码有点长,三百 ...

  9. 小甲鱼python小游戏“飞机大战”源码素材

    话不多说,链接奉上. 百度网盘链接: https://pan.baidu.com/s/1KkmCqCBJ2Jq_IrewovYPAQ 提取码:43av 注:需下载Python pygame包 下载方式 ...

最新文章

  1. LinkedBlockingQueue 注记
  2. Windows 10如何启用ReFS弹性文件系统
  3. PyQt5显示一个空白的窗口
  4. 年底了,游戏大作连连
  5. 中石油训练赛 - Get Strong(dfs双向搜索+二分)
  6. PHPmyadmin 和 MySQL 的配置笔记
  7. Linux下安装Go环境
  8. Python:如何安装与使用 pip
  9. JQ 对于table的动态增减
  10. FastCGI介绍(快速通用网关接口)
  11. win10自带抓包工具_win10应用商店抓包-Win10商店抓包工具下载 v1.1免费版--pc6下载站...
  12. Android编码规范
  13. 中华人民共和国网络安全法
  14. mysql 多字段求和_sql数据库多字段求和
  15. 大专什么专业学c语言,大专专业计算机网络技术学不学编程
  16. python删除excel指定行_python实现Excel删除特定行、拷贝指定行操作
  17. linux下的“超超超音速”安装谷歌中文输入法
  18. 韩版机泛泰A850去除漫游时拨号选择框
  19. 微信公众号赞赏账户头像在哪里修改?附详细图文教程
  20. pair及pair在vector中的使用

热门文章

  1. yii2.0框架报错
  2. 量子计算机可以计算葛立恒数,葛立恒数
  3. oracle merge into 批量新增或更新
  4. VS2005 安装程序制作 3 更改默认的安装位置
  5. chm是什么格式文件?怎么打开
  6. 无货源店铺!如何运营?
  7. OpenDocument文件格式在政府机关中的重要性
  8. 【纠错】——错误:PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。“+解决方案
  9. 学习笔记——margin-top,margin-bottom之间的合并问题
  10. AspxGridview GetSelectedFieldValues取值为主键值