python flappy bird小游戏分步实现流程


Posted in Python onFebruary 15, 2022

导语:

哈喽,哈喽~今天小编又来分享小游戏了——flappy bird(飞扬的小鸟),这个游戏非常的经典,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍。这个游戏能对于小编来说还是有点难度的。

python flappy bird小游戏分步实现流程

python flappy bird小游戏分步实现流程

开发工具:

Python版本:3.6.4

相关模块:

pygame模块;

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

运行视频:

python flappy bird小游戏分步实现流程

播放链接:https://live.csdn.net/v/embed/184490

正文:

首先,我们来写个开始界面,让他看起来更像个游戏一些。效果大概是这样的:

python flappy bird小游戏分步实现流程

原理也简单,关键点有三个:

(1)下方深绿浅绿交替的地板不断往左移动来制造小鸟向前飞行的假象;

(2)每过几帧切换一下小鸟的图片来实现小鸟翅膀扇动的效果:

python flappy bird小游戏分步实现流程

(3)有规律地改变小鸟竖直方向上的位置来实现上下移动的效果。

具体而言,代码实现如下:

'''显示开始界面'''
def startGame(screen, sounds, bird_images, other_images, backgroud_image, cfg):
  base_pos = [0, cfg.SCREENHEIGHT*0.79]
  base_diff_bg = other_images['base'].get_width() - backgroud_image.get_width()
  msg_pos = [(cfg.SCREENWIDTH-other_images['message'].get_width())/2, cfg.SCREENHEIGHT*0.12]
  bird_idx = 0
  bird_idx_change_count = 0
  bird_idx_cycle = itertools.cycle([0, 1, 2, 1])
  bird_pos = [cfg.SCREENWIDTH*0.2, (cfg.SCREENHEIGHT-list(bird_images.values())[0].get_height())/2]
  bird_y_shift_count = 0
  bird_y_shift_max = 9
  shift = 1
  clock = pygame.time.Clock()
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
        pygame.quit()
        sys.exit()
      elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
          return {'bird_pos': bird_pos, 'base_pos': base_pos, 'bird_idx': bird_idx}
    sounds['wing'].play()
    bird_idx_change_count += 1
    if bird_idx_change_count % 5 == 0:
      bird_idx = next(bird_idx_cycle)
      bird_idx_change_count = 0
    base_pos[0] = -((-base_pos[0] + 4) % base_diff_bg)
    bird_y_shift_count += 1
    if bird_y_shift_count == bird_y_shift_max:
      bird_y_shift_max = 16
      shift = -1 * shift
      bird_y_shift_count = 0
    bird_pos[-1] = bird_pos[-1] + shift
    screen.blit(backgroud_image, (0, 0))
    screen.blit(list(bird_images.values())[bird_idx], bird_pos)
    screen.blit(other_images['message'], msg_pos)
    screen.blit(other_images['base'], base_pos)
    pygame.display.update()
    clock.tick(cfg.FPS)

点击空格键或者↑键进入主程序。对于主程序,在进行了必要的初始化工作之后,在游戏开始界面中实现的内容的基础上,主要还需要实现的内容有以下几个部分:

(1) 管道和深绿浅绿交替的地板不断往左移来实现小鸟向前飞行的效果;

(2) 按键检测,当玩家点击空格键或者↑键时,小鸟向上做加速度向下的均减速直线运动直至向上的速度衰减为0,否则小鸟做自由落体运动(实现时为了方便,可以认为在极短的时间段内小鸟的运动方式为匀速直线运动);

(3) 碰撞检测,当小鸟与管道/游戏边界碰撞到时,游戏失败并进入游戏结束界面。注意,为了碰撞检测更精确,我们使用:

pygame.sprite.collide_mask

管道: 

python flappy bird小游戏分步实现流程

python flappy bird小游戏分步实现流程

python flappy bird小游戏分步实现流程

(4) 进入游戏后,随机产生两对管道,并不断左移,当最左边的管道快要因为到达游戏界面的左边界而消失时,重新生成一对管道(注意不要重复生成);

(5) 当小鸟穿越一个上下管道之间的缺口时,游戏得分加一(注意不要重复记分)。

计分表

python flappy bird小游戏分步实现流程

python flappy bird小游戏分步实现流程

这里简单贴下主程序的源代码吧:

# 进入主游戏
score = 0
bird_pos, base_pos, bird_idx = list(game_start_info.values())
base_diff_bg = other_images['base'].get_width() - backgroud_image.get_width()
clock = pygame.time.Clock()
# --管道类
pipe_sprites = pygame.sprite.Group()
for i in range(2):
  pipe_pos = Pipe.randomPipe(cfg, pipe_images.get('top'))
  pipe_sprites.add(Pipe(image=pipe_images.get('top'), position=(cfg.SCREENWIDTH+200+i*cfg.SCREENWIDTH/2, pipe_pos.get('top')[-1])))
  pipe_sprites.add(Pipe(image=pipe_images.get('bottom'), position=(cfg.SCREENWIDTH+200+i*cfg.SCREENWIDTH/2, pipe_pos.get('bottom')[-1])))
# --bird类
bird = Bird(images=bird_images, idx=bird_idx, position=bird_pos)
# --是否增加pipe
is_add_pipe = True
# --游戏是否进行中
is_game_running = True
while is_game_running:
  for event in pygame.event.get():
    if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
      pygame.quit()
      sys.exit()
    elif event.type == pygame.KEYDOWN:
      if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
        bird.setFlapped()
        sounds['wing'].play()
  # --碰撞检测
  for pipe in pipe_sprites:
    if pygame.sprite.collide_mask(bird, pipe):
      sounds['hit'].play()
      is_game_running = False
  # --更新小鸟
  boundary_values = [0, base_pos[-1]]
  is_dead = bird.update(boundary_values, float(clock.tick(cfg.FPS))/1000.)
  if is_dead:
    sounds['hit'].play()
    is_game_running = False
  # --移动base实现小鸟往前飞的效果
  base_pos[0] = -((-base_pos[0] + 4) % base_diff_bg)
  # --移动pipe实现小鸟往前飞的效果
  flag = False
  for pipe in pipe_sprites:
    pipe.rect.left -= 4
    if pipe.rect.centerx < bird.rect.centerx and not pipe.used_for_score:
      pipe.used_for_score = True
      score += 0.5
      if '.5' in str(score):
        sounds['point'].play()
    if pipe.rect.left < 5 and pipe.rect.left > 0 and is_add_pipe:
      pipe_pos = Pipe.randomPipe(cfg, pipe_images.get('top'))
      pipe_sprites.add(Pipe(image=pipe_images.get('top'), position=pipe_pos.get('top')))
      pipe_sprites.add(Pipe(image=pipe_images.get('bottom'), position=pipe_pos.get('bottom')))
      is_add_pipe = False
    elif pipe.rect.right < 0:
      pipe_sprites.remove(pipe)
      flag = True
  if flag: is_add_pipe = True
  # --绑定必要的元素在屏幕上
  screen.blit(backgroud_image, (0, 0))
  pipe_sprites.draw(screen)
  screen.blit(other_images['base'], base_pos)
  showScore(screen, score, number_images)
  bird.draw(screen)
  pygame.display.update()
  clock.tick(cfg.FPS)

游戏结束

假如我们的主角真的一个不小心如我们所料的撞死在了钢管上(往上翻,就在游戏开始那里),那就表示gameOver();

'''游戏结束界面'''
def endGame(screen, sounds, showScore, score, number_images, bird, pipe_sprites, backgroud_image, other_images, base_pos, cfg):
  sounds['die'].play()
  clock = pygame.time.Clock()
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
        pygame.quit()
        sys.exit()
      elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
          return
    boundary_values = [0, base_pos[-1]]
    bird.update(boundary_values, float(clock.tick(cfg.FPS))/1000.)
    screen.blit(backgroud_image, (0, 0))
    pipe_sprites.draw(screen)
    screen.blit(other_images['base'], base_pos)
    showScore(screen, score, number_images)
    bird.draw(screen)
    pygame.display.update()
    clock.tick(cfg.FPS)

结尾:

这期游戏分享就到这结束啦喜欢的友友们动手试试看哦!家人们的支持是小编更新最大的动力

到此这篇关于python flappy bird小游戏分布实现流程的文章就介绍到这了,更多相关python flappy bird内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python操作xml文件示例
Apr 07 Python
Python深入学习之上下文管理器
Aug 31 Python
动感网页相册 python编写简单文件夹内图片浏览工具
Aug 17 Python
详解django中自定义标签和过滤器
Jul 03 Python
Python如何快速实现分布式任务
Jul 06 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
numpy中的ndarray方法和属性详解
May 27 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
使用 django orm 写 exists 条件过滤实例
May 20 Python
Python requests HTTP验证登录实现流程
Nov 05 Python
Python图像识别+KNN求解数独的实现
Nov 13 Python
python爬虫 requests-html的使用
Nov 30 Python
Python 居然可以在 Excel 中画画你知道吗
Feb 15 #Python
Python 恐龙跑跑小游戏实现流程
详解Python+OpenCV进行基础的图像操作
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 #Python
python 远程执行命令的详细代码
Feb 15 #Python
python 详解turtle画爱心代码
python分分钟绘制精美地图海报
You might like
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
php导出生成word的方法
2015/12/25 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
php显示页码分页类的封装
2017/06/08 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
js常见遍历操作小结
2019/06/06 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
jupyter 导入csv文件方式
2020/04/21 Python
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
应届大学生求职的自我评价
2013/11/17 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
vue ref如何获取子组件属性值
2022/03/31 Vue.js