お絵かきで Python を学ぶ（タートルグラフィックス）

# タートルグラフィックスとは
教育用プログラミング言語の「LOGO」を元に画面上の亀をプログラミングで操作して図として描画するといったものです。
1960 年代に開発され、プログラムの結果を視覚ですぐに確認できることから、子供向けのプログラミング学習に用いられることもあります。

# 環境

- PyCharm
- Python3

# タートルグラフィックスに触れる（対話型シェル）
まずは対話型シェルを用いて簡単にタートルグラフィックスに触れてみようと思います。

PyCharm のターミナル画面を開いて、`Python`と入力します。

```
$ Python
```

これで対話型シェルになったので、`turtle`を import します。

```
>>> import turtle
```

つぎに`turtle.forward(100)`と入力します。

```
>>> turtle.forward(100)
```

すると以下のようにグラフィックが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/3e20a4cc-2f6b-23c8-2d69-ee046791cfde.png)

これは矢印が前に 100 回進んだということを表しています。

矢印の向きを下に向けたい場合には`turtle.right(90)`として 右に 90 度曲げます。

```
>>> turtle.right(90)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/afcce49f-e862-b8ad-804d-d9794f02304d.png)

この状態で再度`turtle.forward(100)`入力すると下に進みます。

```
>>> turtle.forward(100)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/4fbb80d1-3576-8bce-3647-65ab4cc7c3e4.png)

先頭の矢印の形が味気ないと感じる場合には`shape.()`で変更できます。
今回は亀に変更させてみたいと思います。

```
>>> turtle.shape('turtle')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/49b59c6d-49a2-c2f9-0d93-7be4805a6ec1.png)

`color()`でこの亀の色を変更させることも可能です。

```
>>> turtle.color('red')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/4e5e336a-e710-d922-17ac-cef53da1c98f.png)

この亀を隠したい場合には`hideturtle()`を使用します。

```
>>> turtle.hideturtle()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/350e43b7-4704-1eff-2da1-24850a10779b.png)

隠した亀を再び表示させたい場合には`showturtle()`と入力します。

```
>>> turtle.showturtle()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/70b83d44-e5e1-9c9f-fc19-4b6dd7b5626e.png)

直線以外にも円を描くこともできます。

```
>>> turtle.circle(100)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/eecf0e6f-d652-fa4e-212b-39fe5ad67264.png)

今、赤い線で描かれていますがこの線の色を変更させたい場合には
`pencolor()`を使用します。

同時に角度を少し変更させて進ませてみます。

```
>>> turtle.pencolor('blue')
>>> turtle.right(45)
>>> turtle.forward(100)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/b1a6bff7-7639-9a88-77aa-8f34cc2ba750.png)

後ろに進むことも可能であり、`backward()`を使用します。

```
>>> turtle.backward(200)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/13fe6998-0fa4-804b-e653-29ba67378661.png)

一番最初の位置に戻りたい場合には`home()`を使用します。

```
>>> turtle.home()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/2daca7ec-3a3c-0d0e-8f4b-1ad542f4fe6d.png)

すべてクリアにしたい場合には`clear()`を使用します。

```
>>> turtle.clear()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/ed8ed6e4-627f-6533-8db3-bf708b4bfe66.png)

終了させるときには最後に`done()`と入力します。

```
>>> turtle.done()
```

# ファイルを作成して実行させる
上記ではターミナルから対話型シェルで実行させたが、ここからは
適当な名前の Python ファイルを作成してファイルから実行させてみます。

ファイル上に以下の前進させるだけの簡単な処理を記述して実行させてみます。

```.py
import turtle

turtle.forward(100)
```

すると一瞬だけ表示されてすぐに消えてしまうことが確認できると思います。
ずっと表示するには最後の行にすべての処理が完了しましたと表す、`done()`を
記述してあげます。

```.py
import turtle

turtle.forward(100)
turtle.done()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/5e80bee5-ac9e-3139-dfe8-278339874d76.png)

これでしっかりと表示されることが確認できると思います。

## 四角形

Python の for　ループ使用して四角形を出力させてみます。
考え方としては`turtle.forward(100)`の前進を 4 回繰り返し、
一度前進が完了したら 90 度に曲がる処理を加えるといったものである。

```.py
import turtle

turtle.color('red', 'yellow')

turtle.begin_fill()
for _ in range(4):
    turtle.forward(100)
    turtle.right(90)
turtle.end_fill()

turtle.done()
```

ファイル形式では処理の内容を`turtle.begin_fill()`と`turtle.end_fill()`で
括ってあげます。

実行してあげると線が赤で中が黄色の四角形が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/9741ca6b-24fc-b7e4-863e-1dcd34af1206.png)

## 星形
星形のプログラムですが、四角形のプログラムと構成がほとんど一緒になります。
変更箇所としては前進する回数が 5 回になるのと角度が`360 / 5 * 2`になります。

```.py
import turtle

turtle.color('red', 'yellow')

turtle.begin_fill()
for _ in range(5):
    turtle.forward(100)
    turtle.right(360 / 5 * 2)
turtle.end_fill()

turtle.done()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/b92b6bdb-54d0-27b3-4a72-aaea3963584f.png)

星を三回作成させ、一度進むたびに前進する距離を少しずつ増やしてみる。

```.py
import turtle

turtle.color('red', 'yellow')

turtle.begin_fill()
for i in range(5 * 3):
    turtle.forward(100 + i * 10)
    turtle.right(360 / 5 * 2)
turtle.end_fill()

turtle.done()
```

すると以下のように綺麗な図形ができる。
このようにループの処理を色々としてあげると違った形になり楽しむことができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/080c0ca5-e58b-4902-6fab-d193aecd41e9.png)

## 三角形
三角形も同様に三回前進して、一度前進したあとに角度を変えるといった処理になります。

```.py
import turtle

turtle.color('red', 'yellow')

turtle.begin_fill()
for i in range(3):
    turtle.forward(100)
    turtle.left(360 / 3)
turtle.end_fill()

turtle.done()
```

実行してみると三角形が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/5a500d52-2c67-17ec-05e1-7b177b6f7a76.png)

星形でも行ったように一度前進したあとの角度を少しずらしてあげるとどうなるか見てみます。

```.py
import turtle

turtle.begin_fill()
for i in range(200):
    turtle.forward(200)
    turtle.left(360 / 3 + 10)
turtle.end_fill()

turtle.done()
```

このように星型の時と同様に綺麗な図形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/c76c662c-ac3d-2d90-6902-4d45afdf4f47.png)

# おわり

ざっくりでしたが以上が扱い方の説明になります。

このタートルグラフィックスを使用することで自分のプログラミングが
簡単に可視化できるため子供はもちろん大人も楽しんでプログラミングを学習することができると思います。

最後に以下のような木を作成することも可能です。

```.py
import turtle as t
foo = t.Turtle()
foo.left(90)
foo.speed(10)

def draw(l):
    if(l<10):
        return
    else:
        foo.forward(l)
        foo.left(30)
        draw(3*l/4)
        foo.right(60)
        draw(3*l/4)
        foo.left(30)
        foo.backward(l)

draw(100)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/4144ffcc-4d97-474a-6076-f89d9904e712.png)