目录
文章目录
前言
一、导入模块
二、主要实现部分
1.导入需要的模块和函数
2.初始化和全局变量:
3.定义改变移动方向的函数:
4.判断蛇头是否在边界内的函数:
5.移动蛇的函数:
6.设置绘图窗口大小和位置:
7.绑定键盘事件和相应的移动函数:
9.完整代码
非常适合小白和刚学不久的大学生练手,主要使用的是标准库
今天我要给大家介绍一个非常有趣的游戏——贪吃蛇游戏。我们都知道贪吃蛇是一款经典的小游戏,它可以让你回忆起童年的美好时光。在我刚开始学习python时,经常可以看到什么,百行制作完整的贪吃蛇,让我一度产生了怀疑,因为在我第一次使用c语言做贪吃蛇,使用了四百行去做,而今天python100行制作贪吃蛇,它来了,废话不多说,直接看效果
当然回归正题,自己也才磕磕绊绊自学了三个月,还有许多还要提高,如有不足之处,望大家讨论交流 !!!,当然本人也有许多学习资料,可以无偿共享给大家,欢迎关注留言,我们可以一起共同提高。
在本教程中,我们将使用Python的turtle模块来创建游戏的绘图界面,并通过代码来实现贪吃蛇的移动、食物的生成以及得分的计算等功能,让你回味童年,挑战高分!
其中,使用了一个很多人不熟悉的库freegames库,其中导入了两个模块,分别的作用是
square
和vector。
(1)square
函数的作用是绘制方块,它接受四个参数:方块的x坐标、y坐标、边长以及填充颜色。通过调用turtle
模块中的相关函数,square
函数可以在游戏界面上绘制一个方块,用于表示蛇的身体和食物。(2)
vector
类是一个自定义的向量类,它用于表示游戏中的位置和移动方向。在贪吃蛇游戏中,我们使用向量来表示食物的位置和蛇的移动方向。vector
类提供了一些方法,move
方法用于根据给定的位移更新向量的位置。
# 这里只需要导入freegames库就可以了
pip install freegames
首先我们需要导入一些必要的模块和函数。在这段代码中,我们导入了
randrange
函数用于生成随机数,以及turtle
模块中的所有函数和类。这样我们就可以使用这些函数和类来创建游戏所需的绘图界面和实现相应的操作。代码如下:
from random import randrange # 导入randrange函数用于生成随机数
from turtle import * # 导入turtle模块中的所有函数和类
from freegames import square, vector # 导入自定义函数
为了使游戏正常运行,我们需要初始化一些全局变量。首先是食物的初始位置,我们使用一个向量对象来表示食物的坐标。然后我们创建一个蛇列表,其中包含蛇的初始位置。我们还需要一个变量来表示蛇的移动方向,以及一个变量来保存分数。
代码如下:
food = vector(0, 0) # 初始化食物的位置
snake = [vector(10, 0)] # 初始化蛇的起始位置
aim = vector(0, -10) # 初始化蛇的移动方向
score = 0 # 初始化分数
change
函数,它负责改变蛇的移动方向。通过传入参数x
和y
,我们可以改变蛇的移动方向,向右、向左、向上或向下。代码如下:
def change(x, y):
aim.x = x
aim.y = y
inside
函数,它判断蛇头是否在边界内,确保蛇头不会超出绘图窗口的边界,在碰撞边界时游戏会失败。代码如下:
def inside(head):
return -200 < head.x < 190 and -200 < head.y < 190
move
函数,这是游戏中最重要的函数之一。它负责移动蛇、检测游戏是否结束、更新分数以及绘制游戏界面。代码如下:
# 移动蛇的函数
def move():
global score # 声明score为全局变量
# 复制蛇头的位置
head = snake[-1].copy()
head.move(aim) # 根据移动方向更新蛇头的位置
# 检查蛇头是否超出边界或撞到自身
if not inside(head) or head in snake:
square(head.x, head.y, 9, 'red') # 绘制蛇头方块,并使用红色填充
update()
penup()
goto(0, 0)
pendown()
write("Game Over", align="center", font=("Arial", 40, "normal")) # 显示 "Game Over"
return
# 将新的蛇头添加到蛇的列表中
snake.append(head)
# 检查蛇头是否与食物重合
if head == food:
score += 1 # 分数加1
# 生成新的食物位置
food.x = randrange(-15, 15) * 10
food.y = randrange(-15, 15) * 10
# 检查得分是否达到100,到达即为胜利
elif score == 100:
square(head.x, head.y, 9, 'red') # 绘制蛇头方块,并使用红色填充
update()
penup()
goto(0, 0)
pendown()
write("victory", align="center", font=("Arial", 40, "normal")) # 显示 "victory"
return
else:
# 移除蛇尾
snake.pop(0)
# 清除绘图窗口
clear()
# 绘制蛇的身体
for body in snake:
square(body.x, body.y, 9, 'black') # 绘制方块,并使用黑色填充
# 绘制食物
square(food.x, food.y, 9, 'blue') # 绘制方块,并使用绿色填充
# 绘制分数
penup()
goto(190, 190)
pendown()
write(f"Score: {score}", align="right", font=("Arial", 12, "bold"))
# 更新绘图窗口
update()
# 设置定时器,继续移动蛇
ontimer(move, 100)
为了创建游戏的绘图界面,我们需要对绘图窗口进行设置。我们可以使用
turtle
模块提供的函数来设置窗口的大小、位置,以及隐藏乌龟图标等。并使用tracer
函数关闭绘图的追踪功能,加快绘图速度。同时,使用listen
函数开始监听键盘事件,以便玩家可以通过键盘控制蛇的移动。代码如下:
setup(420, 420, 370, 0) # 设置绘图窗口大小和位置
hideturtle() # 隐藏乌龟图标
tracer(False) # 关闭绘图的追踪功能,加快绘图速度
listen() # 开始监听键盘事件
为了玩家能够通过键盘控制贪吃蛇的移动,我们需要将键盘事件与相应的函数进行绑定。通过调用
onkey
函数,并传入相应的移动函数和键盘键值,我们可以实现键盘事件的绑定。代码如下:
onkey(lambda: change(10, 0), 'Right') # 右箭头:向右移动
onkey(lambda: change(-10, 0), 'Left') # 左箭头:向左移动
onkey(lambda: change(0, 10), 'Up') # 上箭头:向上移动
onkey(lambda: change(0, -10), 'Down') # 下箭头:向下移动
8.开始移动与结束程序:
代码如下:
move() # 开始移动
done() # 结束程序
代码如下:
# 导入需要的模块和函数
from random import randrange # 导入randrange函数用于生成随机数
from turtle import * # 导入turtle模块中的所有函数和类
# 导入自定义函数
from freegames import square, vector
# 初始化食物的位置
food = vector(0, 0) # 创建一个向量对象来表示食物的位置
snake = [vector(10, 0)] # 初始化蛇的起始位置,列表中只有一个元素
aim = vector(0, -10) # 初始化蛇的移动方向
score = 0 # 初始化分数
# 定义改变移动方向的函数
def change(x, y):
aim.x = x
aim.y = y
# 判断蛇头是否在边界内的函数
def inside(head):
return -200 < head.x < 190 and -200 < head.y < 190
# 移动蛇的函数
def move():
global score # 声明score为全局变量
# 复制蛇头的位置
head = snake[-1].copy()
head.move(aim) # 根据移动方向更新蛇头的位置
# 检查蛇头是否超出边界或撞到自身
if not inside(head) or head in snake:
square(head.x, head.y, 9, 'red') # 绘制蛇头方块,并使用红色填充
update()
penup()
goto(0, 0)
pendown()
write("Game Over", align="center", font=("Arial", 40, "normal")) # 显示 "Game Over"
return
# 将新的蛇头添加到蛇的列表中
snake.append(head)
# 检查蛇头是否与食物重合
if head == food:
score += 1 # 分数加1
# 生成新的食物位置
food.x = randrange(-15, 15) * 10
food.y = randrange(-15, 15) * 10
# 检查得分是否达到100,到达即为胜利
elif score == 100:
square(head.x, head.y, 9, 'red') # 绘制蛇头方块,并使用红色填充
update()
penup()
goto(0, 0)
pendown()
write("victory", align="center", font=("Arial", 40, "normal")) # 显示 "victory"
return
else:
# 移除蛇尾
snake.pop(0)
# 清除绘图窗口
clear()
# 绘制蛇的身体
for body in snake:
square(body.x, body.y, 9, 'black') # 绘制方块,并使用黑色填充
# 绘制食物
square(food.x, food.y, 9, 'blue') # 绘制方块,并使用绿色填充
# 绘制分数
penup()
goto(190, 190)
pendown()
write(f"Score: {score}", align="right", font=("Arial", 12, "bold"))
# 更新绘图窗口
update()
# 设置定时器,继续移动蛇
ontimer(move, 100)
# 设置绘图窗口大小和位置
setup(420, 420, 370, 0)
hideturtle() # 隐藏乌龟图标
tracer(False) # 关闭绘图的追踪功能,加快绘图速度
listen() # 开始监听键盘事件
# 绑定键盘事件和相应的移动函数
onkey(lambda: change(10, 0), 'Right') # 右箭头:向右移动
onkey(lambda: change(-10, 0), 'Left') # 左箭头:向左移动
onkey(lambda: change(0, 10), 'Up') # 上箭头:向上移动
onkey(lambda: change(0, -10), 'Down') # 下箭头:向下移动
move() # 开始移动
done() # 结束程序
虽然到这里,这次的教学就要结束了,但是学习的路途是永不终止的。
希望大家能够喜欢这个贪吃蛇游戏,快来体验一下吧!记得不要贪得太多,否则游戏就结束了哦。祝大家学习和玩得开心!
如果本篇文章对你有帮助的话,不妨收藏点赞加关注哦!!!