python 使用turtle模块结合面向对象整理的蛇追海龟的游戏

刚学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()

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值