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编写贪吃蛇小游戏相关推荐

  1. python turtle画四叶草的步骤_10分钟轻松学会 Python turtle 绘图

    先说明一下turtle绘图的基础知识: 1. 画布(canvas) 画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置 1.1 设置画布大小 turtle.screensiz ...

  2. c++编写手机小游戏代码_玩过自己开发的贪吃蛇吗?点这里,教你用Python写一个贪吃蛇小游戏!(附源代码)...

    后台回复'0816',加入Python交流群~ 往日回顾:Python必读好书,这9本份量十足~ 本文代码的实现效果,获取源代码,请直接滑到文末~都说Python除了生孩子,什么都能干.咱们今天,就用 ...

  3. python飞机游戏视频教程_10分钟教你用Python做个打飞机小游戏超详细教程

    01 前言 这次还是用python的pygame库来做的游戏.关于这个库的内容,读者可以上网了解一下.本文只讲解用到的知识.代码参考自网上,自己也做了一点代码简化.尽量把最核心的方面用最简单的方式呈现 ...

  4. python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)

    经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...

  5. python拼图游戏代码_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  6. python3小游戏代码教程_Python3制作仿“经典90坦克大战”小游戏|python3教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随 ...

  7. python适合开发游戏吗_【学习python小游戏代码,你就可以做python滑雪游戏了】- 环球网校...

    [摘要]很多人开始学习编程都会选择python,并且也会将python用在实际生活中,不过有很多伙伴也打算用python做游戏,所以小编建议大家可以学习python小游戏代码,今天环球网校的小编就来和 ...

  8. 用python编写猜成语游戏_10分钟学会用python写游戏!Python其实很简单!

    安装pygame 本人电脑是windows 10.python3.6,pygame下载地址:https://pypi.python.org/pypi/Pygame/1.9.3 请自行下载对应pytho ...

  9. pythonturtle简单绘图_10分钟轻松学会 Python turtle 绘图

    10分钟轻松学会 Python turtle 绘图 python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即 ...

最新文章

  1. 想搞自动识别系统的应用程序,希望能跟有志于此的朋友交流
  2. 视觉稿与H5页面之间的终端适配
  3. linux硬盘拷贝系统,教你在第二块硬盘上拷贝安装Linux系统
  4. linux求文件共有行。多个文件求共有行交集完全匹配-w
  5. spring中的BeanPostProcessor
  6. lr与svm如何选择-面试
  7. 哈工大未来计算机院士,2017年中国高校新增工程院院士名单出炉,哈工大依然很强!...
  8. cutterman工具使用 0921
  9. 正坐标系及矢量知识,点乘与差乘,旋转
  10. Oracle Grid 下载地址
  11. AngularJS页面【uib-dropdown】控件在模态窗口(弹出窗)中无法使用问题
  12. Unity资源打包(AssetBundle)
  13. Swift 读写 plist 文件
  14. 数学模型之最小二乘法
  15. XHTML的目标,规则和细节
  16. 计算机键盘输入法基础知识,3、使用键盘打字 --电脑基础知识
  17. 自己动手搭建一个简单的基于Hadoop的离线分析系统之一——网络爬虫
  18. 转:elasticsearch下载太慢在国内, 我把包放到了云盘上,还有kibana,logstash.有需要自取,持续更新版本
  19. 小米路由器安装mysql_小米路由器安装和设置方法(图文教程)
  20. 中国劳动力动态调查数据(CLDS)2011-2018年

热门文章

  1. Struct 和 Class 性能有差异吗?自己测试
  2. java case switch,Java中Switch Case的替代方案
  3. Java中的实现马赛克效果以及灰度效果----整张图片
  4. cross_val_score,cross_val_predict,cross_validate理解
  5. python获取文件路径
  6. CountDownLatch 的 .await() 的线程阻塞 和countDown() 计时唤醒
  7. 各种远程通信协议比较RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等
  8. tf.contrib.layers.fully_connected详解
  9. 很好的理解梯度 散度 旋度 下三角运算 费曼物理讲义
  10. AI Debate2 | 李飞飞提「AI北极星」,卡尼曼指「系统 1」理解有误