
人工智能程序设计期末大作业
题 目:贪吃蛇 pro
学 号:
姓 名:
班 级:
分 数:
一(10)
二(25)
三(30)
四(25)
五(10)
总分(100)

人工智能程序设计期末大作业
1
一、需求分析:
本次大作业,我写的程序为一个世人皆知的经典游戏——贪吃蛇(虫)。可能听到这里会觉
得这个主题很老套很简单,其实并非如此。我在这个游戏的基础上进行了一系列的改进和创新:
1. 程序并没有使用 pygame 库,用的是 turtle 的画图功能加上画面刷新实现的动态控制,此
功能参考了 CSDN 上的
https://blog.csdn.net/bigzql/article/details/111714954?utm_source=app&app_version=4.19.1&cod
e=app_1562916241&uLinkId=usr1mkqgl919blen
在此基础上进行的较大的调整和升级;
2. 传统的贪吃蛇游戏所具有的功能,在程序中均可实现;
3. 在画布上明确画出了小蛇可移动范围,并在范围内添加了四面围墙以增添游戏难度和游戏
乐趣;
4. 通过颜色的区别,可以明显区分小蛇、食物、墙壁、围栏、小蛇的首尾;
5. 速度引用对数函数,可随长度的增加而缓慢减慢,这里减少了前期耗费的时间,同时减少
了后期的游戏难度,让整个游戏表的更加人性化;
6. 在游戏页面上添加了分数记录,给玩家以游戏成果的实时反馈;
7. 游戏开始添加了游戏说明和操作介绍,让游戏更加容易上手,在结尾增加了游戏结束弹窗,
用激励性的语言,让玩家在游戏失败后能够重新揭竿而起;
8. 在游戏页面添加了个性 logo,让游戏更具特色。
二、关键技术:
(一)引用库及模块简介:
库、模块
功能
turtle
利用 turtle 画图功能,生成主界面、蛇身体、墙壁、围栏、汉字等,
同时利用 turtle.update 实现页面刷新进行动态显示,利用 turtle.tra
cer(False)取消绘图过程,利用 turtle.hideturtle()隐藏画笔,使游
戏更加连贯。
random
调用 random 库,实现贪吃蛇食物出现位置的随机性,用 randrange(x,
y )来限制食物出现位置的范围,避免出现在墙壁上或围栏以外的位
置。
tkinter.messagebox
调用 tkinter.messagebox 库,用来弹出开始游戏前的游戏说明,以及
游戏结束后的弹窗通知,使游戏更加人性化,更具可玩性。
math
调用 math 库,用对数函数实现对小蛇速度的控制,使速度减小幅度更
加合理。
text_1 text_2 text_3
创建并调用了 text_1 text_2 text_3 三个包,分别实现墙壁、围栏的
创建和文字的书写,以及分数的记录。
(二)主要数据类型:
游戏元素
数据类型
说明
蛇身
二维列表
蛇身由很多个连续的变长为 10 的方块构成,故用二维列表构造
蛇身,每个元素代表一个方块,前进则在列表中根据方向扩展

人工智能程序设计期末大作业
2
元素,生成新的方块,如果未吃到食物则删除末尾方块并更新
画面,实现画面的连续性。
方向控制
列表
方向由一个由两个元素构成的列表控制,方向控制函数 x=0,
y=10 为向上,x=0,y=-10为向下,x=10,y=0 为向左,x=-10,
y=0 为向右,控制原理为控制蛇身新方块生成的位置,从而达
成控制小蛇改变方向的目的。
食物
列表
食物由一个含有两个元素的列表构成,其出现位置由 random 库
控制,初始位置为[-10,0]。
围栏及墙壁
无
由 turtle 库绘制而成,无数据类型
(三)程序流程:
(四)主要算法思路:
整体:运用 turtle 编写贪吃蛇程序,通过刷新页面,实现动态效果。用 turtle 库的画图功
能,绘制游戏界面,包括围栏、墙壁、蛇身、食物等,蛇头添加方块,蛇尾减少方块来实现蛇的
前进,如果吃到食物,则蛇头添加方块,蛇尾不减少方块实现蛇身长度增加。并通过颜色的切换
来给予玩家以提示(蛇尾为黑色,蛇身为墨绿色辨别首尾,撞死则方块变成红色来模拟血液)。
方块构成:方块皆为 10*10 方块,由 turtle 绘制正方形并填涂而成,方块函数有四个参数,
前两个控制位置,后两个分别控制大小和颜色。
方向控制:玩家可以通过上下左右键来控制小蛇走向,方向的控制通过一个列表实现,主要
控制蛇身新方块生成的方向,蛇头后方的方块跟随其前一个即可。
死亡条件:撞到围栏,墙壁,或者自己就会死亡,通过坐标来限制小蛇的移动范围,而且食
物不会出现在围墙和墙壁上。
食物:食物出现位置具有随机性,并通过 randrange 限制其出现位置,使之无法出现在围栏和
墙壁上,以增强游戏的可玩性。

人工智能程序设计期末大作业
3
速度控制:用变化较为平缓的对数函数来控制速度,蛇身越长则速度越慢,慢到一定程度后
速度不再变化(长度大于 10)。
(五)函数说明:
1.def change_direction(x, y):
aim[0] = x
aim[1] = y
# 方向控制函数,通过改变 x 和 y 的值来控制小蛇前进方向(新方块生成位置),其中 x=0,y=10
为向上,x=0,y=-10 为向下,x=10,y=0 为向左,x=-10,y=0 为向右。
2.def Sqaure(x, y, size, color):
turtle.penup()
turtle.goto(x, y)
turtle.pendown()
turtle.begin_fill()
turtle.color(color)
for i in range(4):
turtle.forward(size)
turtle.left(90)
turtle.end_fill()
# 生成方块的函数,方块皆为 10*10 方块,由 turtle 绘制正方形并填涂而成,方块函数有四个
参数,前两个控制位置,后两个分别控制大小和颜色。
3.def inside(head):
return -260 < head[0] < 240 and -260 < head[1] < 250
def inwall(head):
return -160 < head[0] < -140 and 90 < head[1] < 150 \
or -160 < head[0] < -140 and -150 < head[1] < -90 \
or -100 > head[0] > -140 > head[1] > -160 \
or -100 > head[0] > -140 and 130 < head[1] < 150 \
or 90 < head[0] < 150 and 130 < head[1] < 150 \
or 90 < head[0] < 150 and -160 < head[1] < -140 \
or 130 < head[0] < 150 and 90 < head[1] < 150 \
or 130 < head[0] < 150 and -150 < head[1] < -100
# 范围控制函数:inside 函数为判断蛇身是否在界面以内,inwall 函数为判断蛇身是否撞墙,如果
蛇头撞到边界、墙壁或蛇身就会判定为死亡
4.def snake_move():
# 获取蛇头
head = [snake[-1][0], snake[-1][1]]
# 最后一个加方向
head = [head[0] + aim[0], head[1] + aim[1]]
# 加过后还在蛇里面,不在画布里面,或撞到墙上
if head in snake or not inside(head) or inwall(head):
# 红色
Sqaure(head[0], head[1], 10, 'red')

人工智能程序设计期末大作业
4
print("小蛇死掉了~——~")
showinfo(title='死掉了', message='大不了从头来过')
turtle.update()
return
if head == food:
# 遇到食物
print("分数:", len(snake), "继续加油!")
food[0] = randrange(-13, 13) * 10 or randrange(17, 24) * 10 or randrange(-24, -17) * 10
food[1] = randrange(-13, 13) * 10 or randrange(17, 24) * 10 or randrange(-24, -17) * 10
else:
snake.pop(0)
# 删除蛇尾
snake.append(head)
turtle.clear()
f_1()
# 边界
f()
# 墙壁
f_2()
# 汉字和字母等
turtle.penup()
turtle.pencolor('red')
turtle.goto(10, 100)
turtle.write(len(snake), align="left", font=("Arial Narrow", 18, "bold"))
# 记录分数
Sqaure(food[0], food[1], 10, "limegreen")
for body in snake:
Sqaure(body[0], body[1], 10, "darkgreen")
Sqaure(snake[0][0], snake[0][1], 10, "red")
Sqaure(snake[0][0], snake[0][1], 10, "black")
# 蛇尾为黑色,蛇身为暗绿色,用于分辨蛇身体前后
turtle.update()
if len(snake) < 10:
turtle.ontimer(snake_move, int(sqrt(len(snake))*100))
else:
turtle.ontimer(snake_move, int(sqrt(10) * 100))
# 蛇前进速度随长度变长而变慢,慢到一定程度不再变化
# 小蛇移动函数,同时包含了颜色转变、长度增加、食物生成、速度减小等功能,为程序的主要
函数。其细节功能在程序内注释中说明。
三、程序源码:
text.py: