目標效果:
支持移動、吃食物身體加長、撞牆遊戲結束
##############引用數據庫與函數##############
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() #結束函數,畫布停留