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二叉树遍历的实现方法
Nov 21 Python
详解python 发送邮件实例代码
Dec 22 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
linux下python使用sendmail发送邮件
May 22 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
python3的url编码和解码,自定义gbk、utf-8的例子
Aug 22 Python
利用python在excel中画图的实现方法
Mar 17 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
python基于opencv 实现图像时钟
Jan 04 Python
pycharm 如何查看某一函数源码的快捷键
May 12 Python
python之json文件转xml文件案例讲解
Aug 07 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
php设计模式 Command(命令模式)
2011/06/26 PHP
有关PHP中MVC的开发经验分享
2012/05/17 PHP
php Session存储到Redis的方法
2013/11/04 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
JavaScript 常用函数
2009/12/30 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Django框架多表查询实例分析
2018/07/04 Python
Python 互换字典的键值对实例
2019/02/12 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
python爬虫如何解决图片验证码
2021/02/14 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
活动总结的格式
2014/05/07 职场文书
党员服务承诺书
2014/05/28 职场文书
报效祖国演讲稿
2014/09/15 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
上班迟到检讨书
2015/05/06 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL