使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动

Turtle库是Python标准库的一部分,它提供了一种基于命令的图形绘制方式。Turtle模块通过一个"海龟"(Turtle)对象在屏幕上移动和绘制图形,支持诸如前进、后退、左转、右转等操作。此外,Turtle还支持设置颜色等功能。

现在,使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制时,小海龟并沿路径移动。

源码如下:

python 复制代码
# 鼠标左键绘制路径,用鼠标右键结束绘制时,小海龟并沿路径移动。
import turtle
import math

# 全局变量
screen = None
draw_turtle = None
move_turtle = None
path = []

def setup_screen():
    global screen, draw_turtle, move_turtle
    # 设置屏幕
    screen = turtle.Screen()
    screen.title("海龟跟随鼠标绘制路径")
    screen.setup(width=800, height=600)

    # 创建绘图海龟
    draw_turtle = turtle.Turtle()
    draw_turtle.hideturtle()
    draw_turtle.speed(0)

    # 创建移动海龟
    move_turtle = turtle.Turtle()
    move_turtle.shape('turtle')
    move_turtle.color('red')
    #move_turtle.penup()
    #move_turtle.hideturtle()

def start_drawing(x, y):
    global  path
    # 开始绘制路径
    path = [(x, y)]

    # 准备绘图海龟
    draw_turtle.penup()
    draw_turtle.goto(x, y)
    draw_turtle.pendown()

def continue_drawing(x, y):
    global path
    # 继续绘制路径
    draw_turtle.goto(x, y)
    path.append((x, y))

def calculate_angle(index):
    # 计算海龟前进角度
    if index + 1 < len(path):
        current = path[index]
        next_point = path[index + 1]
        dx = next_point[0] - current[0]
        dy = next_point[1] - current[1]
        return math.degrees(math.atan2(dy, dx))
    return 0

def move_along_path(index=0):
    # 沿路径移动
    if index < len(path) - 1:
        current = path[index]
        next_point = path[index + 1]

        # 计算距离和角度
        distance = math.sqrt(
            (next_point[0] - current[0])**2 + 
            (next_point[1] - current[1])**2
        )

        # 设置海龟朝向
        angle = calculate_angle(index)
        move_turtle.setheading(angle)

        # 移动
        move_turtle.goto(next_point[0], next_point[1])

        # 递归移动到下一个点
        screen.ontimer(
            lambda: move_along_path(index + 1), 
            50  # 移动间隔时间
        )
    else:
        # 路径结束
        move_turtle.penup()

def finish_drawing(x, y):    
    # 显示并移动海龟
    if len(path) > 1:
        move_turtle.showturtle()
        start_x, start_y = path[0]
        move_turtle.goto(start_x, start_y)
        move_turtle.pendown()
        move_turtle.setheading(calculate_angle(0))

        # 开始沿路径移动
        move_along_path()

def main():
    # 初始化屏幕和海龟
    setup_screen()

    # 绑定鼠标事件
    screen.onscreenclick(start_drawing, 1)  # 左键开始绘制
    screen.onscreenclick(continue_drawing, 1)  # 左键继续绘制
    screen.onscreenclick(finish_drawing, 3)  # 右键结束绘制

    screen.listen()

    # 启动主循环
    turtle.done()

# 运行程序
if __name__ == "__main__":
    main()
相关推荐
NRatel16 小时前
亚马逊S3的使用简记(游戏资源发布更新)
游戏·unity·amazon s3
天波信息技术分享1 天前
AI 云电竞游戏盒子:从“盒子”到“云-端-芯”一体化竞技平台的架构实践
人工智能·游戏·架构
小杨 想拼1 天前
使用js完成抽奖项目 效果和内容自定义,可以模仿游戏抽奖页面
前端·游戏
qq_546937272 天前
一款开源的远程桌面软件,旨在为用户提供流畅的游戏体验,支持 2K 分辨率、60 FPS,延迟仅为 40ms。
游戏
How_doyou_do2 天前
关于截屏时实现游戏暂停以及本地和上线不同步问题
游戏
李昕壑2 天前
CS2服务器是何方神圣
游戏
wanhengidc2 天前
云手机选哪个比较好用?
服务器·网络·安全·游戏·智能手机
蛊明2 天前
Steam修改游戏安装目录
游戏·steam
李昕壑3 天前
FPS游戏时,你的电脑都在干什么(CS2)
游戏
zaiyang遇见3 天前
【递归完全搜索】CCC 2008 - 24点游戏Twenty-four
算法·游戏·c/c++·全排列·信息学奥赛