タートルグラフィックスで二匹の亀を同時に動かしてみよう


2匹の亀を同時に描写するには、

import turtle

# 1匹目の亀
t1 = turtle.Turtle()
t1.shape("turtle")
t1.color("blue")
t1.penup()
t1.sety(-50)
t1.pendown()

# 2匹目の亀
t2 = turtle.Turtle()
t2.shape("turtle")
t2.color("red")
t2.penup()
t2.sety(50)
t2.pendown()

のように

t1 = turtle.Turtle()

で亀のオブジェクトを変数に挿入する処理を数回行う必要があります。

亀のオブジェクトを変数に入れたら、今までの操作方法の

turtle.shape("turtle")

のようなライブラリ名.メソッドを

t1.shape("turtle")

オブジェクトを入れた変数.メソッドで操作できるようになります。




2匹の亀を同時に動かしてみます。


import turtle

# 1匹目の亀
t1 = turtle.Turtle()
t1.shape("turtle")
t1.color("blue")
t1.penup()
t1.sety(-50)
t1.pendown()

# 2匹目の亀
t2 = turtle.Turtle()
t2.shape("turtle")
t2.color("red")
t2.penup()
t2.sety(50)
t2.pendown()

# 2匹の亀を動かしてみる
t1.forward(150)
t2.forward(150)

turtle.done()

このコードだと1匹目の亀が動き終わってから2匹目の亀が動き出します。


このコードを

import turtle

# 1匹目の亀
t1 = turtle.Turtle()
t1.shape("turtle")
t1.color("blue")
t1.penup()
t1.sety(-50)
t1.pendown()

# 2匹目の亀
t2 = turtle.Turtle()
t2.shape("turtle")
t2.color("red")
t2.penup()
t2.sety(50)
t2.pendown()

for _ in range(15):
    t1.forward(10)
    t2.forward(10)

turtle.done()

のようにfor文で2匹の亀を交互に徐々に進めることにします。

上記の変更で亀は同時に動いているように見えますが、微妙に動いたり止まったりでぎこちない動きになります。


import turtle

# 1匹目の亀
t1 = turtle.Turtle()
t1.shape("turtle")
t1.color("blue")
t1.penup()
t1.sety(-50)
t1.pendown()

# 2匹目の亀
t2 = turtle.Turtle()
t2.shape("turtle")
t2.color("red")
t2.penup()
t2.sety(50)
t2.pendown()

screen = turtle.Screen()
screen.tracer(0)

for _ in range(15):
    t1.forward(10)
    t2.forward(10)

    # 2匹の移動命令が終わったタイミングで画面を更新!
    screen.update()

turtle.done()

Screenオブジェクトのtracerとupdateを組み合わせることで、両方の亀に命令は伝えておくけれども、updateが実行されるまでは亀は動かないというようにすることができるようになります。


screen.tracer(0)

は描写の自動更新をオフにするという意味になりまして、

screen.update()

の実行があるまで描写を保留します。

京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。