python 贪吃蛇小游戏代码_10分钟再用Python编写贪吃蛇小游戏
Python编写贪吃蛇
前不久我们公众号发布了一篇C++编写贪吃蛇小游戏的推文,反响空前。看来大家对这类简单易上手小游戏还是很喜爱的。
恰逢2018年IEEE Spectrum编程语言排行榜新鲜出炉,Python蝉联冠军宝座,C++和C语言分获亚、季军。
于是我们决定趁热打铁,推出贪吃蛇小游戏的Python版本。大家一起来看看吧~
效果展示
由于目前还没有加入AI功能,所以我们只展示人工演示下的贪吃蛇小游戏界面
GIF经过加速处理
结束界面
思路简介
所有的游戏最主要的内容都是程序的内循环,这才是保证一个游戏能够正常运行的前提。
以下是编写贪吃蛇小游戏的主要思路。
废话不多说,我们直接来讲解如何利用Python进行贪吃蛇的编写吧
1.调用库以及初始设置
1.1 调用第三方库
Python与其他语言很不一样的一点在于他有很多的第三方库可以调用。在Python编写游戏时,pygame是一个很简单上手的第三方库,可以通过pip直接安装。安装方法在之前的文章中已经讲过,就不再赘述。想要了解更多pygame功能的朋友也可以查阅官方的文档。
这就是编写贪吃蛇时我们需要调用的库。
1import pygame2import sys3import time4import random5from pygame.locals import *
1.2 初始设置
我们通过这几行代码来初始化pygame,定义窗口(边界)的大小,窗口的标题和图标。
1 # 初始化pygame 2 pygame.init() 3 fpsClock = pygame.time.Clock() 4 5 # 创建pygame显示层 6 playSurface = pygame.display.set_mode((640, 480)) 7 # 定义标题 8 pygame.display.set_caption('Snake Go!') 9 # 加载资源图片,game.ico包含在最后的文件中10 image = pygame.image.load('game.ico')11 # 设置图标12 pygame.display.set_icon(image)
1.3 定义颜色变量
由于我们需要用到一些颜色,而Python是不自带的。所以我们需要定义几个颜色。
1redColour = pygame.Color(255,0,0)2blackColour = pygame.Color(0,0,0)3whiteColour = pygame.Color(255,255,255)4greyColour = pygame.Color(150,150,150)5LightGrey = pygame.Color(220,220,220)
2.GameOver
之前提到,所有游戏最重要的部分是循环。而GameOver函数就是跳出这个循环的条件。这里给出当蛇吃到自己身体或者碰到边界时显示的界面(判断死亡的代码会在之后展示)
1# 定义gameOver函数 2def gameOver(playSurface, score): 3 # 显示GAME OVER并定义字体以及大小 4 gameOverFont = pygame.font.Font('arial.ttf', 72) 5 gameOverSurf = gameOverFont.render('Game Over', True, greyColour) 6 gameOverRect = gameOverSurf.get_rect() 7 gameOverRect.midtop = (320, 125) 8 playSurface.blit(gameOverSurf, gameOverRect) 9 # 显示分数并定义字体和大小10 scoreFont = pygame.font.Font('arial.ttf', 48)11 scoreSurf = scoreFont.render('SCORE: ' + str(score), True, greyColour)12 scoreRect = scoreSurf.get_rect()13 scoreRect.midtop = (320, 225)14 playSurface.blit(scoreSurf, scoreRect)15 pygame.display.flip() # 刷新显示界面16 # 休眠5秒后自动关闭17 time.sleep(5)18 pygame.quit()19 sys.exit()
3.贪吃蛇与树莓
接下来介绍游戏的主题部分,即贪吃蛇与蛇莓的显示以及运动。
3.1 定义初始位置
我们将整个界面看成许多20*20的小方块,每个方块代表一个单位,蛇的长度就可以用几个单位表示啦。这里蛇的身体用列表的形式存储,方便之后的删减。
1 # 初始化变量2 snakePosition = [100, 100] # 蛇头位置3 snakeSegments = [[100, 100], [80, 100], [60, 100]] # 初始长度为3个单位4 raspberryPosition = [300, 300] # 树莓位置5 raspberrySpawned = 1 # 树莓个数6 direction = 'right' # 初始方向7 changeDirection = direction8 score = 0 # 初始分数
3.2 键盘输入判断蛇的运动
我们需要通过键盘输入的上下左右键或WASD来控制蛇类运动,同时加入按下Esc就退出游戏的功能。
1 # 检测例如按键等pygame事件 2 for event in pygame.event.get(): 3 if event.type == QUIT: 4 pygame.quit() 5 sys.exit() 6 elif event.type == KEYDOWN: 7 # 判断键盘事件 8 if event.key == K_RIGHT or event.key == ord('d'): 9 changeDirection = 'right'10 if event.key == K_LEFT or event.key == ord('a'):11 changeDirection = 'left'12 if event.key == K_UP or event.key == ord('w'):13 changeDirection = 'up'14 if event.key == K_DOWN or event.key == ord('s'):15 changeDirection = 'down'16 if event.key == K_ESCAPE: # 按esc退出游戏17 pygame.event.post(pygame.event.Event(QUIT))
贪吃蛇运动有一个特点:不能反方向运动。所以我们需要加入限制条件。
1 # 判断是否输入了反方向2 if changeDirection == 'right' and not direction == 'left':3 direction = changeDirection4 if changeDirection == 'left' and not direction == 'right':5 direction = changeDirection6 if changeDirection == 'up' and not direction == 'down':7 direction = changeDirection8 if changeDirection == 'down' and not direction == 'up':9 direction = changeDirection
接下来就是将蛇头按照键盘的输入进行转弯操作,并将蛇头当前的位置加入到蛇身的列表中。
1 # 根据方向移动蛇头的坐标 2 if direction == 'right': 3 snakePosition[0] += 20 4 if direction == 'left': 5 snakePosition[0] -= 20 6 if direction == 'up': 7 snakePosition[1] -= 20 8 if direction == 'down': 9 snakePosition[1] += 201011 # 将蛇头的位置加入列表之中12 snakeSegments.insert(0, list(snakePosition))
3.3 判断是否吃到树莓
如果蛇头与树莓的方块重合,则判定吃到树莓,将树莓数量清零;而没吃到树莓的话,蛇身就会跟着蛇头运动,蛇身的最后一节将被踢出列表。
1 # 判断是否吃掉了树莓2 if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]:3 raspberrySpawned = 04 else:5 snakeSegments.pop() # 每次将最后一单位蛇身踢出列表
3.4 重新生成树莓
当树莓数量为0时,重新生成树莓,同时分数增加。
1 # 如果吃掉树莓,则重新生成树莓2 if raspberrySpawned == 0:3 x = random.randrange(1, 32)4 y = random.randrange(1, 24)5 raspberryPosition = [int(x*20), int(y*20)]6 raspberrySpawned = 17 score += 1
3.5 刷新显示层
每次蛇与树莓的运动,都会进行刷新显示层的操作来显示。有点类似于动画的“帧”。
1 # 绘制pygame显示层2 playSurface.fill(blackColour)3 for position in snakeSegments[1:]: # 蛇身为白色4 pygame.draw.rect(playSurface, whiteColour, Rect(position[0], position[1], 20, 20))5 pygame.draw.rect(playSurface, LightGrey, Rect(snakePosition[0], snakePosition[1], 20, 20)) # 蛇头为灰色6 pygame.draw.rect(playSurface, redColour, Rect(raspberryPosition[0], raspberryPosition[1], 20, 20)) # 树莓为红色7 # 刷新pygame显示层8 pygame.display.flip()
3.6 判断是否死亡
当蛇头超出边界或者蛇头与自己的蛇身重合时,蛇类死亡,调用GameOver。
1 # 判断是否死亡2 if snakePosition[0] > 620 or snakePosition[0] 0: # 超出左右边界3 gameOver(playSurface, score)4 if snakePosition[1] > 460 or snakePosition[1] 0: # 超出上下边界5 gameOver(playSurface, score)6 for snakeBody in snakeSegments[1:]: # 蛇碰到自己身体7 if snakePosition[0] == snakeBody[0] and snakePosition[1] == snakeBody[1]:8 gameOver(playSurface, score)
3.7 控制游戏速度
为了增加难度,我们设置蛇身越长速度越快,直到达到一个上限。
1 # 控制游戏速度,长度越长速度越快2 if len(snakeSegments) 40:3 speed = 6 + len(snakeSegments)//44 else:5 speed = 166 fpsClock.tick(speed)
代码获取
至此,一个Python编写贪吃蛇小游戏的工作就全部完成啦。如果想获取代码,请移步留言区。即可下载。
-- the end --
python 贪吃蛇小游戏代码_10分钟再用Python编写贪吃蛇小游戏相关推荐
- python turtle画四叶草的步骤_10分钟轻松学会 Python turtle 绘图
先说明一下turtle绘图的基础知识: 1. 画布(canvas) 画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置 1.1 设置画布大小 turtle.screensiz ...
- c++编写手机小游戏代码_玩过自己开发的贪吃蛇吗?点这里,教你用Python写一个贪吃蛇小游戏!(附源代码)...
后台回复'0816',加入Python交流群~ 往日回顾:Python必读好书,这9本份量十足~ 本文代码的实现效果,获取源代码,请直接滑到文末~都说Python除了生孩子,什么都能干.咱们今天,就用 ...
- python飞机游戏视频教程_10分钟教你用Python做个打飞机小游戏超详细教程
01 前言 这次还是用python的pygame库来做的游戏.关于这个库的内容,读者可以上网了解一下.本文只讲解用到的知识.代码参考自网上,自己也做了一点代码简化.尽量把最核心的方面用最简单的方式呈现 ...
- python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)
经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...
- python拼图游戏代码_教你用Python自制拼图小游戏,轻松搞定熊孩子
摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...
- python3小游戏代码教程_Python3制作仿“经典90坦克大战”小游戏|python3教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随 ...
- python适合开发游戏吗_【学习python小游戏代码,你就可以做python滑雪游戏了】- 环球网校...
[摘要]很多人开始学习编程都会选择python,并且也会将python用在实际生活中,不过有很多伙伴也打算用python做游戏,所以小编建议大家可以学习python小游戏代码,今天环球网校的小编就来和 ...
- 用python编写猜成语游戏_10分钟学会用python写游戏!Python其实很简单!
安装pygame 本人电脑是windows 10.python3.6,pygame下载地址:https://pypi.python.org/pypi/Pygame/1.9.3 请自行下载对应pytho ...
- pythonturtle简单绘图_10分钟轻松学会 Python turtle 绘图
10分钟轻松学会 Python turtle 绘图 python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即 ...
最新文章
- 想搞自动识别系统的应用程序,希望能跟有志于此的朋友交流
- 视觉稿与H5页面之间的终端适配
- linux硬盘拷贝系统,教你在第二块硬盘上拷贝安装Linux系统
- linux求文件共有行。多个文件求共有行交集完全匹配-w
- spring中的BeanPostProcessor
- lr与svm如何选择-面试
- 哈工大未来计算机院士,2017年中国高校新增工程院院士名单出炉,哈工大依然很强!...
- cutterman工具使用 0921
- 正坐标系及矢量知识,点乘与差乘,旋转
- Oracle Grid 下载地址
- AngularJS页面【uib-dropdown】控件在模态窗口(弹出窗)中无法使用问题
- Unity资源打包(AssetBundle)
- Swift 读写 plist 文件
- 数学模型之最小二乘法
- XHTML的目标,规则和细节
- 计算机键盘输入法基础知识,3、使用键盘打字 --电脑基础知识
- 自己动手搭建一个简单的基于Hadoop的离线分析系统之一——网络爬虫
- 转:elasticsearch下载太慢在国内, 我把包放到了云盘上,还有kibana,logstash.有需要自取,持续更新版本
- 小米路由器安装mysql_小米路由器安装和设置方法(图文教程)
- 中国劳动力动态调查数据(CLDS)2011-2018年
热门文章
- Struct 和 Class 性能有差异吗?自己测试
- java case switch,Java中Switch Case的替代方案
- Java中的实现马赛克效果以及灰度效果----整张图片
- cross_val_score,cross_val_predict,cross_validate理解
- python获取文件路径
- CountDownLatch 的 .await() 的线程阻塞 和countDown() 计时唤醒
- 各种远程通信协议比较RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等
- tf.contrib.layers.fully_connected详解
- 很好的理解梯度 散度 旋度 下三角运算 费曼物理讲义
- AI Debate2 | 李飞飞提「AI北极星」,卡尼曼指「系统 1」理解有误