import copy # 拷贝
import turtle # 画板
import tkinter.messagebox as msgbox # 弹窗提示
from random import randrange # 取随机数
# 蛇身体
snake = [[0, 0], [0, 10], [0, 20]]
# 方向
aim = [0, 10]
# 食物
food = [-10, 0]
# 方向函数
def changed_dir(x, y):
# 不能控制反方向 [例:不能让蛇向上时, 控制它向下]
if aim[0] == x and aim[1] == -y:
return
if aim[0] == -x and aim[1] == y:
return
# 重新设置方向
aim[0] = x
aim[1] = y
# 判读边界条件
def inside(head):
return -250 < head[0] < 250 and -250 < head[1] < 250
# 绘制方块
def block(x, y, size, color):
turtle.penup() # 抬笔
turtle.goto(x, y) # 移动到位置
turtle.pendown() # 放下笔
turtle.color(color) # 设置颜色
turtle.begin_fill() # 开始填充
# 绘制
for i in range(4):
turtle.forward(size)
turtle.left(90)
turtle.end_fill() # 结束填充
# 蛇移动
def snake_move():
# 蛇移动进行拷贝
head = copy.deepcopy(snake[-1])
head = [head[0] + aim[0], head[1] + aim[1]]
# 判读蛇头是否走出边界
if head in snake or not inside(head): # 蛇头在蛇身体里或者不在边界中
print("game over")
msgbox.showinfo("提示", "游戏结束")
return
# 蛇吃食物的情况
if head == food:
food[0] = randrange(-15, 15) * 10 # 因为食物被吃了,需要重新通过随机数设置食物位置
food[1] = randrange(-15, 15) * 10
else:
snake.pop(0) # pop(0)移除list第一个数据 [移除蛇头,主要是让蛇进行移动]
# 蛇身体移位
snake.append(head)
turtle.clear() # 画盘清空,重新绘制
# 绘制食物
block(food[0], food[1], 10, "red")
# 绘制蛇的身体
for body in snake:
block(body[0], body[1], 10, "black")
turtle.update() # 画板刷新,让整个画板看起来更流畅
turtle.ontimer(snake_move, 200) # 定时运行此函数
if __name__ == '__main__':
turtle.setup(500, 500) # 设置画板大小
turtle.tracer(False) # 取消绘制动画
turtle.hideturtle() # 取消绘制光标
# 监听按键 主要监听键盘按键
turtle.listen()
turtle.onkey(lambda: changed_dir(0, 10), "Up")
turtle.onkey(lambda: changed_dir(0, -10), "Down")
turtle.onkey(lambda: changed_dir(-10, 0), "Left")
turtle.onkey(lambda: changed_dir(10, 0), "Right")
# 蛇进行移动
snake_move()
# 卡住画板
turtle.done()