タートルグラフィックスで亀と戯れる (前編)

# タートルグラフィクスとは

ペンを持った亀がいます。
簡単な命令を使って亀を移動させると、亀が持っているペンによって亀の動いた跡が線として描かれます。
ペンを持ち上げながら移動もできるので、一筆書きではない図形も描けます。
ペンの色や太さも変えられます。

タートルグラフィックスは、1967年にLOGO言語とともに登場し、子供たちへのプログラミング教育にも使われています。
命令による動作が目に見えるので理解しやすく、命令を組み合わせていろいろさせることでプログラミングの理解も早まるのでしょう。
http://en.wikipedia.org/wiki/Turtle_graphics

# Pythonでタートルグラフィックス

WindowsではPythonをインストールすればタートルグラフィクスも使えます。
Window以外では外部グラフィックスライブラリを追加インストールする必要があるかもしれません。

## 動作確認＆動作デモ

まずは、pythonがインストールされていることを確認してください。
Windows OSなら、以下を参照して Add python.exe to Path にチェックを入れてpythonをインストールしてください。
> windows環境へのpythonインストール http://qiita.com/maisuto/items/404e5803372a44419d60

次に、亀(turtle)が動くか確認してみましょう。

```shell-sesshon
C:\Users\home> python -m turtle
```

Windows OSであれば問題なく動くでしょう。
その他の環境では、以下のようなエラーが表示されるかもしれません。

```shell-sesshon
$ python -m turtle
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.7/lib-tk/turtle.py", line 107, in <module>
    import Tkinter as TK
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 42, in <module>
    raise ImportError, str(msg) + ', please install the python-tk package'
ImportError: No module named _tkinter, please install the python-tk package
```

このエラーの場合、最後の行に書いてあるように python-tk パッケージをインストールする必要があります。
Debian/Ubuntu Linux であれば以下のように、パッケージをインストールしてください。

```shell-sesshon
$ sudo apt-get install python-tk
```

もし、まったく動かないようであれば、最新版のPythonをインストールしてみてください。

# 亀と戯れる

## 準備

Pythonインタープリタを起動して、turtleパッケージをimportします。

```py
C:\Users\home> python
>>> from turtle import *
```

## なにができる？

亀にどんなことを命令できるかは、dir() や help() で確認できます。

```py
>>> dir()
['Pen', 'RawPen', 'RawTurtle', 'Screen', 'ScrolledCanvas', 'Shape', 'Terminator', 'Turtle', 'TurtleScreen', 'Vec2D', '__builtins__', '__doc__', '__name__', '__package__', 'acos', 'addshape', 'asin', 'atan', 'atan2', 'back', 'backward', 'begin_fill', 'begin_poly', 'bgcolor', 'bgpic', 'bk', 'bye', 'ceil', 'circle', 'clear', 'clearscreen', 'clearstamp', 'clearstamps', 'clone', 'color', 'colormode', 'cos', 'cosh', 'degrees', 'delay', 'distance', 'done', 'dot', 'down', 'e', 'end_fill', 'end_poly', 'exitonclick', 'exp', 'fabs', 'fd', 'fill', 'fillcolor', 'floor', 'fmod', 'forward', 'frexp', 'get_poly', 'getcanvas', 'getpen', 'getscreen','getshapes', 'getturtle', 'goto', 'heading', 'hideturtle', 'home', 'ht', 'hypot', 'isdown', 'isvisible', 'ldexp', 'left', 'listen', 'log', 'log10', 'lt', 'mainloop', 'mode', 'modf', 'onclick', 'ondrag', 'onkey', 'onrelease', 'onscreenclick', 'ontimer', 'pd', 'pen', 'pencolor', 'pendown', 'pensize', 'penup', 'pi', 'pos', 'position', 'pow', 'pu', 'radians', 'register_shape', 'reset', 'resetscreen','resizemode', 'right', 'rt', 'screensize', 'seth', 'setheading', 'setpos', 'setposition', 'settiltangle', 'setundobuffer', 'setup', 'setworldcoordinates', 'setx', 'sety', 'shape', 'shapesize', 'showturtle', 'sin', 'sinh', 'speed', 'sqrt', 'st', 'stamp', 'tan', 'tanh', 'tilt', 'tiltangle', 'title', 'towards', 'tracer','turtle', 'turtles', 'turtlesize', 'undo', 'undobufferentries', 'up', 'update','width', 'window_height', 'window_width', 'write', 'write_docstringdict', 'xcor', 'ycor']
>>> help(Turtle)
>>> help(foward)
>>> help(back)
>>> help(left)
>>> help(right)
>>> help(up)
>>> help(down)
>>> help(color)
>>> help(clear)
>>> help(bye)
```

更に詳しく知りたい場合はオンラインドキュメントを参照してください。
http://docs.python.jp/2/library/turtle.html

## 単純移動

手始めに、亀を単純移動させてみましょう。

```py
>>> forward(100)    # 100歩進め
>>> circle(100)     # 半径100の円を描け
>>> left(90)        # 90度左向け
>>> color('red')    # 赤ペンを持て
>>> forward(100)    # 100歩進め
```

> ![turtle1.png](https://qiita-image-store.s3.amazonaws.com/0/29070/ae37351d-7170-a612-5629-a91812e66a35.png)


## 模様を描く

処理を繰り返して、模様を描かせてみましょう。

```py
>>> for i in range(0, 360, 30):  #0度から360度まで30度おきに
...     circle(50)               # 行頭でTABキーを入力してインデント(段下げ)
...     left(30)                 # 行頭でTABキーを入力してインデント(以降説明省略)
... #行頭で改行入力することで動作開始
>>> color('green'):
>>> for i in range(0, 360, 30):
...     circle(30)
...     left(30)
...     forward(10)
... #行頭で改行入力することで動作開始
```

> ![turtle2.png](https://qiita-image-store.s3.amazonaws.com/0/29070/e1166cf4-87a3-91c2-ca98-4305aada15fb.png)


## 描画関数を定義してみる

星を描く操作を関数にして星を描いてみましょう。

```py
>>> def star(size):
...     for i in 1,2,3,4,5:
...         forward(size)
...         right(180 - 180/5)
... #行頭で改行入力することで関数定義終了
>>> reset()
>>> star(100)
>>> color('green')
>>> begin_fill()
>>> star(50)
>>> end_fill()
```

> ![turtle3.png](https://qiita-image-store.s3.amazonaws.com/0/29070/1d68bd50-10c1-b1fe-42e8-cb88bef20f90.png)

## フラクタル図形を描く

```py
>>> def fractal(size, depth=0):
...    if depth <= 0:
...       forward(size)                          #直線
...    else:
...       fractal(size/3, depth-1); left(60)     #1/3の長さでフラクタル描画、左に60度向く
...       fractal(size/3, depth-1); left(-120)   #1/3の長さでフラクタル描画、右に120度向く
...       fractal(size/3, depth-1); left(60)     #1/3の長さでフラクタル描画、左に60度向く
...       fractal(size/3, depth-1)               #1/3の長さでフラクタル描画
... (空行入力) #行頭で改行入力することで関数定義終了
... reset(); fractal(200)
... reset(); fractal(200, 1)
... reset(); fractal(200, 2)
... reset(); fractal(200, 3)
```

> ![turtle4.png](https://qiita-image-store.s3.amazonaws.com/0/29070/85c07abd-0d58-9885-4331-a0d312fa09f0.png)

```py
>>> reset(); goto(-100,-100); clear()
>>> for i in "12345":
...     fractal(200, 3)
...     left(360/5)
... (空行入力)
```

> ![turtle5.png](https://qiita-image-store.s3.amazonaws.com/0/29070/a34ffa4a-64cf-28d6-4f32-cb38edc3fb7c.png)

前編は以上です。
後編では、複数の亀と戯れ、亀に新たな動作を追加してみようと思います。