KTurtle编程使用入门

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 画一个正方形

画一个正方形的基本思路是:

  1. 前进 100 像素
  2. 左转
  3. 前进 100 像素
  4. 左转
  5. 前进 100 像素
  6. 左转
  7. 前进 100 像素

这里主要涉及到两个指令:前进(forward)左转(turnleft)forward指令前面已经使用到了,语法就是forward $length$length表示要前进的距离,单位是像素;turnleft指令的语法是:turnleft $angle$angle表示左转的角度,比如直角左转就是turnleft 90,如果写成turnleft 270就是直角右转了,也可以写成turnleft 180表示向后转。

因此,可以在代码区编写如下代码:

reset
forward 100
turnleft 90
forward 100
turnleft 90
forward 100
turnleft 90
forward 100

reset表示先清除之前的操作,避免之前的操作影响小乌龟的行动。

下图是运行之后的效果:

运行时可以选择速度,以便更好观察小乌龟的行进过程。

分析上面的代码可以发现,代码中存在较多的重复代码,这种情况可以使用循环(repeat)指令来解决。repeat指令的格式为:repeat $count$count为要重复的次数。修改后的代码如下:

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的情况:

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分支语句,可以用来进行条件判断。

因此,如果想画一个梯形可以使用以下代码:

drawLine 100, 100, 200, 100
drawLine 100, 100, 50, 200
drawLine 50, 200, 300, 200
drawLine 200, 100, 300, 200

0x06 其它设置

设置背景颜色

canvascolor 07, 55, 140

设置画笔颜色

pencolor 160, 0, 0

设置画笔粗细

penwidth 3

0x07 一个相对复杂的例子

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是很容易上手的编程学习工具,对于初学者理解编程中常见的变量条件循环函数等概念具有较大帮助,同时也可以加深对几何知识的理解。

分享