Turtle
前回、Pythonのジェネレータの使い方を紹介しました。
今回はジェネレータを使ったTurtleの動かし方を紹介していきます。
これができるようになると次に複数の亀さんを同時(っぽく)に動かすことができるようになります。
そして複数の亀さんを同時(っぽく)に動かすためにはある亀さんが少し動いた後に次の亀さんが少し動くということを繰り返します。
そのためジェネレータを使って、ある亀さんが一回動いたら停止し、次の亀さんが一回動く、そして全部の亀さんが一回動いたら、最初の亀さんがまた一回動く、という動きをさせるわけです。
ということで今回やるジェネレータを理解していないと複数の亀さんを同時(っぽく)動かすのは難しいです。
それでは始めていきましょう。
ジェネレータを使わない方法のおさらい
今回、ジェネレータで必要な動きはある図形を「少しずつ動いて描く」ということです。
そのため今回は円を少しずつ動いて描くということをやってみましょう。
ただこの円を少しずつ動いて描くのは、別にジェネレータでなくてもできます。
ということでまずはジェネレータを使わずに描く方法を紹介します。
import turtle
import time
t = turtle.Turtle()
for _ in range(36):
t.forward(20)
t.right(10)
time.sleep(0.2)
turtle.done()
今回は20ピクセル進んでは、10度右に回転するということを36回繰り返すことで、360度の円を描いてみました。
また繰り返し処理の最後に「time.sleep(0.2)」を入れることで、200ミリ秒処理を停止してから、次の繰り返し処理をするようにしています。
実行するとこんな感じで円が描かれます。
ジェネレータを使う方法
それでは次にジェネレータを使って円を描いてみましょう。
ジェネレータを使い、円を描く方法は「while文」をジェネレータ内に書く方法と呼び出し側で書く方法の2種類があります。
1つ目の「while文をジェネレータ内で書く方法」では、呼び出し側で回数を指定することで円を描きます。
import turtle
import time
t = turtle.Turtle()
def move(t):
while True:
t.forward(20)
t.right(10)
time.sleep(0.2)
yield(0)
turtle_move = move(t)
for _ in range(36):
next(turtle_move)
turtle.done()
また2つ目の「while文を呼び出し側で書く方法」はこんな感じです。
import turtle
import time
t = turtle.Turtle()
def move(t):
for _ in range(36):
t.forward(20)
t.right(10)
time.sleep(0.2)
yield(0)
turtle_move = move(t)
while True:
flag = next(turtle_move, 1)
if flag == 1:
break
turtle.done()
どちらも実行結果は最初の動画と変わらないので割愛します。
大きな違いとして、1つ目の「while文をジェネレータ内で書く方法」では、呼び出し回数で図形をどこまで描くかを指定していることから、終了を気にせず使うことができます。
対して2つ目の「while文を呼び出し側で書く方法」では呼び出し側で「while文」を使っていることから、終了のシグナルをどこかで送ってやらなければいけません。
またこの場合はジェネレータ側が特定の回数で終了してしまうことに注意ですが、今回の場合はそれをフラグとして利用しています。
どちらがいいかは個人の好みかもしれませんが、とりあえず円を描くことに関しては2つ目の方法の方が確実に1周分で終わるのでいいかなと思っています。
次回はTurtleで複数の亀さんを動かす方法を紹介していきます。
ではでは今回はこんな感じで。
コメント