使用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()
相关推荐
美味小鱼4 小时前
实践Rust:编写一个猜数字游戏
开发语言·游戏·rust
疯狂创作者11 小时前
Scratch 《像素战场》系列综合游戏:像素战场游戏Ⅰ~Ⅲ 介绍
游戏
Sui_Network11 小时前
新集成,Sui 的 Phantom 时代正式开启!
游戏·金融·web3·去中心化·区块链
lin zaixi()4 天前
Unity游戏(Assault空对地打击)开发(1) 创建项目和选择插件
游戏
liberty0307064 天前
27游戏英雄升级潜力评估-青训营刷题
游戏
河西石头5 天前
双向链表在系统调度、游戏、文本编辑及组态方面的应用
游戏·链表·文本编辑器·双向链表·资源调度·组态软件·系统调度
yangshuo12815 天前
解决老游戏不兼容新系统win10win11问题
数据库·游戏
汉克老师6 天前
GESP2024年3月认证C++六级( 第三部分编程题(1)游戏)
c++·学习·算法·游戏·动态规划·gesp6级
windwind20006 天前
纪录片《寿司之神》杂感
程序人生·游戏·职场和发展·创业创新·个人开发·游戏策划
_Yhisken6 天前
【读书笔记】万字浅析游戏场景中常见的渲染性能优化手段
游戏·unity·性能优化·图形渲染·gpu