turtleモジュールで遊ぼう

turtleモジュール(en, ja)には、タートルグラフィックスを描くための関数が定義されています。

以下のサンプルをみてください。

# square.py
import turtle

def square(n):  
  for i in range(4):
    turtle.forward(n)
    turtle.right(90)

square(30)
turtle._root.mainloop()

このスクリプトを実行するとウィンドウが表示されてから、亀(矢印)が正方形を描きます(下図)。

> python square.py

リファレンスにturtleモジュールで定義されている関数について説明がありますが、forward関数は亀を引数だけ前進させます。right関数は亀を引数(角度は度)だけ右を向かせる関数です。つまりsquare関数では、

を亀に繰り返し命令する事で亀に正方形を描かせていることになります。

turtleモジュールではたくさんの関数が定義されていますが、

という2つの操作が基本です。

今度は次のような図形を亀に描かせてみましょう。

# square3.py
import turtle

def square(n):  
  for i in range(4):
    turtle.forward(n)
    turtle.right(90)

def sample1(n):
  turtle.right(30)
  for i in range(3):
    square(n)
    turtle.right(120)

sample1(30)    
turtle._root.mainloop()

コマンドラインから次のように実行します。

> python square3.py

先ほど定義したsquare関数を用いて、亀に3つの正方形を描かせています。

forward関数を実行すると、亀がのそのそと前進します。その動きがあまりにも遅いので、squareのような単純な図形の場合はいいのですが、図形が複雑になると時間がとてもかかります。ですからturtleモジュールではtracer関数が定義されています。この関数では描かせる動物を亀にするか、チーターにするかの選択ができるようになっています。亀の場合はゆっくりと、チーターの場合は即座に図形を描きます(本当は線を引くアニメーションをON/OFFにします)。

turtle.tracer(1)

とすると、亀に図形を描かせます。

turtle.tracer(0)

とすると、チーターに図形を描かせる事になります。

今度はもう少し複雑な図形を描いてみましょう。今度はチーターにそれを描かせます。

# sample2.py
import turtle

def sample2():
  for i in range(36):
    turtle.forward(10)
    turtle.right(10)
    for j in range(3):
      turtle.forward(50)
      turtle.right(120)

turtle.up()
turtle.goto(0, 50) # 位置の調節
turtle.down()
turtle.tracer(0)
sample2()
turtle._root.mainloop()

実行すると次のような図形が描かれます。

> python sample2.py

up関数は、亀を移動させたときに線を引かないようにさせます(ペンのアップ)。down関数は亀を移動させたときに線を引くようにします(ペンのダウン)。goto関数は亀を引数で指定した場所(座標)に移動させます。

サンプル

import turtle

def spiral(size, angle):
  if size < 100:
    turtle.forward(size)
    turtle.right(angle)
    spiral(size+2, angle)

turtle.tracer(0)
spiral(0, 90)

turtle.up()
turtle.goto(140, 20)
turtle.down()
spiral(0, 70)

turtle._root.mainloop()

import turtle

def rtriangle(length, level):
  def tri(length):
    for i in range(3):
      turtle.forward(length)
      turtle.right(120)

  if level > 0:
    tri(length)
    n = length / 2
    turtle.up()
    turtle.forward(n)
    turtle.right(60)
    turtle.down()
    rtriangle(n, level-1)

turtle.tracer(0)
rtriangle(150, 5)
turtle._root.mainloop()

import turtle

def move(x, y):
  turtle.up()
  turtle.goto(x, y)
  turtle.down()
  
def tree(length, level):
  if level > 0:
    x, y = turtle.position()
    a = turtle.heading()
    # draw left node
    turtle.left(18)
    turtle.forward(length)
    tree(length-10, level-1)

    # draw right node
    move(x, y)
    turtle.setheading(a)
    turtle.right(18)
    turtle.forward(length)
    tree(length-10, level-1)

turtle.tracer(0)
move(0, -100)
turtle.setheading(90)
tree(60, 5)
turtle._root.mainloop()

import turtle

def koch(length, level):
  if level == 0:
    turtle.forward(length)
  else:
    n = length / 3
    w = level - 1
    koch(n, w)
    turtle.left(60)
    koch(n, w)
    turtle.right(120)
    koch(n, w)
    turtle.left(60)
    koch(n, w)

turtle.tracer(0)
koch(300, 4)
turtle._root.mainloop()

色をつけると、こんな楽しい図形を描く事が出来ます。

import turtle

def leaf(n, pencolor, brushcolor):
  def cir():
    for i in range(9):
      turtle.forward(n)
      turtle.right(10)

  a = turtle.heading()
  turtle.color(brushcolor)
  turtle.fill(1)
  cir()
  turtle.right(90)
  cir()
  turtle.fill(0)

  turtle.setheading(a)
  turtle.color(pencolor)
  cir()
  turtle.right(90)
  cir()

def flower(x, y, size, color_set):
  turtle.up()
  turtle.goto(x, y)
  turtle.down()
  turtle.setheading(90)
  turtle.color(color_set[0])
  turtle.forward(size * 2)
  turtle.right(30)
  leaf(size, color_set[0], color_set[0])
  turtle.setheading(90)
  turtle.forward(size * 14)

  for i in range(9):
    leaf(size, color_set[1], color_set[2])
    turtle.right(10)
  
turtle.tracer(0)
flower(-100, -120, 7, ("lightgreen",  "mistyrose", "lightpink"))
flower(0,    -120, 4, ("greenyellow", "lemonchiffon", "gold"))
flower(100,  -120, 8, ("palegreen", "paleturquoise", "lightblue"))
turtle._root.mainloop()

Python ページ