Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

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

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

タートルグラフィックスは、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)が動くか確認してみましょう。

C:\Users\home> python -m turtle

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

$ 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 であれば以下のように、パッケージをインストールしてください。

$ sudo apt-get install python-tk

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

亀と戯れる

準備

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

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

なにができる?

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

>>> 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

単純移動

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

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

turtle1.png

模様を描く

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

>>> 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

描画関数を定義してみる

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

>>> 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

フラクタル図形を描く

>>> 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

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

turtle5.png

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

shiracamus
元、低レイヤーエンジニア。 現、サイバーセキュリティ研究者。 使用言語は、C, Lisp, Java, Python, C#, JavaScript/Node.js。 経験アセンブリ言語は Z80, 6502, 6809, 68000, SPARC, PowerPC, ARM, x86/x64。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away