学生学python编程---实现贪吃蛇小游戏+源码
学生学python编程---实现贪吃蛇小游戏+源码
- 前言
- 主要设计
- 1、蛇的表示
- 2、蛇怎么移动?
- 3、玩家控制小蛇移动功能的实现
- 4、如何判定游戏结束?
- 应用知识点
- 1、python知识点
- 1.1 列表
- append()在列表未尾增加一个元素
- del 删除最后一个元素
- 在指定位置增加元素用insert()
- 1.2 time 时间模块
- 1.3 random模块
- 2、pygamezero知识点
- 2.1 游戏角色Acto
- 2.2 输出中文字体
- 2.3键盘控制
- 功能截图
- 代码实现
- 1、蛇的表示
- 2、蛇的前进移动
- 3、控制移动方向
- 4、游戏失败
- 5、食物的随机出现
- 6、游戏得分
- 总结
- 源码获取
前言
这几年人工智能技术大发展,Python因此几乎成了第一位的语言。实际上,多年来,它不仅在软件工程师中得到广泛使用,也是各行业通用的专家语言,就是说,不管孩子以后做什么,都可能用得着。准备针对我自己上小学的孩子,每周抽出些时间,通过学习他们感兴趣的小游戏,逐步把python知识点带进游戏的制作过程中,用到哪些知识简单的解绍一下哪些,以学,以用为主。
本次我们将编写一个贪吃蛇的游戏。通过键盘上、下、左、右控制小蛇上、下、左、右移动,吃到食物后长度加1;蛇头碰到自身或窗口边缘,游戏失败。我们首先构造小蛇,实现小蛇向4个方向移动;然后实现游戏失败的判断、吃食物增加长度、得分功能;每段游戏,增加一个功能,另存一下,容易让孩子理解学习,同时也可以让其在每个阶段增加他想增加的功能,一举多得。最后学习函数的定义与使用,并通过进行时间控制变更游戏难度。
主要设计
1、蛇的表示
游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了。
蛇怎么表示?我们可以将整个游戏区域划分成一个个的小格子,由一组连在一起的小格子组成“蛇”,蛇头用个蛇头(圆带两个眼睛)表示,蛇身用个圆表示。我们可以用坐标来表示每一个小方格,X 轴和 Y 轴的范围都是可以设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了。
2、蛇怎么移动?
第一反应就是像蚯蚓蠕动一样,每一个小方块向前移动一格,但这样实现起来很麻烦。想象一下我们玩过的贪吃蛇,每次“蛇”的移动感觉上是整体往前移动了一格,排除掉脑子中“蛇”的“动作”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其他部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就相当于蛇向前移动了一格。(由于蛇头与蛇身是不同的图片,还需要把第二张也即原先的蛇并没有照片换成蛇身照片,要不跑几步就成一串蛇头了,你可以试试,把蛇身换蛇头的那行代码注释掉就可看到了。)
3、玩家控制小蛇移动功能的实现
玩家控制小蛇移动功能的实现
玩家控制小蛇移动,在update()函数中实现用户按上、下、左、右方向键,设定direction变量取不同的值,即可实现玩家键盘控制小蛇向4个方向移动。即通过一个公共变量direction来实现,当键盘按不同的上下左右键时修改公共变量direction就达到了玩家控制小蛇方向的问题。
4、如何判定游戏结束?
“蛇”移动超出了游戏区的范围或者碰到了自己就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。那么如何判断碰到自己呢?
如果脑子里想的是“蛇”动的画面,那真的比较难了,但是放到代码中,我们的“蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中岂不就可以了?
理清了这些问题,我们就可以开始编码了。
应用知识点
1、python知识点
1.1 列表
游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了。
列表,数据类型list,list是python内置的一种高级数据类型。list是一种有序的集合,基于链表实现 在python中应用很广泛,可以随时添加和删除其中的元素。在此游戏中用于表是蛇身,由蛇头,蛇身组成,吃个食物,蛇身增加一段,即应用列表添加一个蛇身图片。蛇身的移动,用到了列表的添加与删除功能。len()可以获得列表长度。用索引来访问list中每一个位置的元素,记得索引是从0开始的,也可以用负数,表示从-1表示列表最后一个。
append()在列表未尾增加一个元素
如:Snake.append(snakebody) # 把蛇身加入列表中
del 删除最后一个元素
del Snake[len(Snake)-1] # 删除旧蛇尾
也可用 del Snake[-1]
在指定位置增加元素用insert()
如:Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面
1.2 time 时间模块
属于Python的时间模块。基本上,这会增加执行延迟,并且只会暂停当前线程,而不会暂停整个程序。
Python的time模块中提供了Python time.sleep()函数。在使用此Python函数之前,您需要使用以下命令导入此模块:import time
导入此模块后,即可使用time.sleep()函数。语法如下:
句法:睡眠(秒),如您所见,它需要一个参数,即秒。在执行过程中,这基本上会引起这么多秒的延迟,此游戏中应用到sleep(0.2),让游戏更新时暂缓0.2秒,通过此参数可以调试蛇的移动速度。
1.3 random模块
random() 方法返回随机生成的一个实数,它在[0,1)范围内
import random
random.random()
#randint函数,返回指定范围的一个随机整数,包含上下限
random.randint(0,99)#返回0~99之间的整数
2、pygamezero知识点
Pygame Zero这个神器,它对PyGame做了很多封装,避免写很多枯燥的框架代码,让初学者可以更专注于游戏核心逻辑,容易上手。
2.1 游戏角色Acto
游戏角色Actor pgzero中所有以图片显示的元素都是Actor类来定义,如snakebody = Actor(‘snake2’) # 导入蛇身方块图片。也可以理解为Actor是用来代表一个你绘制到屏幕的图形。
通过把字符串 ‘snake2’ 作为参数传递给 Actor 类,Pygame Zero自动加载了外星人精灵,并且图片具有位置和大小属性。snake2是指images文件夹下snake2.png图片。也可以apple = Actor(‘apple’,(200,300)) # 设置图片apple的位置。连图片带位置一起指定。
一个免费的png图片下载网站:https://kenney.nl/assets/page:3?q=2d
2.2 输出中文字体
显示中文 准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件simhei.ttf
if isclose: # 显示游戏失败信息
screen.draw.text(“游戏失败!”, (120, HEIGHT/2-100),
fontsize=100, fontname=‘simhei’, color=‘yellow’)
2.3键盘控制
from pgzero.keyboard import keys, Keyboard
可以查询下原码,通过keys.w,keyboard.left等进行控制
功能截图
代码实现
1、蛇的表示
import pgzrun # 导入游戏库
TILE_SIZE = 30 # 小蛇方块的大小,20×20
WIDTH = 20*TILE_SIZE # 设置窗口的宽度为800
HEIGHT = 20*TILE_SIZE # 设置窗口的高度为600snkaeHead = Actor('snake1') # 导入蛇头方块图片
snkaeHead.x = WIDTH/2 # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2 # 蛇头方块图片的y坐标Snake = [] # 存储蛇的列表
Snake.append(snkaeHead) # 把蛇头加入列表中
for i in range(4): # 再为蛇添加4段蛇身print(i)snakebody = Actor('snake2') # 导入蛇身方块图片snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方块图片的x坐标snakebody.y = Snake[i].y # 蛇身方块图片的y坐标Snake.append(snakebody) # 把蛇身加入列表中def draw(): # 绘制模块,每帧重复执行screen.clear() # 每帧清除屏幕,便于重新绘制for snkaebody in Snake: # 绘制蛇snkaebody.draw()pgzrun.go() # 开始执行游戏
2、蛇的前进移动
蛇一直向右移动,直至完全走出屏幕
direction = 'right'
def update(): # 更新模块,每帧重复操作newSnakeHead = Actor('snake1') # 创建新蛇头的图片 # 根据direction变量设定新蛇头的坐标 # 如小蛇向下移动,就在旧蛇头的下边if direction == 'right': # 小蛇向右移动newSnakeHead.x = Snake[0].x + TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'left': # 小蛇向左移动newSnakeHead.x = Snake[0].x - TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'up': # 小蛇向上移动newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y - TILE_SIZEif direction == 'down': # 小蛇向下移动newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y + TILE_SIZESnake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面Snake[1].image='snake2'del Snake[len(Snake)-1] # 删除旧蛇尾
3、控制移动方向
def update(): # 更新模块,每帧重复操作global direction,iscloseif keyboard.left: # 如果按下键盘向左方向键direction = 'left' # 小蛇要向左移if keyboard.right: # 如果按下键盘向右方向键direction = 'right' # 小蛇要向右移if keyboard.up: # 如果按下键盘向上方向键direction = 'up' # 小蛇要向上移if keyboard.down: # 如果按下键盘向下方向键direction = 'down' # 小蛇要向下移
4、游戏失败
# 当小蛇(新蛇头)超出边框时,游戏失败if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:isclose = Truedef draw(): # 绘制模块,每帧重复执行screen.clear() # 每帧清除屏幕,便于重新绘制for snkaebody in Snake: # 绘制蛇snkaebody.draw()# 显示中文 准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件simhei.ttfif isclose: # 显示游戏失败信息screen.draw.text("游戏失败!", (120, HEIGHT/2-100),fontsize=100, fontname='simhei', color='yellow')
5、食物的随机出现
当小蛇头碰到食物时,不处理,也就是长度+1;青蛙重新在随机位置出现;
if newSnakeHead.x == food.x and newSnakeHead.y == food.y:food.x = random.randint(5, 20) * TILE_SIZEfood.y = random.randint(5, 20) * TILE_SIZEscore = score + 1 # 得分加1
6、游戏得分
设置公共变量score,当小蛇吃到食物时,score值加1,更新时屏幕显示出得分,用如下语句。
screen.draw.text("得分:"+str(score), (100, 20), fontsize=50,fontname='simhei', color='white')
总结
这次我们主要制作了贪吃蛇游戏,了解了time模块的sleep函数、clock模块的schedule等功能,学习了列表的插入函数、break与continue语句、函数的定义与调用等知识点。读者可以尝试在本章代码的基础上继续改进:1.实现得分越来越高,游戏速度越来越快的效果;2.实现蛇头、蛇身不同颜色的显示效果;
源码获取
可关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主
今天是以此模板持续更新此育儿专栏的第 29 /50个。
可以关注我,点赞我、评论我、收藏我啦。
学生学python编程---实现贪吃蛇小游戏+源码相关推荐
- 【180928】美女贪吃蛇小游戏源码
本源码是一个简单的c#版美女贪吃蛇小游戏源码,基于winform技术制作.控制方向键即可.右侧有记分板,每走一步都记加分.贪吃蛇身体掠过的地方就会显示背景图片,身体越长,显示的越多,玩家可以将图片换成 ...
- 贪吃蛇小游戏源码分享
创建2个文件夹,一个是放源码还有一个文件夹是发图片的. 然后创建三个实体类. package com.Bubbles.snake; import javax.swing.*; import java. ...
- java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载
[实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...
- 贪吃蛇小游戏源码再回顾
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...
- 带看板娘玩法指导的贪吃蛇小游戏源码
介绍: 左下角带看板娘插件,给玩家实时提示和介绍游戏玩法. 上下左右控制方向,数字0暂停,E加速,Q 减速,回车自动/手动切换. 网盘下载地址: http://kekewl.org/bJSm3CqBo ...
- Python 简单实现贪吃蛇小游戏
文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...
- python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单
贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...
- python小游戏编程实例-10分钟教你用Python写一个贪吃蛇小游戏,适合练手项目
另外要注意:光理论是不够的.这里顺便总大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交 ...
- 10分钟用Python编写一个贪吃蛇小游戏
贪吃蛇,大家应该都玩过.当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最主要 ...
最新文章
- flask + celery
- YOLO训练Pedestrain
- pwn学习总结(三) —— 栈溢出经典题型整理
- Memcached 缓存个体,对象,泛型,表
- HDU - 4738 Caocao's Bridges(边双缩点)
- 对于大家族Sring这些你究竟了解吗
- java中程序跳转_java程序中先后台交互的两种实现方式以及页面之间的跳转
- 对Linux的cp命令的思考
- tf.concat, np.concatenate
- 21. RequireJS
- 昨天我遇到一个令我敬佩的人
- 计算机打印服务总是自动关闭,XP系统Print spooler总是自动关闭的解决方法
- 专利学习笔记7:说明书附图尺寸
- 用粉红噪声煲机_煲机知识 | 煲机常用的粉红噪音和白噪音是什么?
- Win7系统网络共享中心打不开,网络连接标识一直转圈
- Windows 10免费影音制作下载(Windows Movie Maker 2012)
- 百科系统php,HDwiki与PHPCMS联合推出开源中文Wiki系统
- 【论文笔记】Question Answering with Subgraph Embeddings
- 推式配货(Push)、拉式配货(Pull)和配送需求计划(DRP)的区别
- 精短高效的XML解析器,纯C单一程序,应用于银行的国税库行横向联网接口系统中,稳定可靠,运行速度飞快
热门文章
- adc0809工作过程C语言,ADC0809的工作原理
- 变桨滑环的功能与作用
- Review of Feature Selection, Dimensionality Reduction and Classification for Chronic Disease Diagnos
- 计算机六级准考证,2016英语四六级准考证查询系统
- 朱兰的质量三部曲——《可以量化的管…
- 火车头采集案例 - js源码获取真实地址
- 相机稳定性测试软件,用于天文观测的科学级相机成像和测试软件的研究
- FAQ翻译 第一章 C++蓝图
- 华为OD机试 - 最优资源分配(Python) | 机试题算法思路 【2023】
- 三维空间点的直线方程拟合(最小二乘法)