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中使用装饰器和元编程实现结构体类实例
Jan 28 Python
详解Python中的循环语句的用法
Apr 09 Python
python实现斐波那契数列的方法示例
Jan 12 Python
你应该知道的python列表去重方法
Jan 17 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
python采集微信公众号文章
Dec 20 Python
pygame实现贪吃蛇游戏(下)
Oct 29 Python
python反转列表的三种方式解析
Nov 08 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
PyQt实现计数器的方法示例
Jan 18 Python
python中的装饰器该如何使用
Jun 18 Python
python游戏开发之pygame实现接球小游戏
Apr 22 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
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
js DOM模型操作
2009/12/28 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
浅析JS运动
2015/12/28 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
Python求解平方根的方法
2015/03/11 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
python ftplib模块使用代码实例
2019/12/31 Python
pytorch中的inference使用实例
2020/02/20 Python
golang/python实现归并排序实例代码
2020/08/30 Python
如何利用python发送邮件
2020/09/26 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
百度JavaScript笔试题
2015/01/15 面试题
求职简历中的自我评价分享
2013/12/08 职场文书
旷课检讨书1000字
2014/02/14 职场文书
人事文员岗位职责
2014/02/16 职场文书
小学网上祭英烈活动总结
2014/07/05 职场文书
教师年终个人总结
2015/02/11 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
求职自我评价参考范文
2019/05/16 职场文书