大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇。在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短,而且理解起来或者说你更改起来要简单一些。最终会实现效果如下:

image

基本准备

首先,我们需要安装pygame库,小编通过pip install pygame,很快就安装好了。在完成贪吃蛇小游戏的时候,我们需要知道整个游戏分为四部分:

  1. 游戏显示:游戏界面、结束界面
  2. 贪吃蛇:头部、身体、食物判断、死亡判断
  3. 树莓:随机生成
  4. 按键控制:上、下、左、右

游戏显示

首先,我们来初始化pygame,定义颜色、游戏界面的窗口大小、标题和图标等。

1# 初始化pygame2pygame.init()3fpsClock = pygame.time.Clock()4# 创建pygame显示层5playSurface = pygame.display.set_mode((600,460))#窗口大小6pygame.display.set_caption('Snake Game')#窗口名称7# 定义颜色变量8redColour = pygame.Color(255,0,0)9blackColour = pygame.Color(0,0,0)
10whiteColour = pygame.Color(255,255,255)
11greyColour = pygame.Color(150,150,150)

游戏结束界面,我们会显示“Game Over!”和该局游戏所得分数,相关代码如下:

1# 定义gameOver函数2def gameOver(playSurface,score):3    gameOverFont = pygame.font.SysFont('arial.ttf',54) #游戏结束字体和大小4    gameOverSurf = gameOverFont.render('Game Over!', True, greyColour) #游戏结束内容显示5    gameOverRect = gameOverSurf.get_rect()6    gameOverRect.midtop = (300, 10) #显示位置7    playSurface.blit(gameOverSurf, gameOverRect)8    scoreFont = pygame.font.SysFont('arial.ttf',54) #得分情况显示9    scoreSurf = scoreFont.render('Score:'+str(score), True, greyColour)
10    scoreRect = scoreSurf.get_rect()
11    scoreRect.midtop = (300, 50)
12    playSurface.blit(scoreSurf, scoreRect)
13    pygame.display.flip() #刷新显示界面
14    time.sleep(5) #休眠五秒钟自动退出界面
15    pygame.quit()
16    sys.exit()

贪吃蛇和树莓

我们需要将整个界面看成许多20*20的小方块,每个方块代表一个单位,蛇的长度用单位来表示,同时我们采用列表的形式存储蛇的身体。同时, 我们都知道,树莓的位置是随机的。所以,我们需要让树莓出现的位置是游戏界面中的随机位置,同时,每吃到一颗树莓,就需要重新生成一颗新的树莓,并且得分加1。相关初始化设置如下:

1snakePosition = [100,100] #贪吃蛇 蛇头的位置
2snakeSegments = [[100,100]] #贪吃蛇 蛇的身体,初始为一个单位
3raspberryPosition = [300,300] #树莓的初始位置
4raspberrySpawned = 1 #树莓的个数为1
5direction = 'right' #初始方向为右
6changeDirection = direction
7score = 0 #初始得分

如何控制贪吃蛇的运动轨迹呢,那么就需要按键控制了。我们通过键盘的↑↓←→和WSAD来控制,如果想直接退出游戏,则可以通过Esc键。这里需要强调的是,贪吃蛇里面是不能反方向运动,因此,我们需要进一步的增加限制条件:

1# 检测例如按键等pygame事件2for 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:
17            pygame.event.post(pygame.event.Event(QUIT))
18# 判断是否输入了反方向
19if changeDirection == 'right' and not direction == 'left':
20    direction = changeDirection
21if changeDirection == 'left' and not direction == 'right':
22    direction = changeDirection
23if changeDirection == 'up' and not direction == 'down':
24    direction = changeDirection
25if changeDirection == 'down' and not direction == 'up':
26    direction = changeDirection

方向设置好了,那么贪吃蛇蛇身变换怎么做啊?很简单,我们只需要根据方向变换一下坐标即可。

1# 根据方向移动蛇头的坐标2if direction == 'right':3    snakePosition[0] += 204if direction == 'left':5    snakePosition[0] -= 206if direction == 'up':7    snakePosition[1] -= 208if direction == 'down':9    snakePosition[1] += 20
10# 增加蛇的长度
11snakeSegments.insert(0,list(snakePosition))

贪吃蛇游戏里面最重要的就是食物判断和死亡判断。首先是食物判断,我们通过键盘按键来决定贪吃蛇的走向,以便它能吃到树莓。如何判断贪吃蛇有没有吃到树莓呢?很简单,如果贪吃蛇蛇头的位置和树莓的位置重合了,也就是相同,那么贪吃蛇就吃到树莓了,否则没有。同时,一旦发生了树莓被吃的情况,立刻重新随机生成一个新的树莓。相关代码如下:

1# 判断是否吃掉了树莓2if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]:3    raspberrySpawned = 04 else:5    snakeSegments.pop() #若没有吃掉树莓,需将最后一单位的蛇身提出列表,此处和蛇身移动时位置变换有关6# 如果吃掉树莓,则重新生成树莓7if raspberrySpawned == 0:8    x = random.randrange(1,30) #和游戏界面大小相关9    y = random.randrange(1,23)
10    raspberryPosition = [int(x*20),int(y*20)]
11    raspberrySpawned = 1
12    score += 1

死亡判断则分为两类情况,一是触碰到了游戏界面的边界,二是贪吃蛇触碰到了自己的身体。一旦发生死亡,则触发gameover。

1# 判断是否死亡
2if snakePosition[0] > 600 or snakePosition[0] < 0: #若超过左右边界,触发gameover
3    gameOver(playSurface,score)
4if snakePosition[1] > 460 or snakePosition[1] < 0: #若超过上下边界,触发gameover
5    gameOver(playSurface,score)
6for snakeBody in snakeSegments[1:]: #若触碰到自己的身体,触发gameover
7    if snakePosition[0] == snakeBody[0] and snakePosition[1] == snakeBody[1]:
8        gameOver(playSurface,score)

贪吃蛇运动和吃掉树莓的过程中,游戏界面需要不断更新。同时,我们设置了游戏速度。

1# 绘制pygame显示层2playSurface.fill(blackColour) #蛇身为白色3for position in snakeSegments:4    pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20))5    pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0], raspberryPosition[1],20,20))67# 刷新pygame显示层8pygame.display.flip()9# 控制游戏速度
10fpsClock.tick(5)

至此,我们就能完成一个贪吃蛇小游戏了。赶紧去实验一下吧!

完整的代码如下:

1import pygame,sys,time,random2from pygame.locals import *3# 定义颜色变量4redColour = pygame.Color(255,0,0)5blackColour = pygame.Color(0,0,0)6whiteColour = pygame.Color(255,255,255)7greyColour = pygame.Color(150,150,150)8def gameOver(playSurface,score):9    gameOverFont = pygame.font.SysFont('arial.ttf',54)10    gameOverSurf = gameOverFont.render('Game Over!', True, greyColour)11    gameOverRect = gameOverSurf.get_rect()12    gameOverRect.midtop = (300, 10)13    playSurface.blit(gameOverSurf, gameOverRect)14    scoreFont = pygame.font.SysFont('arial.ttf',54)15    scoreSurf = scoreFont.render('Score:'+str(score), True, greyColour)16    scoreRect = scoreSurf.get_rect()17    scoreRect.midtop = (300, 50)18    playSurface.blit(scoreSurf, scoreRect)19    pygame.display.flip()20    time.sleep(5)21    pygame.quit()22    sys.exit()23def main():24    # 初始化pygame25    pygame.init()26    fpsClock = pygame.time.Clock()27    # 创建pygame显示层28    playSurface = pygame.display.set_mode((600,460))29    pygame.display.set_caption('Snake Game')30    # 初始化变量31    snakePosition = [100,100] #贪吃蛇 蛇头的位置32    snakeSegments = [[100,100]] #贪吃蛇 蛇的身体,初始为一个单位33    raspberryPosition = [300,300] #树莓的初始位置34    raspberrySpawned = 1 #树莓的个数为135    direction = 'right' #初始方向为右36    changeDirection = direction37    score = 0 #初始得分38    while True:39        # 检测例如按键等pygame事件40        for event in pygame.event.get():41            if event.type == QUIT:42                pygame.quit()43                sys.exit()44            elif event.type == KEYDOWN:45                # 判断键盘事件46                if event.key == K_RIGHT or event.key == ord('d'):47                    changeDirection = 'right'48                if event.key == K_LEFT or event.key == ord('a'):49                    changeDirection = 'left'50                if event.key == K_UP or event.key == ord('w'):51                    changeDirection = 'up'52                if event.key == K_DOWN or event.key == ord('s'):53                    changeDirection = 'down'54                if event.key == K_ESCAPE:55                    pygame.event.post(pygame.event.Event(QUIT))56        # 判断是否输入了反方向57        if changeDirection == 'right' and not direction == 'left':58            direction = changeDirection59        if changeDirection == 'left' and not direction == 'right':60            direction = changeDirection61        if changeDirection == 'up' and not direction == 'down':62            direction = changeDirection63        if changeDirection == 'down' and not direction == 'up':64            direction = changeDirection65        # 根据方向移动蛇头的坐标66        if direction == 'right':67            snakePosition[0] += 2068        if direction == 'left':69            snakePosition[0] -= 2070        if direction == 'up':71            snakePosition[1] -= 2072        if direction == 'down':73            snakePosition[1] += 2074        # 增加蛇的长度75        snakeSegments.insert(0,list(snakePosition))76        # 判断是否吃掉了树莓77        if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]:78            raspberrySpawned = 079        else:80            snakeSegments.pop()81        # 如果吃掉树莓,则重新生成树莓82        if raspberrySpawned == 0:83            x = random.randrange(1,30)84            y = random.randrange(1,23)85            raspberryPosition = [int(x*20),int(y*20)]86            raspberrySpawned = 187            score += 188        # 绘制pygame显示层89        playSurface.fill(blackColour)90        for position in snakeSegments:91            pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20))92            pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0], raspberryPosition[1],20,20))93        # 刷新pygame显示层94        pygame.display.flip()95        # 判断是否死亡96        if snakePosition[0] > 600 or snakePosition[0] < 0:97            gameOver(playSurface,score)98        if snakePosition[1] > 460 or snakePosition[1] < 0:99            gameOver(playSurface,score)
100        for snakeBody in snakeSegments[1:]:
101            if snakePosition[0] == snakeBody[0] and snakePosition[1] == snakeBody[1]:
102                gameOver(playSurface,score)
103        # 控制游戏速度
104        fpsClock.tick(5)
105
106if __name__ == "__main__":
107    main()

python代码,轻松完成贪吃蛇小游戏相关推荐

  1. python50行小游戏_50行python代码实现的贪吃蛇小游戏

    50行python代码实现的贪吃蛇小游戏 发布于 2014-09-01 21:26:24 | 1337 次阅读 | 评论: 1 | 来源: 网友投递 Python编程语言Python 是一种面向对象. ...

  2. c++代码轻松实现贪吃蛇小游戏

    1.游戏描述 贪吃蛇可谓是从小玩到大的经典趣味小游戏,蛇每吃到一次食物,身体就会长一节,如果撞到墙或者撞到自身,游戏结束. 2.代码实现 1.首先需要思考的问题是如何指定位置输出字符?这时候就有一个非 ...

  3. Python使用pygame编写贪吃蛇小游戏

    Python使用pygame编写贪吃蛇小游戏 代码如下: # -*- coding:utf-8 -*- """ 贪吃蛇 """ import ...

  4. python100行代码程序-100行python代码,轻松完成贪吃蛇小游戏

    大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇.在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短, ...

  5. bat贪吃蛇游戏代码_100行python代码,轻松完成贪吃蛇小游戏

    来源:DataGo数据狗   链接: https://mp.weixin.qq.com/s/fDcr1SfcbynLzHye7Q7VOg 大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉 ...

  6. python100行代码-怎样写贪吃蛇小游戏?用100行python代码轻松解决!

    大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇.在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短, ...

  7. python快速实现简易贪吃蛇小游戏

    贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长.  贪吃蛇游戏最初为单机模式,后续又陆续推出团战模式.赏金模 ...

  8. java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载

    [实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...

  9. python实现简陋的贪吃蛇小游戏

    简陋的贪吃蛇小游戏 # -*- coding:utf-8 -*- # 导入库 import sys import time import random import pygame from pygam ...

最新文章

  1. 11月8日学习内容整理:js的引入方式,变量数据类型,运算符,流程控制,函数...
  2. 工作流程怎么安排?用Edraw Max轻松创建工作流程图!
  3. php面试带项目_PHP面试常用算法(推荐)
  4. 11gR2 RAC时间同异常导致节点down掉问题处理
  5. SecureCRT配色
  6. c语言中如何进行开方和求一个数的几次方;
  7. 嵌入式操作系统新纪元?
  8. 微软MSBI零基础从数据仓库到商业智能实战(SSIS SSAS SSRS)
  9. 安卓手机存储卡使用技巧。
  10. mc 手游无限挑战服务器,盘点mc中可无限获得的东西(无BUG无mod)[多图]
  11. Tensorflow-Keras教程
  12. 使用Idead的时候遇到<dependency>标红等问题
  13. 物联网无人机:无人机应用实例及分析(基于XBee模块)
  14. 用 HI3559A / Hi3519A 接入 BT1120或BT656视频
  15. Incognito CTF 3.0部分WP及赛后复现
  16. 区分分辨率、像素、点、尺寸
  17. 火热流行的前后端低代码开源项目
  18. 【虹科分享】影响数字化仪精度的因素
  19. Struts2 异常处理机制
  20. 【Lemon】Python的函数

热门文章

  1. C语言——归并排序,单线程,多线程(Linux系统下实现)两种实现方法
  2. Python中使用遍历在列表中添加字典的坑
  3. Ubuntu 根目录结构
  4. 热门的智慧养老产品有哪些?解读新政策后的超全资料整合
  5. Python 一大坑,配置文件中字典引用问题(拷贝)。
  6. 计算机网络基础 之三:数据链路层
  7. ubuntu20.04设置为中文
  8. 几种常见窗函数及其MATLAB实现
  9. Apache 基金会创始成员访谈录 ———— 回顾 Apache 20年历程!
  10. Excel数据透视和Python数据透视