Python----涂鸦跳跃

  • 前言
  • 准备工作
    • 安装Pygame
      • 安装pip
        • Windows下安装pip,使用下面的命令运行get-pip.py:
        • 在Linux和OS X下安装pip
      • 安装Pygame
        • LInux下安装Pygame
        • 在OS X 系统中安装 Pygame
        • 在 Windows 系统中安装 Pygame
  • 开始项目
    • 创建窗口
    • 添加设置类
    • 添加涂鸦图像
    • 重构主循环
    • 左右移动
    • 调整Graffiti移动速度
    • 修改涂鸦活动范围
    • 重构响应方法
    • 实现踏板
    • 实现跳跃
    • 窗口跟随及增加新踏板
    • 结束事件
    • 显示分数
  • 总结

前言

本人作为一个Python小白,刚刚自己看完《Python编程:从入门到实践》这本书,也跟着做完了项目中的外星人大战,但自己只是能看懂其代码,而让自己单独做一个却不知如何下手。因此,计划自己做一个类似的小游戏,脑海中第一时间就浮现出了高中时期最喜爱的涂鸦跳跃。我已经想象出跳跃的那刻,开始吧,骚年!
项目地址:https://github.com/ding19940215/doodle_jump.git

准备工作

软件开发都是需要开发环境,而自己打算使用Python开发小游戏,就需要Python以及所需的模块Pygame。

安装Pygame

Pygam是一个功能很强大的模块,可以管理图形、动画乃至声音,可以快速开发出一款功能齐全的小游戏。
下载Pygame是根据自己的系统环境来下载(我的是Python3),大致记录一下分别在Linux、Windows、OS X里安装Pygame。

首先检查一下是否安装pip,在终端中输入pip --version。如果已经安装则会显示其当前版本pip 7.0.3 from /usr/local/lib/python3.5/dist-packages (python 3.5)。如果出现了错误消息,请尝试将pip替换为pip3。如果执行这两个命令时都出现错误消息,则需要安装pip。
要安装pip,请访问https://bootstrap.pypa.io/get-pip.py。如果出现对话框,请选择保存文件;
如果get-pip.py的代码出现在浏览器中,请将这些代码复制并粘贴到文本编辑器中,再将文件保存
为get-pip.py。将get-pip.py保存到计算机中后,你需要以管理员身份运行它,因为pip将在你的系
统中安装新包。

安装pip

可以使用pip来安装Pygame,大部分的Python版本都安装了pip。

Windows下安装pip,使用下面的命令运行get-pip.py:
         python get-pip.py

执行命令python -m pip --versio 确认安装成功

在Linux和OS X下安装pip

使用下面的命令以管理员身份运行get-pip.py:

      sudo python get-pip.py

执行命令pip --version 确认安装成功

安装Pygame

LInux下安装Pygame

安装Pygame依赖的库;下载并安装Pygame。
执行下面的命令来安装Pygame依赖的库(python3)

$ sudo apt-get install python3-dev mercurial
$ sudo apt-get install libsdl-image1.2-dev libsdl2-dev libsdl-ttf2.0-dev

如果要添加其他高级功能,如声音的功能,可安装下面额外的库

$ sudo apt-get install libsdl-mixer1.2-dev libportmidi-dev
$ sudo apt-get install libswscale-dev libsmpeg-dev libavformat-dev libavcode-dev
$ sudo apt-get install python-numpy

接下来,执行下面的命令来安装Pygame(如有必要,将pip替换为pip3):

$ pip install --user hg+http://bitbucket.org/pygame/pygame

检查是否安装成功,执行下面操作,若无报错则安装成功:

$ python3
>>> import pygame
>>>
在OS X 系统中安装 Pygame

为安装Pygame依赖的库,请执行下面的命令:

$ brew install hg sdl sdl_image sdl_ttf

如果你还想启用较高级的功能,如在游戏中包含声音,可安装下面两个额外的库:`

$ brew install sdl_mixer portmidi
$ pip3 install --user hg+http://bitbucket.org/pygame/pygame

检查是否安装成功,执行下面操作,若无报错则安装成功:

$ python3
>>> import pygame
>>>
在 Windows 系统中安装 Pygame

访问
https://bitbucket.org/pygame/pygame/downloads/,查找与你运行的Python版本匹配的Windows安装程序
下载合适的文件后,如果它是.exe文件,就运行它。
如果该文件的扩展名为.whl,就将它复制到你的项目文件夹中。再打开一个命令窗口,切换到该文件所在的文件夹,并使用pip来运行它:

> python -m pip install --user pygame-1.9.2a0-cp35-none-win32.whl

开始项目

创建窗口

首先需要有一个窗口,并且设置窗口的背景颜色
创建文件 goodle_jump.py

import sys
import pygamedef run_game():""""初始化游戏并创建一个窗口"""# 初始化背景设置pygame.init()# 创建显示窗口screen = pygame.display.set_mode((400, 600))pygame.display.set_caption('Goodle Jump')# 设置背景颜色bg_color=(230,230,230)# 开始游戏主循环while True:# 监视键盘和鼠标事件for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 每次循环都要重绘屏幕screen.fill(bg_color)# 让最近绘制的图像可见pygame.display.flip()run_game()

添加设置类

创建设置类并将goodle_jump文件里的固定值替换
创建文件settings.py

class Settings():"""储存游戏的所有设置"""def __init__(self):"""初始化游戏设置"""# 屏幕设置self.screen_width=400self.screen_height=600self.screen_color=(230,230,230)

添加涂鸦图像

创建Graffiti类

import pygameclass Graffiti():def __init__(self,screen):"""初始化涂鸦并设置其初始位置"""self.screen=screen# 加载涂鸦图像并获取其外接矩形self.image=pygame.image.load('images/Ainsley.bmp')self.rect=self.image.get_rect()self.screen_rect=screen.get_rect()# 将涂鸦放在屏幕底部中央self.rect.centerx=self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomdef blitme(self):"""在指定位置绘制涂鸦"""self.screen.blit(self.image,self.rect)

并在goodle_jump中的主循环前创建一个graffiti并在主循环中调用blitme()

graffiti=Graffiti(screen)# 开始游戏主循环while True:# 监视键盘和鼠标事件for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 每次循环都要重绘屏幕screen.fill(bg_color)graffiti.blitme()

重构主循环

创建模块game_functions,在模块中创建check_events()方法,将主循环中键盘和鼠标的监控代码挪进去,,创建update_screen()方法,将主循环中屏幕更新代码挪进去,在主循环原位置分别两个调用

左右移动

在graffiti中增加moving_right和moving_left两个属性,作为移动标志来表示是否左右移动,初始时为False,当点击左右按键时为True,用来判断并移动graffiti

  # 移动标志self.moving_right = Falseself.moving_left = False

在graffiti中创建update(),根据移动标志来使graffiti进行移动

  def update(self):if self.moving_right:self.rect.centerx += 1elif self.moving_left:self.rect.centerx -= 1

在game_functions模块中的check_events方法的按键监控中增加左右按键判断以及对移动标志进行赋值

 if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:graffiti.moving_right=Trueelif event.key == pygame.K_LEFT:graffiti.moving_left=Trueelif event.type == pygame.KEYUP:if event.key == pygame.K_RIGHT:graffiti.moving_right=Falseelif event.key == pygame.K_LEFT:graffiti.moving_left=False

最后在主循环中调用graffiti的update()

     # 监视键盘和鼠标事件--gf.check_events(graffiti)--graffiti.update()# 更新屏幕--gf.update_screen(ai_settings, screen, graffiti)--

调整Graffiti移动速度

在settings中增加移动速度属性

# 移动速度self.graffiti_speed_factor=0.3

在Graffiti的初始化中引入settings(记得在调用时也添加上ai_settings参数)

    def __init__(self, screen, ai_settings):"""初始化涂鸦并设置其初始位置"""self.screen = screenself.ai_settings = ai_settings

将self.rect.centerx转为一个小数保存在self.center中

# 设置cenrer属性保存小数值self.center = float(self.rect.centerx)

最后在update方法中将原先的赋值修改为给self.center赋值。最后将self.center的值赋给self.rect.centerx中

    def update(self):# 更新center值,最后将center值赋给self.rect.cenrerx中if self.moving_right:self.center += self.ai_settings.graffiti_speed_factorelif self.moving_left:self.center -= self.ai_settings.graffiti_speed_factorself.rect.centerx = self.center

修改涂鸦活动范围

因为现在会一直向左或右移动直至消失不见。我需要当它到达最右边时不会消失而是出现在最左边,反之亦然。
修改update方法

    def update(self):# 更新center值,最后将center值赋给self.rect.cenrerx中if self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.ai_settings.graffiti_speed_factorelif self.moving_left and self.rect.left > 0:self.center -= self.ai_settings.graffiti_speed_factorelif self.moving_right and self.rect.right == self.screen_rect.right:self.center = 0elif self.moving_left and self.rect.left == 0:self.center = self.screen_rect.rightself.rect.centerx = self.center

重构响应方法

将响应按键和响应松开的代码分别写入新的函数 check_keydown_events()和check_keyup_events()并在原位置调用

小结:前面的实现了游戏窗口、背景、人物的移动以及一些基础的设置。这个游戏参考中的外星人大战项目,前面部分基本一致,接下来就有所不同了,下面需要实现涂鸦跳跃中的踏板以及让小涂鸦在踏板上跳跃。

实现踏板

在settings中配置踏板属性

 # 踏板设置self.pedal_width = 70self.pedal_height = 15self.pedal_color = 110, 182, 22self.pedal_num = 15# 踏板高度间隙self.pedal_gap = 45

创建pedal类

import pygame
from pygame.sprite import Spriteclass Pedal(Sprite):"""一个对踏板管理的类"""def __init__(self, ai_settings, screen):super().__init__()self.screen = screen# 在(0,0)处生成一个踏板,再设置其位置self.rect = pygame.Rect(0, 0, ai_settings.pedal_width, ai_settings.pedal_height)self.rect.centerx = screen.get_rect().centerxself.rect.bottom = self.screen.get_rect().bottomself.color = ai_settings.pedal_colordef draw_pedal(self):"""在屏幕上绘制踏板"""pygame.draw.ellipse(self.screen, self.color, self.rect)

在game_functions中新增方法update_pedal,根据设置随机生成多个踏板、踏板位置水平随机高度递增。

import random
--ship--
def update_pedal(pedals, ai_settings, screen):pedal = Pedal(ai_settings, screen)pedals.add(pedal)for num in range(ai_settings.pedal_num):pedal = Pedal(ai_settings, screen)pedal.rect.centerx = random.randint(0, ai_settings.screen_width)pedal.rect.bottom = screen.get_rect().bottom - ai_settings.pedal_gap * numpedals.add(pedal)print(pedals)

在goodle_jump中生成一个踏板编组并调用update_pedal方法

from pygame.sprite import Group
--ship--# 创建一个保存所有踏板的编组pedals = Group()gf.update_pedal(pedals, ai_settings, screen)# 开始游戏主循环

在game_functions的update_screen方法中增加绘制踏板

    --screen.fill(ai_settings.bg_color)--for pedal in pedals.sprites():pedal.draw_pedal()--graffiti.blitme()---- # 让最近绘制的图像可见---- pygame.display.flip()--

提示:记得在原有调用方法中添加所需的参数,这时候运行的话基本上可以看到这样的界面

实现跳跃

 实现跳跃其实花了不少时间(主要是我比较笨,想不到好的办法,最终只能使用笨办法了,如果有好的办法希望能够多多指点)。在settings中添加跳起高度速度和踏板的跳起高度,用来实现跳跃
     # 跳起高度速度self.graffiti_jump_factor = 0.05# 踏板的跳起高度self.pedal_jump_height = 60

在graffiti的init中增加属性

# 向上跳跃标志self.moving_top = True# 当次跳跃的距离self.moving_topNum = 0# 距离窗口底部的距离self.moving_fraction = 0

新建跳跃方法(根据跳跃标志来判断向上还是向下,根据settings中设定的跳跃高度来限制每次跳跃的距离,在向下时检测膨胀,根据当时的bottom和当个踏板的top来判断是否成功跳上去,成功则给当前涂鸦赋值最新的bottom)

 def jump(self, ai_settings, pedals):if self.moving_top:self.moving_topNum += ai_settings.graffiti_jump_factorself.rect.bottom = self.screen_rect.bottom - ai_settings.pedal_height - \self.moving_topNum - self.moving_fractionif round(self.moving_topNum) == ai_settings.pedal_jump_height:self.moving_top = Falseelif self.moving_top is False:self.moving_topNum -= ai_settings.graffiti_jump_factorself.rect.bottom = self.screen_rect.bottom + ai_settings.pedal_height \- self.moving_topNum - self.moving_fraction# 向下移动时判断碰撞collisions = pygame.sprite.spritecollideany(self, pedals, False)if collisions:# if self.rect.bottom == collisions.rect.top:if self.rect.bottom - collisions.rect.top == 1:self.moving_topNum = 0self.moving_fraction = self.screen_rect.bottom - self.rect.bottomself.moving_top = True

在update中调用,并提供所需参数

    def update(self, ai_settings, pedals):# 更新center值,最后将center值赋给self.rect.cenrerx中# 在踏板跳跃self.jump(ai_settings, pedals)----ship----

目前,小涂鸦可以正常向上踏着踏板跳跃,但是有很多问题,首先窗口并没有跟着涂鸦变化,跳到最顶端后会消失不见,其次后续也没有新的踏板。

窗口跟随及增加新踏板

窗口跟随我的做法是将所有的踏板向下移动,实现为涂鸦向上不断跳跃的效果(肯定会有更好的办法,只是我暂时想不到,脑子不太好使

Python---涂鸦跳跃相关推荐

  1. 2021级C语言大作业 - 涂鸦跳跃

    分享21级同学大一上学期用C语言(及少量C++)实现的涂鸦跳跃游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://pan.baidu. ...

  2. cocos creator 做一个涂鸦跳跃

    cocos creator 做一个涂鸦跳跃 问题1:如何实现主角跟随 问题2:如何实现向上跳动时,所有跳板都能穿透,向下掉落时,所有跳板都能弹起 问题3:如果实现不同跳板有不同的弹跳高度 问题4:如何 ...

  3. 10676 涂鸦跳跃(sort)

    10676 涂鸦跳跃 该题有题解 时间限制:1000MS  内存限制:65535K 提交次数:240 通过次数:19 题型: 编程题   语言: G++;GCC Description 你玩过曾经风靡 ...

  4. 用c++写的 涂鸦跳跃 小游戏

    源码下载地址请留言 涂鸦跳跃 c++

  5. Java 涂鸦跳跃,涂鸦跳跃怎么玩-涂鸦跳跃触屏版的怎么玩啊?

    涂鸦跳跃(涂鸦跳跃),是一个非常有趣的技巧游戏,倾斜你的手机左,右,使小怪兽春天涂鸦不停跳,降不下来,跳跃是在破平台小心,移动的蓝色平台,黑色孔,不明飞行物和坏人,途中有快速上升的火箭和竹蜻蜓,这是一 ...

  6. 涂鸦跳跃 java,涂鸦跳跃java

    你好,我是[心事会变成天上的星星],很高兴为你解答.涂鸦跳跃(Doodle Jump),是一个富有趣味的技巧性游戏,左右倾斜你的手机让涂鸦弹簧小怪物不停地往上跳跃而不掉下来,在跳跃中要小心破碎的平台. ...

  7. Java 涂鸦跳跃,涂鸦跳跃java版

    涂鸦跳跃java版,一款趣味性十足的休闲闯关小游戏,在这款java版本中小伙伴们可以体验到更加有意思的闯关乐趣,大家在这里不断的练习调谑的技巧,灵活躲避上方出现的障碍物,同时还有各种道具的刷新出现帮助 ...

  8. 实现类似涂鸦跳跃的游戏(对象池的使用和背景固定)

    --个人学习笔记 对象池的使用原理,就是把一些类似的物体一次性生成一堆,然后设置未激活状态,然后使用就激活,不适用就放回对象池,再次设置未激活.能使用范围就是,要频繁地删除生成的对象. Gameman ...

  9. html跳一跳小游戏,HTML5涂鸦跳跃(Doodle Jump)小游戏

    JavaScript 语言: JaveScriptBabelCoffeeScript 确定 // RequestAnimFrame: a browser API for getting smooth ...

  10. 【unity】分享一个2D小游戏的完整制作教程——涂鸦跳跃demo

    文章目录 前言 1.贴图准备 跳板的逻辑 人物的逻辑 相机的逻辑 如何自动生成跳板 如何赢得游戏 前言 这个只是练手的一个2D小游戏,不许商用哦 完成了原版的一个关卡的内容,跳板也只有一种,但是如果需 ...

最新文章

  1. STM8单片机串口驱动的深度解析
  2. 混淆矩阵是什么?Python多分类的混淆矩阵计算及可视化(包含原始混淆矩阵及归一化的混淆矩阵):基于skelarn框架iris数据集
  3. 付睿:对新事物的追寻之旅 | 优秀毕业生专访
  4. Web 标准实践系列(一)——Google 的首页
  5. boost::spirit模块使用 phoenix 对逗号分隔的数字列表求和的解析器
  6. 伊利诺伊香槟分校计算机科学,伊利诺伊大学香槟分校计算机科学与信息系统世界排名2019年最新排名第31(QS世界排名)...
  7. C#微信公众号开发系列教程五(接收事件推送与消息排重)
  8. JXTA中定义自己的成员服务
  9. 【微信小程序模板直接套用】微信小程序制作模板套用平台
  10. 帆软认证报表工程师FCRA试题
  11. wifi分析仪怎么看哪个信道好_无线路由器设置选择哪条信道比较好
  12. LeetCode——自除数
  13. monit 内存 监控_mac系统监控软件Monity for Mac
  14. css 的 calc() 方法
  15. Linux核心命令汇总(思维导图+实例讲解)
  16. custom的短语_custom到底是什么意思?
  17. u盘安装盘的制作汇总
  18. 柠萌影业三次冲刺IPO,爆款制造机的压力大爆了
  19. 两个空间(N维欧氏空间、Lebesgue空间)的Holder不等式
  20. Redis无法启动的原因以及解决方案

热门文章

  1. 学习模式上的记录之统计篇三 置换检验 Permutation Test
  2. [渝粤教育] 中国地质大学 企业文化建设与管理 复习题 (2)
  3. 软件工程实验报告二模板
  4. 用python编写文本进度条
  5. 第七章:Qt设计师使用(designer)
  6. 中科大计算机考研英语,中科大计算机考研复试英语.doc
  7. 麦克纳姆轮底盘-正反向运动学-里程估计
  8. 爬虫如何解决反爬问题——顶象面积验证码破解
  9. 干货!TPAUC指标的end-to-end 优化方法
  10. SolidWorks零件库在哪里?如何在SolidWorks中添加零件库?