利用Python自制贪吃蛇游戏
作者:丹枫无迹
来源:大龄码农的Python之路
在开始今天的正文前,首先为大家推荐一本关于数据产品经历不错的书籍:
一、游戏介绍
贪吃蛇是个非常简单的游戏,适合练手。先来看一下我的游戏截图:
玩法介绍:
食物分红、绿、蓝三种,分别对应 10 分、20 分、30 分,每吃一个食物增加对应分值,每增加 100 分速度加快一级,没有设置关卡,我玩到 1100 分,速度太快了,然后就 GAME OVER 了。
二、游戏分析
贪吃蛇这个游戏很简单,屏幕上随机出现一个点,表示“食物”,上下左右控制“蛇”的移动,吃到“食物”以后“蛇”的身体加长,“蛇”碰到边框或自己的身体,则游戏结束。
我们先来分析一下,要写出这个游戏来需要注意哪些点。
1、蛇怎么表示
我们可以将整个游戏区域划分成一个个的小格子,由一组连在一起的小格子组成“蛇”,我们可以用不同的颜色来表示,如上图中,我以深色表示背景,浅色表示“蛇”。
我们可以用坐标来表示每一个小方格,X 轴和 Y 轴的范围都是可以设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了,最后只要显示的时候以不同的颜色表示即可。
2、蛇怎么移动?
第一反应就是像蚯蚓蠕动一样,每一个小方块向前移动一格,但这样实现起来很麻烦。一开始就是被这里卡住了。
想象一下我们玩过的贪吃蛇,每次“蛇”的移动感觉上是整体往前移动了一格,排除掉脑子中“蛇”的“动作”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其他部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就相当于蛇向前移动了一格。
3、如何判定游戏结束?
“蛇”移动超出了游戏区的范围或者碰到了自己就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。那么如何判断碰到自己呢?
如果脑子里想的是“蛇”动的画面,那真的比较难了,但是放到代码中,我们的“蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中岂不就可以了?
理清了这些问题,我们就可以开始编码了。
三、代码展示
由于程序中要频繁的对“蛇”进行头尾的添加和删除操作,为了性能更好那么一点,我们用 deque
代替列表。
首先需要初始化“蛇”,“蛇”的初始长度为 3,位置位于左上角。
# 游戏区域的坐标范围
SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)snake = deque()
def _init_snake():snake.clear()snake.append((2, scope_y[0]))snake.append((1, scope_y[0]))snake.append((0, scope_y[0]))
创建“食物”,在屏幕内随机选取一个点作为“食物”,但是要保证“食物”不在“蛇”身上。
def create_food(snake):food_x = random.randint(SCOPE_X[0], SCOPE_X[1])food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])while (food_x, food_y) in snake:# 如果食物出现在蛇身上,则重来food_x = random.randint(SCOPE_X[0], SCOPE_X[1])food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])return food_x, food_y
“蛇”的移动可以有 4 个方向,用一个元组来表示移动的方向,每次按下方向键,给赋对应的值
# 方向
pos = (1, 0)for event in pygame.event.get():if event.type == QUIT:sys.exit()elif event.type == KEYDOWN:if event.key in (K_w, K_UP):# 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVERif pos[1]:pos = (0, -1)elif event.key in (K_s, K_DOWN):if pos[1]:pos = (0, 1)elif event.key in (K_a, K_LEFT):if pos[0]:pos = (-1, 0)elif event.key in (K_d, K_RIGHT):if pos[0]:pos = (1, 0)
而“蛇”的移动就可以表示为:
next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
if next_s == food:# 吃到了食物snake.appendleft(next_s)food = create_food(snake)
else:if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] and next_s not in snake:snake.appendleft(next_s)snake.pop()else:game_over = True
后台回复【贪吃蛇】,获取源码。
留言打卡 DAY 46
今日的留言话题是分享下你之前玩过的经典游戏,关于留言打卡的规则可以参考,请按照昵称+天数(请以自己实际连续打卡的天数为准,如day1 or day2 or day3)+ 留言内容(不少于15字)的方式留言
◆ ◆ ◆ ◆ ◆
长按二维码关注我们
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
利用Python自制贪吃蛇游戏相关推荐
- 如何用python开发一个贪吃蛇游戏_教你一步步利用python实现贪吃蛇游戏
教你一步步利用python实现贪吃蛇游戏 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: 教你一步步利用python实现贪吃蛇游戏.txt ] (友情提示:右键点 ...
- python制作贪吃蛇游戏_用Python写贪吃蛇游戏的代码实例
这篇文章主要为大家详细介绍了Python贪吃蛇游戏的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间 ...
- 利用OpenGL设计贪吃蛇游戏
利用OpenGL设计贪吃蛇游戏 文章目录 利用OpenGL设计贪吃蛇游戏 任务介绍 游戏玩法 开发环境 游戏实现 贪吃蛇游戏的框架搭建 主程序 游戏类 游戏对象类 工具类 着色器类 摄像机类 精灵渲染 ...
- PAOGD个人作业4——利用OpenGL设计贪吃蛇游戏
中山大学数据科学与计算机学院本科生实验报告 (2019年春季学期) 课程名称 PAOGD 任课老师 郑贵锋 年级 16 专业(方向) 软件工程(计算机应用方向) 学号 16340132 姓名 梁颖霖 ...
- python编写贪吃蛇游戏下载,python实现简单的贪吃蛇游戏
本文实例为大家分享了python实现贪吃蛇游戏的具体代码,加入按钮.难度.音乐.得分功能,供大家参考,具体内容如下 贪吃蛇小游戏,可以显示出得分,又背景音乐,难度选择和开始重启按钮设置. 游戏实现效果 ...
- 【课件】使用Python写贪吃蛇游戏(pygame)
使用Python写贪吃蛇游戏(pygame) 课件地址:https://blog.csdn.net/a772304419/article/details/130087202 本地路径: cd /D/W ...
- 回忆经典,九叔教你用Python制作贪吃蛇游戏
众所周知Python除了不能生孩子啥都行. 咱们今天就说一下如何利用Python写一个简易的小游戏. 所以呀咱们今天就用Python写大家都玩过的小游戏--贪吃蛇. 用Python写游戏就得用到pyg ...
- 手把手教你使用 Python 制作贪吃蛇游戏
贪吃蛇游戏是有史以来最受欢迎的街机游戏之一.在这个游戏中,玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果.在学习 Python 或 Pygame 时,可以将创建蛇游戏视为一项挑战.这是每个 ...
- python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏
前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...
最新文章
- 路由器远程登陆配置:01一个人登陆多台设备
- python端午dragboat消消乐 美轮美奂的界面效果
- 如何在网页标题栏title加入icon图标?
- LeetCode:Minimum Depth of Binary Tree,Maximum Depth of Binary Tree
- ubuntu离线安装依赖
- learn python app v3_Python3 采集APP数据及相关配置
- Python中DataFrame去重
- 1007. 素数对猜想 (20)-PAT乙级真题
- python免费全套教程400集视频-阿里巴巴大佬打造400集Python视频教程视频拿去,学完万物皆可爬...
- Wind River workbench介绍
- Eclipse的下载与安装
- 银行业务分析(数据整合)
- 用计算机观察声音的波形,用计算机观察声音的波形
- JETT(四)-支持JEXL
- 干货!探索单目车辆估计中的中间几何表示
- 在线教育重新被点燃:火花思维逆势融资8500万美元
- 【最全】ISTQB- FL模拟题(含答案)
- 华为杯山东理工大学第二届团体程序设计天梯赛
- 因子分析(factor analyis)
- 云起实验室:基于Redis实现在线游戏积分排行榜
热门文章
- # 阿里云服务器的运行与维护(1)
- 如何获取苹果设备UDID?
- 《世界是平的》The World Is Flat
- 旭凤为什么和锦觅共付鸿蒙,《香蜜》中旭凤对锦觅做的5件事,最让她开心的不是灵修,而是它...
- 使用Label(标签)
- HTML-input标签事件监听
- MT4/MQL4入门到精通EA教程第四课-MQL语言常用函数(四)-K线取值常用函数
- 安超云生态 | 安超云与百信完成产品兼容互认证 携手打造协同生态
- CURLINFO_HTTP_CODE 505 PHP
- 老人与海好词100英文带翻译_老人与海英文版好词好句摘抄