0x00 前言
KTurtle 是一个KDE开发的 Turtle Graphics(海龟绘图法)
教育编程环境,通过控制海龟的行进,在屏幕上绘制出相应图案的技术。它是根据开源的 GNU通用公共许可证发布。它可以让孩子通过可视化方式学会基本的编程思维,并掌握一定的数学、几何等知识。它的结构非常简单,非常适合儿童学习。
KTurtle 使用TurtleScript
语言进行操作,该语言是从Logo语言的基础上开发而来的。
0x01 KTurtle 基本操作
KTurtle在Linux上安装比较方便,例如在Ubuntu或Deepin系统中可以直接使用$ sudo apt install kturtle
命令进行安装。也可以使用它的一个在线版本。
下图是 KTurtle 的主界面
可以看到,它的核心区域包括左边的代码区
和右侧的效果展示区
。比如我们输入forward 100
,然后点击工具栏
中的运行按钮,或按F5
键运行,可以看到右侧的小乌龟向上移动了100个像素。如下图所示:
0x02 画一个正方形
画一个正方形的基本思路是:
- 前进 100 像素
- 左转
- 前进 100 像素
- 左转
- 前进 100 像素
- 左转
- 前进 100 像素
这里主要涉及到两个指令:前进(forward)和左转(turnleft)。forward指令前面已经使用到了,语法就是forward length,length表示要前进的距离,单位是像素;turnleft指令的语法是:turnleft angle,angle表示左转的角度,比如直角左转就是turnleft 90,如果写成turnleft 270就是直角右转了,也可以写成turnleft 180表示向后转。
因此,可以在代码区编写如下代码:
代码语言:javascript复制reset
forward 100
turnleft 90
forward 100
turnleft 90
forward 100
turnleft 90
forward 100
reset
表示先清除之前的操作,避免之前的操作影响小乌龟的行动。
下图是运行之后的效果:
运行时可以选择速度,以便更好观察小乌龟的行进过程。
分析上面的代码可以发现,代码中存在较多的重复代码,这种情况可以使用循环(repeat)指令来解决。repeat指令的格式为:repeat count,count为要重复的次数。修改后的代码如下:
代码语言:javascript复制reset
forward 100
repeat 3 {
turnleft 90
forward 100
}
0x03 画一个圆形
TurtleScript语言并没有提供画曲线的方法,如果想画圆就需要用到一些几何原理。根据初中几何知识,当一个正多边形边数越多时,就越接近一个圆,利用这个原理,画圆就变成了画一个边数较多的正多边形。
前面画正方形可以看作是经历了4次90度拐弯,也就是说,每次拐弯的度数等于360 / n
,n为边数。我们先来画一个n=10
的正多边形:
reset
forward 50
repeat 9 {
turnleft 36
forward 50
}
效果如图所示:
可以看到,当正多边形的边数为10时,还不是很圆,我们再来试下边数为60的情况:
代码语言:javascript复制reset
forward 10
repeat 59 {
turnleft 6
forward 10
}
可以看到此时已经非常圆了,肉眼几乎看不出与圆形的差别了。
0x04 画一个正方形螺线
正方形螺线是一个边长一直在增长的正方形,为了实现这样的效果,需要用到变量(Variable)
。
在TurtleScript中使用$x
方式表示变量,可以直接赋值或访问。
我们可以先定义一个初始值为5
的变量$len
,表示一开始的变长为5
,然后经过两次拐弯后,将边长加5,继续循环。完整的代码如下:
reset
$len = 5
repeat 40 {
repeat 2 {
forward $len
turnleft 90
}
$len = $len 5
}
效果如图所示:
0x05 利用函数进行逻辑复用
对于重复性工作,可以通过函数来实现。在KTurtle中可以使用learn
指令定义函数。下面是一段根据起点和终点画直线的函数代码:
learn drawLine $x1, $y1, $x2, $y2 {
go $x1, $y1
if $x2 - $x1 > 0 {
$angle = arctan ($y2 - $y1) / ($x2 - $x1)
direction 90 $angle
} else if $x2 - $x1 < 0 {
$angle = arctan ($y2 - $y1) / ($x2 - $x1)
direction -90 $angle
} else {
if $y2 - $y1 > 0 {
direction 180
} else {
direction 0
}
}
forward sqrt ($y2 - $y1) ^ 2 ($x2 - $x1) ^ 2
}
这段代码中还包含了if
/else
分支语句,可以用来进行条件判断。
因此,如果想画一个梯形可以使用以下代码:
代码语言:javascript复制drawLine 100, 100, 200, 100
drawLine 100, 100, 50, 200
drawLine 50, 200, 300, 200
drawLine 200, 100, 300, 200
0x06 其它设置
设置背景颜色
代码语言:javascript复制canvascolor 07, 55, 140
设置画笔颜色
代码语言:javascript复制pencolor 160, 0, 0
设置画笔粗细
代码语言:javascript复制penwidth 3
0x07 一个相对复杂的例子
代码语言:javascript复制reset
canvascolor 07 , 55, 140
pencolor 160, 0, 0
penwidth 3
go 130, 150
direction 0
repeat 8 {
repeat 8 {
forward 20
turnright 15
}
repeat 7 {
forward 20
turnright 15
}
repeat 36 {
forward 6
turnright 10
}
}
0x08 总结
KTurtle是很容易上手的编程学习工具,对于初学者理解编程中常见的变量
、条件
、循环
、函数
等概念具有较大帮助,同时也可以加深对几何知识的理解。