当年微信 5.0 发布时,首页被设置成了一款新推出的小游戏,它就是微信版飞机大战,游戏一经推出便是火爆异常,铅笔画风格的游戏界面也受到了很多人的喜欢。

最近重温了一下这款小游戏,尽管时隔多年,但无论是游戏的画质还是风格,时至今日依然都不过时。本文我们使用 Python 来实现一下这款小游戏,游戏的实现主要用到第三方模块 pygame,安装使用 pip install pygame 即可。
注:文章末尾附源码and资料领取方式!

环境

操作系统:Windows
Python 版本:3.6
涉及模块:pygame、sys、random

实现

飞机大战的构成相对比较简单,主要包括:主界面、玩家、敌人、子弹、计分板等,下面来看一下具体实现。

首先我们来绘制一个主界面,主要实现代码如下所示:

# 设置屏幕的宽度
SCREEN_WIDTH = 450
# 设置屏幕的高度
SCREEN_HEIGHT = 600
# 初始化窗口
pygame.init()
# 设置窗口标题
pygame.display.set_caption("飞机大战")
# 设置屏幕大小
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), 0, 32)
# 隐藏光标
pygame.mouse.set_visible(False)
# 设置背景
bg = pygame.image.load("resources/image/bg.png")
# 绘制屏幕
screen.fill(0)
# 加入背景图片
screen.blit(bg, (0, 0))
# 设置游戏结束的图片
bg_game_over = pygame.image.load("resources/image/bg_game_over.png")
# 加载飞机资源图片
img_plane = pygame.image.load("resources/image/shoot.png")
img_start = pygame.image.load("resources/image/start.png")
img_pause = pygame.image.load("resources/image/pause.png")
img_icon = pygame.image.load("resources/image/plane.png").convert_alpha()
# 顺便设置窗口
pygame.display.set_icon(img_icon)
# 初始化位置
player_pos = [200, 450]

看一下效果:

接着,我们再来定义玩家的属性和方法,主要实现代码如下所示:

class Player(pygame.sprite.Sprite):def __init__(self, img, rect, pos):pygame.sprite.Sprite.__init__(self)self.image = []# 将飞机图片部分分隔for i in range(len(rect)):self.image.append(img.subsurface(rect[i]).convert_alpha())# 获取飞机的区域self.rect = rect[0]self.rect.topleft = posself.speed = 8# 生成精灵组实例self.bullets = pygame.sprite.Group()self.img_index = 0# 判断飞机是否被打中self.is_hit = Falsedef shoot(self, img):bullet = Bullet(img, self.rect.midtop)# 添加子弹实例到玩家的子弹组self.bullets.add(bullet)def moveUp(self):# 当遇到顶部时,设置上顶部为0if self.rect.top <= 0:self.rect.top = 0else:self.rect.top -= self.speeddef moveDown(self):# 当遇到底部时,设置一直为常值if self.rect.top >= SCREEN_HEIGHT - self.rect.height:self.rect.top = SCREEN_HEIGHT - self.rect.heightelse:self.rect.top += self.speeddef moveLeft(self):# 当遇到左边时,一直停靠在左边if self.rect.left <= 0:self.rect.left = 0else:self.rect.left -= self.speeddef moveRight(self):# 当遇到右边时, 停靠右边if self.rect.left >= SCREEN_WIDTH - self.rect.width:self.rect.left = SCREEN_WIDTH - self.rect.widthelse:self.rect.left += self.speed

看一下玩家的飞机样式:

我们再接着定义子弹的属性和方法,主要实现代码如下所示:

class Bullet(pygame.sprite.Sprite):def __init__(self, img, pos):pygame.sprite.Sprite.__init__(self)self.image = img# 设置图片的区域self.rect = self.image.get_rect()self.rect.midbottom = posself.speed = 10def move(self):self.rect.top -= self.speed

看一下子弹的样式:

定义完玩家,我们再来定义敌机的属性和方法,主要实现代码如下所示:

class Enemy(pygame.sprite.Sprite):def __init__(self, img, explosion_img, pos):pygame.sprite.Sprite.__init__(self)self.image = imgself.rect = self.image.get_rect()self.rect.topleft = posself.explosion_img = explosion_imgself.speed = 2# 设置击毁序列self.explosion_index = 0def move(self):# 敌人的子弹只能一直向下self.rect.top += self.speed

最后,我们来定义一下游戏运行的相应逻辑,比如:击中敌机、玩家与敌机碰撞、生成分数等,主要实现代码如下所示:

while running:# 设置游戏帧率为 60clock.tick(60)if not is_pause and not is_game_over:if not player.is_hit:# 设置连续射击,因为每秒 60 帧,15/60=0.25 秒发一次子弹if shoot_frequency % 15 == 0:player.shoot(bullet_img)shoot_frequency += 1# 当设置的射击频率大于 15,置零if shoot_frequency >= 15:shoot_frequency = 0# 控制生成敌机的频率if enemy_frequency % 50 == 0:# 设置敌机的出现的位置enemy_pos = [random.randint(0, SCREEN_WIDTH - enemy_rect.width), 0]enemy = Enemy(enemy_img, enemy_explosion_imgs, enemy_pos)enemies.add(enemy)enemy_frequency += 1if enemy_frequency >= 100:enemy_frequency = 0# 控制子弹的显示运行for bullet in player.bullets:bullet.move()if bullet.rect.bottom < 0:player.bullets.remove(bullet)# 控制敌机的运行for enemy in enemies:enemy.move()# 判断敌机是否与玩家飞机碰撞if pygame.sprite.collide_circle(enemy, player):enemies_explosion.add(enemy)enemies.remove(enemy)player.is_hit = True# 设置玩家的飞机被毁is_game_over = True# 判断敌机是否在界面if enemy.rect.top < 0:enemies.remove(enemy)# 设置敌机与玩家的飞机子弹相碰时,返回被击的敌机实例enemy_explosion = pygame.sprite.groupcollide(enemies, player.bullets, 1, 1)for enemy in enemy_explosion:enemies_explosion.add(enemy)# 绘制屏幕screen.fill(0)# 加入背景图片screen.blit(bg, (0, 0))# 添加玩家飞机图片到屏幕if not player.is_hit:screen.blit(player.image[int(player.img_index)], player.rect)player.img_index = shoot_frequency / 8else:if player_explosion_index > 47:is_game_over = Trueelse:player.img_index = player_explosion_index / 8screen.blit(player.image[int(player.img_index)], player.rect)player_explosion_index += 1# 敌机被子弹击中的效果显示for enemy in enemies_explosion:if enemy.explosion_index == 0:passif enemy.explosion_index > 7:enemies_explosion.remove(enemy)score += 100continue# 敌机被击时显示图片screen.blit(enemy.explosion_img[int(enemy.explosion_index / 2)], enemy.rect)enemy.explosion_index += 1# 显示子弹player.bullets.draw(screen)# 显示敌机enemies.draw(screen)# 分数的显示效果score_font = pygame.font.Font(None, 36)score_text = score_font.render(str(score), True, (128, 128, 128))# 设置文字框text_rect = score_text.get_rect()# 放置文字的位置text_rect.topleft = [20, 10]# 显示出分数screen.blit(score_text, text_rect)left, middle, right = pygame.mouse.get_pressed()# 暂停游戏if right == True and not is_game_over:is_pause = Trueif left == True:# 重置游戏if is_game_over:is_game_over = Falseplayer_rect = []player_rect.append(pygame.Rect(0, 99, 102, 126))player_rect.append(pygame.Rect(165, 360, 102, 126))player_rect.append(pygame.Rect(165, 234, 102, 126))player_rect.append(pygame.Rect(330, 624, 102, 126))player_rect.append(pygame.Rect(330, 498, 102, 126))player_rect.append(pygame.Rect(432, 624, 102, 126))player = Player(img_plane, player_rect, player_pos)bullet_rect = pygame.Rect(1004, 987, 9, 21)bullet_img = img_plane.subsurface(bullet_rect)enemy_rect = pygame.Rect(534, 612, 57, 43)enemy_img = img_plane.subsurface(enemy_rect)enemy_explosion_imgs = []enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(267, 347, 57, 43)))enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(873, 697, 57, 43)))enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(267, 296, 57, 43)))enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(930, 697, 57, 43)))enemies = pygame.sprite.Group()enemies_explosion = pygame.sprite.Group()score = 0shoot_frequency = 0enemy_frequency = 0player_explosion_index = 16# 继续游戏if is_pause:is_pause = False# 游戏结束if is_game_over:font = pygame.font.SysFont("微软雅黑", 48)text = font.render("Score: " + str(score), True, (255, 0, 0))text_rect = text.get_rect()text_rect.centerx = screen.get_rect().centerxtext_rect.centery = screen.get_rect().centery + 70# 显示游戏结束画面screen.blit(bg_game_over, (0, 0))# 显示分数screen.blit(text, text_rect)font = pygame.font.SysFont("微软雅黑", 40)text = font.render("Press Left Mouse to Restart", True, (255, 0, 0))text_rect = text.get_rect()text_rect.centerx = screen.get_rect().centerxtext_rect.centery = screen.get_rect().centery + 150screen.blit(text, text_rect)# 刷新屏幕pygame.display.update()# 处理游戏退出for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()if not is_pause and not is_game_over:key = pygame.key.get_pressed()if key[K_w] or key[K_UP]:player.moveUp()if key[K_s] or key[K_DOWN]:player.moveDown()if key[K_a] or key[K_LEFT]:player.moveLeft()if key[K_d] or key[K_RIGHT]:player.moveRight()

我们来看一下最终实现效果:

领取提示:
随意评论+Q君羊 733089476 即可

用 Python 写一个经典的飞机大战(附源代码)相关推荐

  1. 用java写一个简单的飞机大战游戏

    制作一个简单的飞机大战 注意!!!!!,图片素材在我的资源里有. 下面代码排序,非先后顺序.请看清楚类名 Airplane类 package Flyplane;public class Airplan ...

  2. 手把手教学,Python 游戏编程之实现飞机大战(含源代码)

    文章目录 一.游戏设定 1.游戏界面展示和设定 二.实现过程 1.我方飞机 2.敌方飞机 3.定义武器 4.武器补充库 5.主模块 总结: 前言 我想大家都是有玩过类似飞机大战的射击类游戏,也享受目标 ...

  3. Python 游戏编程之实现飞机大战(含源代码)

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来自:CSDN,作者:逐梦er 链接:https://zhumenger.blog.csdn.net/arti ...

  4. 飞机大战python介绍_用 Python 写一个经典飞机大战

    while running: # 设置游戏帧率为 60 clock.tick(60) if not is_pause and not is_game_over: if not player.is_hi ...

  5. 用C语言写一个简单的飞机大战游戏(用到easyx图形库)

    学习内容:1.背景的运动 2.飞机爆炸效果 3.透明贴图工具 目录 一.需要用到的头文件.全局变量和一些函数.结构体 二.数据初始化以及图片处理 三.主体 四.物体碰撞 五.游戏运行 六.透明贴图工具 ...

  6. 用 Python 写一个天天酷跑 | 内附源码

    写出来的效果图就是这样了: 相关文件 小伙伴们可以关注小编的Python源码.问题解答&学习交流群:733089476 有很多的资源可以白嫖的哈,需要源码的小伙伴可以在+君羊领取 下面就更新一 ...

  7. 经典《飞机大战》游戏,难道你不想自己动手开发一个嘛(附源码免费下载)

    经典的飞机大战游戏,难道你不想自己动手开发一个嘛! 语言:Java 代码的编译软件:Eclipse 如果你用的也是eclipse的话  直接导入文件 就可以  ,如果不是的话,自己建一个项目,将代码c ...

  8. python能制作游戏吗_如何用python写一个小游戏

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 引言最近python语言大火,除了在科学计算领域python有用武之地之外,在游 ...

  9. Python游戏之Pygame——太空飞机大战(四)

    上一篇(Python游戏之Pygame--太空飞机大战(三))完成了英雄战机和星空,那么基本上飞机大战的主要元素都已经完成,该是总结成功玩自己游戏的时候了. 哦,差点忘了,Bullet类对于普通子弹和 ...

最新文章

  1. mongoose 实用 API 总结
  2. C# 读写文件方法总结
  3. Opencv深拷贝与浅拷贝
  4. 「MTA」的「錯誤訊息代碼」
  5. 20200915 椭圆范数的三角不等式证明:sqrt(x^T*Q*x)
  6. maven打包项目的时候找不到jar包,但是项目里面改已经有相关jar包
  7. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
  8. 如何设置Matlab输出到Word中图片的大小
  9. 选择技术栈构建通用平台
  10. 接口测试从零开始系列_mock技术使用
  11. @程序员,你该如何做职业规划才能不被“废”?
  12. aps是什么意思_三分钟看懂ERP、MES、APS系统的关联和区别
  13. java rsa加密 加签_RSA加密解密与加签验签
  14. 巴宝莉(Burberry)换等线体LOGO了!
  15. 19. 各种提权姿势总结
  16. jszip压缩文件上传到服务器,AngularJS - 使用JSZip压缩上传的pdf文件
  17. 用CSS3画出一个正方体
  18. 和“目标”相关的名言
  19. DEDECMS留言薄全站调用方法
  20. 求大神帮助 百练我爱北大,编程题目

热门文章

  1. 基于vue2+element+springboot+mybatis+jpa+mysql的小区物业管理系统
  2. 使用开源产品的代价_使用我们从事的开源产品的责任
  3. MYSQL基本操作(2)-数据表的操作
  4. BPMN 入门:BPMN 流程图结构
  5. 2022 Android studio 最全必用插件
  6. 时尚炫酷赛博朋克风动态标题字幕MOGRT模板
  7. GitHub+Git
  8. 买16款macPro和还是15年macPro啦?实用大比较!
  9. qt生成库文件之后自动复制到指定目录
  10. 课堂实录java开发,Java Web开发课堂实录