Python海龟绘图实现贪吃蛇游戏完整代码解析
本文详细介绍如何使用Python内置的海龟绘图库(turtle)从零开始编写一个贪吃蛇游戏。文章通过分段解析,展示了从导入库、定义常量、绘制图形到处理用户输入和碰撞检测的完整逻辑。代码示例清晰展示了蛇的移动、食物生成及游戏循环机制,适合Python初学者了解图形界面编程与游戏逻辑实现。
以下是一个基于Python海龟绘图库实现的简单贪吃蛇程序示例,供读者参考学习。
程序运行后的界面效果如图所示。

首先,需要导入海龟绘图库以及随机数生成模块,以便后续使用绘图功能和随机生成食物位置。
from turtle import * from random import randrange
接下来定义游戏所需的常量与初始状态,包括食物的坐标、蛇身的初始位置以及移动方向。
food_x = randrange(-20, 20) * 20 food_y = randrange(-20, 20) * 20 snack = [[0, 0], [20, 0], [40, 0], [40, 20]] dir_x = 20 dir_y = 0
主函数负责初始化游戏窗口、关闭默认动画以提升性能,并绑定键盘按键以控制蛇的移动方向,最后启动事件循环。
if __name__ == '__main__':
# 设置主窗口的大小和位置
# width,height,startx,starty(初始位置距离屏幕左边和右边多少,默认中间)
setup(800, 800)
# 禁用海龟动画
tracer(False)
loop_view()
listen()
onkey(lambda: control(0, 20), "w")
onkey(lambda: control(0, -20), "s")
onkey(lambda: control(-20, 0), "a")
onkey(lambda: control(20, 0), "d")
# 开始事件循环
# 调用 Tkinter 的 mainloop 函数
# 必须作为一个海龟绘图程序的结束语句
done()
定义一个绘制正方形的辅助函数,用于在指定坐标绘制指定颜色和大小图形,作为蛇身和食物的视觉表现。
def draw_square(x, y, size, color_name):
'''
画正方形
:param x 表示在画布的x位置
:param y 表示画布的y位置
:param size 表示正方形的长度
:param color_name 表示正方形的颜色
:return
'''
# 画笔抬起,移动的时候不画线
up()
# 是海龟不可见
ht()
# 将海龟移动到这个位置
goto(x, y)
# 画笔落下 -- 移动时将画线
down()
color("red", color_name)
begin_fill()
forward(size)
left(90)
forward(size)
left(90)
forward(size)
left(90)
forward(size)
left(90)
end_fill()
pass
游戏主循环负责更新蛇的位置、判断是否吃到食物、重新生成食物坐标,并清除画布后重新绘制蛇和食物。
def loop_view():
'''
循环界面
'''
global food_x, food_y
if not is_zhangqiang():
return
snack.append([snack[-1][0] + dir_x, snack[-1][1] + dir_y])
if snack[-1][0] != food_x or snack[-1][1] != food_y:
snack.pop(0)
else:
food_x = randrange(-20, 20) * 20
food_y = randrange(-20, 20) * 20
clear()
# 画食物
draw_square(food_x, food_y, 20, "red")
# 画蛇
for s in range(len(snack)):
if s == len(snack) - 1:
draw_square(snack[s][0], snack[s][1], 20, "yellow")
continue
draw_square(snack[s][0], snack[s][1], 20, "black")
ontimer(loop_view, 100)
# 执行一次 TurtleScreen 刷新。在禁用追踪时使用
update()
定义控制函数,用于接收键盘输入并更新蛇的移动方向变量。
def control(x,y):
global dir_x, dir_y
dir_x = x
dir_y = y
定义碰撞检测函数,判断蛇头是否超出边界,若超出则返回游戏结束状态。
def is_zhangqiang():
if -400 <= snack[-1][0] <= 380 and -400 <= snack[-1][1] <= 380:
return True
else:
return False
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













