目标效果:
支持移动、吃食物身体加长、撞墙游戏结束
##############引用数据库与函数##############
from turtle import *
from random import randrange
##############定义变量##############
snake=[[0,0],[10,0],[20,0],[30,0],[40,0],[50,0]] #队列,用中括号包裹
apple_x=randrange(-20,20)*10 #-200到200中随机生成整十食物座标轴
apple_y=randrange(-20,20)*10
aim_x=10 #每次x座标都需要增长10
aim_y=0 #y不增加,横着向右移动
##############定义函数##############
def square(x,y,size,color_name):
up() #把小乌龟从画布上拿下来,悬在空中
goto(x,y) #去(x,y)这个位置
down() #把小乌龟放下来
color(color_name) #定义颜色
begin_fill() #开始填充
forward(size) #前进边长的距离
left(90) #左转
forward(size)
left(90)
forward(size)
left(90)
forward(size)
left(90)
end_fill() #填充,就画好一个完整的正方形
def change(x,y):
global aim_x,aim_y
aim_x=x
aim_y=y
def inside():
if -210<=snake[-1][0]<=200 and -210<=snake[-1][1]<=200: #判断蛇头是否还在画布中,不在就返回False
return True
else:
return False
def gameLoop():
global apple_x,apple_y #申请使用变量,声明变量为全局变量
snake.append([snake[-1][0]+aim_x,snake[-1][1]+aim_y]) #向前移动,前边添加一个身子
if not inside(): #如果为True,即inside方法返回False,结束
return
if snake[-1][0]!=apple_x or snake[-1][1]!=apple_y: #如果没有吃到食物,要去掉尾巴,吃掉食物尾巴就不用去掉
snake.pop(0)
else:
apple_x = randrange(-20, 20) * 10 #吃到了食物,重新生成一个
apple_y = randrange(-20, 20) * 10
clear() #把上一次作画的内容清除掉
square(apple_x, apple_y, 10, "green") # 在座标轴画一个红色食物
for i in range(len(snake)):
square(snake[i][0],snake[i][1],10,"black")
ontimer(gameLoop,200)
update() #把想画的东西画倒画布上
##############主程序##############
setup(420,420,0,0) #画布大小为420*420,一开始座标为(0,0)
hideturtle() #隐藏小乌龟
tracer(False) #隐藏绘制过程
listen() #监听键盘
onkey(lambda :change(0,10),"w") #如果按下w键,表示方向向上,aim_x=0,aim_y=10,沿着y轴向上走
onkey(lambda :change(0,-10),"s")
onkey(lambda :change(-10,0),"a")
onkey(lambda :change(10,0),"d")
gameLoop()
done() #结束函数,画布停留