先のkameの複雑な再帰描画をクローンを使わないで行うことを考える。まず問題の所在を明確にするためにプログラムにデバッグ用のprint文を追加した。プログラムの一部を載せる(再帰の深さは浅くしてある)。
def kame( position, size):
space = ' '*4*(int(200/size)-1)
print(space, 'draw kame',position.ycor(), size)
sugata( position, size)
if size > 75:
position.fd(size/2)
kame(position, size/2)
position.bk(size)
kame(position, size/2)
print(space, 'returning', position.ycor(), size)
この出力は以下のようになる:
draw kame 0.0 200
draw kame 100.0 100.0
draw kame 150.0 50.0
returning 150.0 50.0
draw kame 50.0 50.0
returning 50.0 50.0
returning 50.0 100.0
draw kame -150.0 100.0
draw kame -100.0 50.0
returning -100.0 50.0
draw kame -200.0 50.0
returning -200.0 50.0
returning -200.0 100.0
returning -200.0 200
draw kame 100に対応する(再帰のレベルが同じ)描画がdraw kame -150となっておりこれがずれの原因になる。
そこで関数kameに渡したオブジェクトpositionの属性がこのkame関数のなかで最終的に変化がなかったようにダミーの動きをいれる。プログラムは以下のようになる。
#coding: utf-8
import turtle
def sugata( center, size):
for i in range(6):
painter = center.clone()
painter.fd(size)
painter.rt(120)
painter.fd(size)
center.rt(60)
def kame( position, size):
#space = ' '*4*(int(200/size)-1)
#print(space, 'draw kame',position.ycor(), size)
sugata( position, size)
if size > 10:
position.fd(size/2)
kame(position, size/2)
position.bk(size)
kame(position, size/2)
position.fd(size/2) #ダミーの動き
#print(space, 'returning', position.ycor(), size)
if __name__ == '__main__':
turtle.clearscreen()
position = turtle.Turtle()
position.ht()
position.lt(90)
kame( position, 200)
【結果の描画」
期待した通りの結果が得られた。