Python谷歌小恐龙--Pygame
文章目录
- Python谷歌小恐龙(持续更新,未完结)
- 前言
- 正文
- 创建窗口
- 添加静态背景图
- 添加静态小恐龙
- 让小恐龙动起来
- 程序小优化(增加小知识)
- 背景动起来
- 小恐龙跳跃(代码大改,做好心理准备)
Python谷歌小恐龙(持续更新,未完结)
前言
- 第一次写博客,可能有些写得不太好的地方,欢迎各位看官踊跃提意见和建议。
- 我写这篇博客的出发点是在于用简单明了的代码去和大家分享我写代码的过程,希望对大家有所帮助。
- 如果大家有需求的话也可联系我,我也可以接一些课设之类的小项目。+v:Ts_liyun
- 此外本文也是我本人学习的一个过程,其中有些参考文章会在文中或者文末列出。
首先我们想达到最终的效果是这样的。
想试玩的话,谷歌浏览器可以直接输入网址打开:chrome://dino
其余浏览器可以用这个网址:https://dino.zone/zh-cn/
如果大家对这个游戏感兴趣并且想通过自己的双手编写出来的话那我们就继续往下看吧。同时也推荐看这篇文章并且想学的朋友注意观察前后代码的区别。由于这个游戏我是自己慢慢想的(没有参考任何小恐龙跳跃游戏的代码),我也会在里面加入一些我自己的想法,因此可能我的思路并不适合每一个人,但我也依然希望你能从中学到一些有用的东西。
那么废话不多说我们开始吧。
正文
接下来我将按照步骤一步步来展示我编写这个游戏的过程。
文章中我将采用先将结果用图片显示再解释代码的形式为大家叙述。
此外,推荐在看本文之前应掌握Python这门语言的一些基本的语法,以及对Pygame这个库有一些初步的了解,我本人推荐看这篇博客:Python游戏编程(Pygame)
创建窗口
既然要写一个游戏,那我们肯定需要一个窗口显示。
首先通过Pygame内置的函数创建出一个窗口。
import pygame
import syspygame.init() # 初始化pygame
size = width, height = 734, 286 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口while True: # 死循环确保窗口一直显示for event in pygame.event.get(): # 遍历所有事件if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出sys.exit()
关于窗口框的大小我是根据小恐龙背景的图片的大小设计的。
添加静态背景图
接下来我们将背景导入。
import pygame
import syspygame.init() # 初始化pygame
size = width, height = 734, 286 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口background = pygame.image.load('D:/project/Python/PDL_Python/pygame/dragon/picture/background1.png') # 加载图片
backgroundrect = background.get_rect() # 获取矩形区域while True: # 死循环确保窗口一直显示for event in pygame.event.get(): # 遍历所有事件if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出sys.exit()screen.blit(background, backgroundrect) # 将图片画到窗口上pygame.display.flip() # 更新全部显示
可以点击此处,从网盘中获取这个小游戏的相关图片。提取码:88iw
这里导入的是background1这张图片,你也可以导入background2,取决于你的心情。记得更换代码中的图片路径,上述代码中是我电脑中的直接地址。
添加静态小恐龙
接着我们让主角小恐龙登场。
import pygame
import syspygame.init() # 初始化pygame
size = width, height = 734, 286 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口background = pygame.image.load('D:/project/Python/PDL_Python/pygame/dragon/picture/background1.png') # 加载图片
backgroundrect = background.get_rect() # 获取矩形区域dragon = pygame.image.load('D:/project/Python/PDL_Python/pygame/dragon/picture/dragon1.png')
dragonrect = dragon.get_rect()
dragonrect = dragonrect.move(50,210)while True: # 死循环确保窗口一直显示for event in pygame.event.get(): # 遍历所有事件if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出sys.exit()screen.blit(background, backgroundrect) # 将图片画到窗口上screen.blit(dragon, dragonrect)pygame.display.flip() # 更新全部显示
导入图片时我们会发现小恐龙是在“天上”的,因此我们需要使用move函数将其移动到“地上”。
让小恐龙动起来
刚刚我们插入图片后发现小恐龙是在地上不动的,那么接下来我们就尝试让这个小恐龙运动起来。如果我们玩过这个游戏的话我们会发现小恐龙运动可拆分为两个步骤,第一部分是让小恐龙原地踏步,第二步则是让背景往左移。我们先完成第一部分:
import pygame
import syspygame.init() # 初始化pygame
size = width, height = 734, 286 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
clock = pygame.time.Clock()background = pygame.image.load('D:/project/Python/PDL_Python/pygame/dragon/picture/background1.png') # 加载图片
backgroundrect = background.get_rect() # 获取矩形区域dragon1 = pygame.image.load('D:/project/Python/PDL_Python/pygame/dragon/picture/dragon1.png')
dragon2 = pygame.image.load('D:/project/Python/PDL_Python/pygame/dragon/picture/dragon2.png')
dragonrect = dragon1.get_rect()
dragonrect = dragonrect.move(50,210)flag = True
while True: # 死循环确保窗口一直显示clock.tick(6)for event in pygame.event.get(): # 遍历所有事件if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出sys.exit()screen.blit(background, backgroundrect) # 将图片画到窗口上if flag == True:screen.blit(dragon1, dragonrect)else:screen.blit(dragon2, dragonrect)flag = not flagpygame.display.flip() # 更新全部显示
小恐龙原地踏步的原理是将两张图片在背景中循环播放。
程序小优化(增加小知识)
为了让下载的用户可以下载下来就使用,不需要下载代码后还需要更改地址等操作才能使用,因此特地更新一下代码。更新内容如下:
- 将注释更加完善。如果看不懂可以私信或者留言,我会持续改善。
- 使用OS库,读取文件当前目录,并合并成图片所在地址,这样读取图片时无需频繁更改路径,只需保证下载时整个文件夹保持一致就行。
代码如下:
import pygame
import sys
import os#获取当前文件的目录,方便在别的电脑运行时读取相应文件
Current_path = os.path.join(os.getcwd(), 'pygame', 'dragon', 'picture')
Current_path = Current_path.replace('\\', '/')pygame.init() # 初始化pygame
size = width, height = 734, 286 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
clock = pygame.time.Clock() #创建一个时间对象用于控制游戏运作的快慢background = pygame.image.load(Current_path + '/background1.png') # 加载图片
backgroundrect = background.get_rect() # 获取矩形区域dragon1 = pygame.image.load(Current_path + '/dragon1.png')
dragon2 = pygame.image.load(Current_path + '/dragon2.png')
dragonrect = dragon1.get_rect()
dragonrect = dragonrect.move(50,210) #将小恐龙移动到“地上”flag = True #创建一个flag标志用于在循环中判断使用哪张图片
while True: # 死循环确保窗口一直显示clock.tick(6)for event in pygame.event.get(): # 遍历所有事件if event.type == pygame.QUIT: # 如果程序发现单击关闭窗口按钮sys.exit() #将窗口关闭screen.blit(background, backgroundrect) # 将背景图片画到窗口上#根据flag标志确定显示的图片,这样可以造成小恐龙在跑的现象if flag == True:screen.blit(dragon1, dragonrect)else:screen.blit(dragon2, dragonrect)flag = not flagpygame.display.flip() # 更新全部显示
背景动起来
小恐龙原地踏步在加上背景移动是不是就真正让小恐龙跑起来啦!
其实实现这一步的原理很简单,我用 Tkinter(Python自带的用户交互界面设计包)设计了一个动画演示。实际上就是两张背景在后面循环移动。
上面的图中,黑色框框代表我们游戏显示的画面,而红色和蓝色就分别是两个背景框,当我们让其“排着队”从程序窗口前滑过时就形成了背景运动的效果。
具体实现的方式是,我们去检测红色框的右边框,当其移出屏幕时,我们就让其瞬移到蓝色框后面,也就是将红色的左边框设置成和此时蓝色的左边框一致,可能有点绕,多看上面的动图就懂啦,当然,蓝色框我们也是如此操作。
下面代码改变内容为:
1、导入多一张背景图片以及设计多一个背景框
2、让背景实现循环移动(42-47行)
import pygame
import sys
import os#获取当前文件的目录,方便在别的电脑运行时读取相应文件
Current_path = os.path.join(os.getcwd(), 'picture')
Current_path = Current_path.replace('\\', '/')pygame.init() # 初始化pygame
size = width, height = 734, 286 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
clock = pygame.time.Clock() #创建一个时间对象用于控制游戏运作的快慢background1 = pygame.image.load(Current_path + '/background1.png') # 加载图片
background2 = pygame.image.load(Current_path + '/background2.png') # 加载图片
backgroundrect1 = background1.get_rect() # 获取矩形区域
backgroundrect2 = background2.get_rect() # 获取矩形区域
backgroundrect2[0] = backgroundrect1.rightdragon1 = pygame.image.load(Current_path + '/dragon1.png')
dragon2 = pygame.image.load(Current_path + '/dragon2.png')
dragonrect = dragon1.get_rect()
dragonrect = dragonrect.move(50, 210) #将小恐龙移动到“地上”flag = True #创建一个flag标志用于在循环中判断使用哪张图片
while True: # 死循环确保窗口一直显示clock.tick(6)for event in pygame.event.get(): # 遍历所有事件if event.type == pygame.QUIT: # 如果程序发现单击关闭窗口按钮sys.exit() #将窗口关闭screen.blit(background1, backgroundrect1) # 将背景图片画到窗口上screen.blit(background2, backgroundrect2)#根据flag标志确定显示的图片,这样可以造成小恐龙在跑的现象if flag == True:screen.blit(dragon1, dragonrect)else:screen.blit(dragon2, dragonrect)flag = not flagbackgroundrect1 = backgroundrect1.move(-10, 0) #将背景向左移动backgroundrect2 = backgroundrect2.move(-10, 0) #将背景向左移动if backgroundrect1.right < 0: #判断第一个背景框如果移动到了窗口外面backgroundrect1[0] = backgroundrect2.right #将第一个背景框移动到第二个背景框后面,形成循环if backgroundrect2.right < 0: #和上面同理,最终实现的效果就是两个图片排着队从窗口前划过backgroundrect2[0] = backgroundrect1.rightpygame.display.flip() # 更新全部显示
小恐龙跳跃(代码大改,做好心理准备)
在做小恐龙跳跃的时候我遇到了一个难题,如何将小恐龙跳跃的速度和背景移动的速度剥离开来,如果我们玩过那个游戏的话,不难发现,随着分数的增加,背景的移动速度会越来越快,但是小恐龙的跳跃速度是不会发生改变的,我们之前小恐龙踏步的速度其实是和背景移动的速度一样的,都由全局游戏速度来控制。因此我修改了大部分的代码,但我们逻辑始终没有变化,就是增加了定义类,这样更好的管理我们的代码,可以使得代码不在那么臃肿。
先上效果图:
现在的小恐龙已经能检测到按键按下就跳跃。
下面先放上代码,我再逐一讲解。
import pygame
import sys'''定义一个小恐龙的类'''
class Dragon:#小恐龙的默认参数def __init__(self):self.rectangle = pygame.Rect(50, 210, 40, 45) #小恐龙的边框,预先设计好就不需要移动到地上#定义小恐龙的两种状态(读取图片放在列表里)self.status = [pygame.image.load('./picture/dragon1.png'),pygame.image.load('./picture/dragon2.png')]self.Y_axis = 210 #小恐龙所在Y轴坐标self.jump_flag = False #跳跃标志,判断小恐龙是否跳跃self.jump_speed = 0 #小恐龙的跳跃速度,当为正的时候上升,为负的时候下降self.alive = True #生命状态,默认为活着self.jump_permission = True #小恐龙的跳跃权限,如果在空中时不给跳跃#更新小恐龙的状态def update(self):if self.jump_flag: #如果检测到按下跳跃self.jump_speed = 15 #将上升速度调为10self.jump_permission = False #跳跃期间不给小恐龙再次跳跃self.jump_flag = False #设置好后回复默认值等待下次跳跃if self.jump_speed != 0: #如果小恐龙的跳跃速度不为0,说明正在跳跃周期self.Y_axis -= self.jump_speed #移动小恐龙的Y坐标if self.Y_axis > 210: #防止将小恐龙移动到地下self.Y_axis = 210self.jump_permission = True #回到地上,允许跳跃self.rectangle[1] = self.Y_axis #将框真正移动if self.jump_permission == False: #如果此时不允许跳跃,即正在跳跃过程中self.jump_speed -= 1 #将速度降低,效果为上升越来越慢,下降越来越快'''定义一个地图的类'''
class Map:#默认参数def __init__(self):self.speed = 3self.background_1 = pygame.image.load('./picture/background1.png') # 加载图片self.background_2 = pygame.image.load('./picture/background2.png')self.background_rectangle_1 = self.background_1.get_rect() # 获取矩形区域self.background_rectangle_2 = self.background_2.get_rect()self.background_rectangle_2[0] = self.background_rectangle_1.rightdef update(self):self.background_rectangle_1 = self.background_rectangle_1.move(-self.speed, 0) #将背景向左移动self.background_rectangle_2 = self.background_rectangle_2.move(-self.speed, 0)if self.background_rectangle_1.right < 0: #判断第一个背景框如果移动到了窗口外面self.background_rectangle_1[0] = self.background_rectangle_2.right #将第一个背景框移动到第二个背景框后面,形成循环if self.background_rectangle_2.right < 0: #和上面同理,最终实现的效果就是两个图片排着队从窗口前划过self.background_rectangle_2[0] = self.background_rectangle_1.right# 定义一个更新画面的函数(这样做可能更合理)
flag = True #创建一个flag标志用于在循环中判断使用哪张图片
count = 0
def screen_update(jump_permission):'''更新背景'''screen.blit(map.background_1, map.background_rectangle_1) # 将背景图片画到窗口上screen.blit(map.background_2, map.background_rectangle_2)global countcount += 1count %= 100if jump_permission: #这个if语句是实现小恐龙踏步的if count % 15 == 0: #为了控制小恐龙踏步的速度'''更新小恐龙'''global flag#根据flag标志确定显示的图片,这样可以造成小恐龙在跑的现象if flag == True:screen.blit(dragon.status[0], dragon.rectangle)else:screen.blit(dragon.status[1], dragon.rectangle)flag = not flagelse:if flag == True:screen.blit(dragon.status[0], dragon.rectangle)else:screen.blit(dragon.status[1], dragon.rectangle)else: #如果在空中那就显示两个图片,效果就是两个脚都平行(没有太大意义)screen.blit(dragon.status[0], dragon.rectangle)screen.blit(dragon.status[1], dragon.rectangle) if __name__ == "__main__":pygame.init() # 初始化pygamescreen = pygame.display.set_mode([734, 286]) # 创建并显示窗口clock = pygame.time.Clock() #创建一个时间对象用于控制游戏运作的快慢map = Map() #创建地图实例dragon = Dragon() #创建小恐龙实例score = 0 #设置初始分数while True: # 死循环确保窗口一直显示clock.tick(60) #越大越快for event in pygame.event.get(): # 遍历所有事件if event.type == pygame.QUIT: # 如果程序发现单击关闭窗口按钮sys.exit() # 将窗口关闭if event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN:if dragon.jump_permission: #如果检测到按键按下并且当前允许跳跃dragon.jump_flag = Truemap.update() #更新地图元素框的位置dragon.update() ##更新小恐龙元素框的位置screen_update(dragon.jump_permission) #根据框显示图片#这部分暂时测试用 现在背景的移动速度和时间成正比score += 1if score % 100 == 0:map.speed += 0.5pygame.display.flip() # 更新全部显示
首先这涉及到了类的定义,如果不太懂的同学可以去看看别的教程,其大概就是给小恐龙和背景分别定义了类,其中每个类里有一些默认属性,以及更新(update函数)框的位置。如果有不懂的可以留言或私信,我在补充详细一些。
未完待续
接下来还要填了坑有:
1、加入障碍物
2、加入分数以及让分数和背景运动速度成正相关
Python谷歌小恐龙--Pygame相关推荐
- python 谷歌小恐龙自动跳跃
针对Cent Browser断网谷歌小恐龙,屏幕1920*1080. 关闭慢速模式. 第一版 仅仅是简单的检测像素点,像素点不一样就会跳跃 大约能到700分左右,因为700分左右会变色,变色过程中由于 ...
- python谷歌小恐龙,这还是你断网时的样子嘛~
导语:
- chrome谷歌小恐龙作弊代码【无敌,快跑,高跳,一键满分】有需要的小伙伴快快看过来!
谷歌小恐龙游戏是浏览器自带的,断网时候可以玩,当然联网状态也是可以玩的. 那么如何在联网的状态下进行游戏呢? 打开chrome, Ctrl + T 新建标签页,Alt + D或者Ctrl + L 定位 ...
- Java 独门绝技 用Java玩谷歌小恐龙游戏 (有源码)
目录 1.Swing成品演示 2.简介 3.Java的Robot类 4.实战开发例子 1.Swing成品演示 2.简介 Java有一个很厉害的类Robot类,这个类可以模仿人的手去操作电脑,鼠标移动, ...
- 谷歌小恐龙 T-Rex 之 物理外挂
快考试了, 做一个谷歌小恐龙的物理外挂玩玩(复习编程 拖延 效果视频: 谷歌小恐龙 T-Rex 之 物理外挂 随手记录一下过程: 材料: Tokymaker 5.0 的板子 Tokymaker 的光线 ...
- C++ 谷歌小恐龙#1 游戏制作实录
版本号:1.0 嗨,我是一块铌金属,新年快乐呀! 之前不是说啃了EGE库嘛,所以我打算做一个项目练练手. 做什么呢--?谷歌小恐龙! 谷歌小恐龙就是一款谷歌浏览器内置的小游戏--多的我就不说了,在谷歌 ...
- 谷歌小恐龙HTML源代码
啥也不说了,直接上代码 <!doctype html> <html><meta charset="utf-8"><meta name=&q ...
- 谷歌小恐龙更新啦!!!!!!(加入奥运会项目赛马,游泳,体操等)快来体验a哈哈哈哈哈哈哈哈
谷歌小恐龙更新啦!!!(加入奥运会项目赛马,游泳,体操等) 快来体验a哈哈哈哈哈哈哈哈 还是原来的进入方式 断网 或者直接输入网址 chrome://dino/ 进入页面摁下空格即可开始游戏 吃下火炬 ...
- Python游戏--小恐龙(与谷歌游戏相同)
相信大家都玩过谷歌的"小恐龙"游戏,用↑,↓键来控制恐龙,我也编了一款类似的游戏 游戏代码如下: import cfg import sys import random impor ...
最新文章
- Django 各类配置选项全集
- 如何使用SAP零售系统中的LISTING?
- Python——cmd调用(os.system阻塞处理)(多条命令执行)
- JMeter测试TCP/IP Socket应用的性能
- 批处理 操作mysql_超简单使用批处理(batch)操作数据库
- python123动物重量排序_python基本常识
- python中的数列[a::b]操作
- 曾经想学很多很多,最后发现自己只能专心学那么很少的几个必杀技
- 字符和编码之间的转换(Python)
- linux bind日志级别,BIND日志相关(一)
- 上新了三星堆!“金面具”网友P图大赛又双叒开始了……
- c++ mysql ctime_CTime::Format
- 台大李宏毅Machine Learning 2017Fall学习笔记 (2)Linear Regression and Overfitting
- ZooKeeper学习第七期--ZooKeeper一致性原理(转)
- 巧用层次坐标解决统计图分类轴与系列取值
- 燃料电池电池超级电容复合能量管理策略simulink仿真模型
- java blog 引擎_推荐10个Java开源CMS系统
- 博士申请 | 阿尔伯塔大学招收人工智能方向全奖博士生、硕士生
- RAC环境备份归档日志和RMAN恢复启动数据库
- C/C++指针的经典笔试面试题