学生学python编程---实现贪吃蛇小游戏+原码
创始人
2024-02-07 19:56:19
0

学生学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')

源码

由于网友建意,把源码增加在此,为方便大家查询,特修改添之

# _*_ coding: UTF-8 _*_
# 开发团队: 信息化未来
# 开发人员: Administrator
# 开发时间:2022/9/4 18:02
# 文件名称: 贪吃蛇.py
# 开发工具: PyCharmimport pgzrun # 导入游戏库
from pgzero.actor import Actor
from pgzero.keyboard import Keyboard
from pgzero.screen import Screen
keyboard: Keyboard  # 类型标注
screen: Screen  # 类型标注import time
import random # 导入随机库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坐标food = Actor('food') # 导入食物方块图片
food.x = random.randint(10, 20)*TILE_SIZE # 食物方块图片的x坐标
food.y = random.randint(10, 20)*TILE_SIZE # 食物方块图片的y坐标score = 0 # 游戏得分
direction = 'right'
isclose = False
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()food.draw()# 显示中文    准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件.ttfif isclose: # 显示游戏失败信息screen.draw.text("游戏失败!", (120, HEIGHT/2-100),fontsize=100, fontname='simhei', color='yellow')  # fontname='宋体',screen.draw.text("得分:"+str(score), (100, 20), fontsize=50,fontname='simhei', color='white')def update(): # 更新模块,每帧重复操作global direction,isclose,food,scoreif keyboard.left: # 如果按下键盘向左方向键direction = 'left' # 小蛇要向左移if keyboard.right: # 如果按下键盘向右方向键direction = 'right' # 小蛇要向右移if keyboard.up: # 如果按下键盘向上方向键direction = 'up' # 小蛇要向上移if keyboard.down: # 如果按下键盘向下方向键direction = 'down' # 小蛇要向下移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_SIZE# 当小蛇(新蛇头)超出边框时,游戏失败if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT  or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:isclose = True# 当小蛇蛇头碰到自身时,游戏失败for snakebody in Snake:# 对所有蛇身循环,判断是否和蛇头坐标一致if newSnakeHead.x == snakebody.x and  newSnakeHead.y == snakebody.y:isLoose = Truebreak# 当小蛇头碰到食物时,不处理,也就是长度+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  # 得分加1else:  # 否则,删除掉旧蛇尾,也就是蛇的长度保持不变del Snake[len(Snake) - 1]Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面Snake[1].image='snake2'# del Snake[len(Snake)-1] # 删除旧蛇尾time.sleep(0.2) # 暂停0.2spgzrun.go() # 开始执行游戏

总结

这次我们主要制作了贪吃蛇游戏,了解了time模块的sleep函数、clock模块的schedule等功能,学习了列表的插入函数、break与continue语句、函数的定义与调用等知识点。读者可以尝试在本章代码的基础上继续改进:1.实现得分越来越高,游戏速度越来越快的效果;2.实现蛇头、蛇身不同颜色的显示效果;

源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第 1 /30个。
可以关注我,点赞我、评论我、收藏我啦。

相关内容

热门资讯

珍爱生命的名人名言 珍爱生命的名人名言(精选55句)  关于生命的名人名言有哪些?生命,值得我们尊重,你知道哪些关于生命...
关于知音的名言名句  导语:关于知音或者是友谊的古诗词, 名人名言,这里全都有,关于知音的名言名句。  君子之交淡若水,...
清正廉洁格言 清正廉洁格言最短的人生格言1、执政以廉为本,为官以勤为先。2、做人一身正气,为官一尘不染。3、名位利...
罗素名言 罗素名言69句  1、伟大的事业是根源于坚韧不断的工作,以全付精神去从事,不避艰苦。——罗素  2、...
朋友的名人名言 有关朋友的名人名言汇总  在学习、工作、生活中,大家都不可避免地会接触并使用名言吧,名言可以用来鞭策...
乔布斯名言经典摘抄 乔布斯名言经典摘抄  乔布斯出生于美国加利福尼亚州旧金山,美国发明家、企业家、美国苹果公司联合创办人...
夺眶而出的名言名句 关于夺眶而出的名言名句  这里是郁郁葱葱的山神之森,一定,要有一段时间无法再盼望夏天了,心如刀绞,泪...
信仰名言 精选关于信仰名言  关于信仰名言  1、没有信仰的人如同盲人(弥顿)  2、有信仰未必能成大事,而没...
告诉自己珍惜时间的名言名句 志士惜年,贤人惜日,圣人惜时,告诉自己珍惜时间的名言名句。圣人都珍惜时间,我们凡人更要珍惜时间。下面...
工匠精神的名人名言 关于工匠精神的名人名言  1、最佳的创新定义是“不限大小,不限部门”。 最有效的创新都简单得惊人,其...
青春奋斗的名言警句 关于青春奋斗的名言警句1、青春是美妙的,挥霍青春就是犯罪,关于青春奋斗的名言警句。——萧伯纳  2、...
理想的阶梯 理想的阶梯理想的阶梯[教学目标]1.通过学习本文,使学生懂得“奋斗,是实现理想的阶梯”这一道理,并能...
激励的名言警句 激励的名言警句50句  大家都听过哪些激励的话呢?还记得吗?下面,小编为大家分享激励的名言警句,希望...
清明节家风家训的名言 清明节家风家训的名言  家风不仅是民风社风的组成要素,也是中华民族传统价值观的重要组成部分,各位,我...
英文爱情电影名言 英文爱情电影名言1) i love you not because of who you are, ...
霸气青春励志名言英语短句 霸气青春励志名言英语短句  青春是美好的时光,也是很重要的时光,下面unjs小编整理了霸气青春励志名...
文化的名言 关于文化的名言  文化是一种社会现象,是人们长期创造形成的产物,同时又是一种历史现象,是社会历史的积...
每日英语励志名言 每日一句英语励志名言  1、 No one can walk backward into the f...
感谢老师的成语和名言 感谢老师的成语和名言  春风化雨  有教无类  平易近人  古道热肠  十年树木,百年树人  作育英...
孝老敬亲的名人名言 关于孝老敬亲的名人名言  泱泱中华,礼义之邦,道德传统,源远流长。敬老孝老,是我们的传统美德,是我们...