刚学turtle没多久,从网上看到文章,使用面向对象改造一番,加深对turtle的理解O(∩_∩)O哈哈~
# encoding:utf-8
import turtle
from time import sleep
from random import randint
# 创建海龟类,初始化额外包含速度要素,方便后期调整乃至加入难度体系
class Turtle_(turtle.Turtle):
def __init__(self, speed):
super().__init__()
self.speed = speed
self.shape('turtle')
self.color((195 / 255, 195 / 255, 195 / 255), 'green')
self.bound = limit_distance
# 海龟运动控制,完成后同时检查是否超出限制范围
def toup(self):
self.seth(90)
self.fd(30)
self.check_in_area()
def todown(self):
self.seth(-90)
self.fd(30)
self.check_in_area()
def toleft(self):
self.seth(180)
self.fd(30)
self.check_in_area()
def toright(self):
self.seth(0)
self.fd(30)
self.check_in_area()
# 检查海龟范围,使用公共变量限制距离
def check_in_area(self):
x = self.pos()[0]
y = self.pos()[1]
if x > limit_distance:
self.setx(limit_distance)
elif x < -limit_distance:
self.setx(-limit_distance)
elif y > limit_distance:
self.sety(limit_distance)
elif y < -limit_distance:
self.sety(-limit_distance)
# 创建蛇类,初始化需要速度,延时时长,目标(海龟)
class Snake(turtle.Turtle):
def __init__(self, speed, relay, enemy):
super().__init__()
self.shape('triangle')
self.pensize(5)
self.color('yellow', 'red')
self.speed = speed
self.enemy = enemy
self.relay = relay
# 蛇的追逐方法,调整方向,结合while循环延时前进
def follow_up(self):
self.seth(self.towards(self.enemy.pos()))
self.fd(10)
sleep(self.relay)
# 判定蛇是否赢了
def iswin(self):
return self.distance(self.enemy.pos()) <= 20
# 游戏结束后的处理:清空屏幕,显示结束提示文字
def win(self):
scr.clear()
s.pencolor('red')
s.write('你输了~~~\nHome键重新开始!\nEnd退出程序!!!', move=True, font=('microsoft yahei', 12, 'normal'))
# 同时绑定按键重新开始或者结束游戏(屏幕监听在主程序完成)
scr.onkey(quit, 'End')
scr.onkey(main, 'Home')
# 范围限制的初始化
def draw_bound(distance):
# 关闭动画
turtle.tracer(False)
t1 = turtle.Turtle()
t1.up()
t1.goto(-distance, -distance)
t1.down()
t1.hideturtle()
t1.pensize(5)
t1.pencolor('red')
for ign in range(4):
t1.fd(distance * 2)
t1.left(90)
# 开启动画
turtle.tracer(True)
# 主程序,做成函数方便重启游戏
def main():
# 将一干变量全局化
global limit_distance, t, s, turtle, scr
scr = turtle.Screen()
scr.clear()
# 屏幕监听,按键绑定必备条件
scr.listen()
# 限制范围大小,同时初始化范围图形
limit_distance = 300
draw_bound(limit_distance)
# 实例化海龟类对象
t = Turtle_(5)
t.up()
t.goto(randint(-limit_distance, limit_distance), randint(-limit_distance, limit_distance))
t.down()
# 实例化蛇类对象
s = Snake(10, 0.01, t)
# 按键绑定方法
scr.onkey(t.toup, 'Up')
scr.onkey(t.todown, 'Down')
scr.onkey(t.toleft, 'Left')
scr.onkey(t.toright, 'Right')
# 开启游戏循环,如果蛇没赢就一直追海龟
while not s.iswin():
s.follow_up()
else:
s.win()
# 程序循环监听,确保画面一直在
turtle.done()
if __name__ == '__main__':
main()