turtle.right()
使い方
基本的な構文は以下の通りです。
turtle.right(angle)
angle
:カメを回転させたい角度を度数で指定します。例えば、turtle.right(90)
とすると、カメは90度右に回転します。
簡単な例を見てみましょう。
import turtle
# タートルグラフィックスの画面を作成
screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.title("turtle.right() の例")
# カメを作成
t = turtle.Turtle()
t.shape("turtle") # カメの形にする
# 初期位置から右に90度回転し、前に進む
t.forward(100) # 100ピクセル前に進む
t.right(90) # 右に90度回転
t.forward(100) # さらに100ピクセル前に進む
# 画面が閉じないようにする
turtle.done()
このコードを実行すると、カメはまず右に100ピクセル進み、次に右に90度向きを変えてから、さらに100ピクセル進みます。結果として、L字型のような線が描かれます。
NameError: name 'turtle' is not defined または NameError: name 'right' is not defined
エラーの原因
- タートルオブジェクトの変数名を間違えている。
turtle.Turtle()
でタートルオブジェクトを作成していないのに、直接turtle.right()
を呼び出そうとしている。turtle
モジュールが正しくインポートされていない。
よくある間違いの例
# 間違い1: turtleモジュールをインポートしていない
# right(90) # これだとエラー
# 間違い2: turtle.Turtle()でオブジェクトを作成していないのに直接呼び出す
# import turtle
# turtle.right(90) # これだとエラー (turtleモジュール自体にはright()という関数はない)
# 間違い3: 変数名を間違えている
# import turtle
# t = turtle.Turtle()
# turle.right(90) # 'turle' は間違い
トラブルシューティング
import turtle
をコードの先頭に記述しているか確認する。- タートルオブジェクトを正しく作成しているか確認する。 例えば、
t = turtle.Turtle()
のように作成し、その後はt.right(90)
のように、作成したオブジェクトを通してメソッドを呼び出す必要があります。 - 変数名のスペルミスがないか確認する。 大文字と小文字も区別されます。
正しいコードの例
import turtle
t = turtle.Turtle() # タートルオブジェクトを作成し、変数tに代入
t.right(90) # tオブジェクトのright()メソッドを呼び出す
TypeError: right() missing 1 required positional argument: 'angle'
エラーの原因
turtle.right()
関数に角度の引数(angle
)が渡されていない。
よくある間違いの例
import turtle
t = turtle.Turtle()
t.right() # 角度が指定されていない
トラブルシューティング
- 必ず回転させたい角度を数値で指定する。 例えば、
t.right(90)
のようにします。
正しいコードの例
import turtle
t = turtle.Turtle()
t.right(90) # 90度回転
AttributeError: 'module' object has no attribute 'right'
エラーの原因
- これは「
NameError
」の「間違い2」と似ていますが、from turtle import *
のようにワイルドカードインポートをしていない場合に発生しやすいです。もしimport turtle
としている場合、right()
ではなくturtle.right()
と書くべきですが、もし誤ってタートルオブジェクトを介さずにturtle.right()
のように呼んでしまうと、このようなエラーになることがあります。
よくある間違いの例
import turtle
# t = turtle.Turtle() # この行がない、または別の変数名
turtle.right(90) # turtleモジュール自体にright()という関数はない
トラブルシューティング
- タートルオブジェクトを作成し、そのオブジェクトのメソッドとして
right()
を呼び出すことを確認する。t = turtle.Turtle()
t.right(90)
エラーの原因 (論理エラー)
- 画面がすぐに閉じてしまう
プログラムが終了すると、タートルグラフィックスのウィンドウもすぐに閉じてしまうため、結果を確認できない。 - 処理の順序の誤り
forward()
とright()
の呼び出し順序が期待と異なる。 - 回転量が累積されていることの理解不足
right()
を複数回呼び出すと、その都度カメの向きが累積して変わることを忘れている。 - 回転方向の勘違い
right()
とleft()
を混同している。 - 角度の指定ミス
例えば、直進させたいのに90度回転させてしまった、など。
よくある間違いの例
import turtle
t = turtle.Turtle()
t.forward(100)
t.right(180) # 180度回転すると、逆方向を向いてしまう
t.forward(100) # 結果的に元の場所に戻るように見える
# 画面がすぐに閉じる例
# import turtle
# t = turtle.Turtle()
# t.right(90)
# (画面がすぐに消えてしまう)
-
コードを一行ずつ追いかける (ステップ実行)
どのright()
がどのタイミングで、どの向きに影響を与えているかを頭の中でシミュレーションするか、可能であればデバッガを使ってステップ実行してみる。 -
角度を再確認する
意図した角度になっているか(例:正方形なら90度、正三角形なら120度)。 -
turtle.done() または screen.exitonclick() を追加する
プログラムの最後にturtle.done()
(またはscreen = turtle.Screen()
としてscreen.exitonclick()
)を追加すると、タートルグラフィックスのウィンドウが閉じずに残り、クリックするまで開いたままになります。これにより、描画結果をじっくり確認できます。import turtle screen = turtle.Screen() # 画面オブジェクトを作成 (optional but good practice) t = turtle.Turtle() t.forward(100) t.right(90) t.forward(100) turtle.done() # ウィンドウがクリックされるまで開いたままにする # または screen.exitonclick()
例1:正方形を描く
最も基本的な例です。カメを前進させ、90度右に回転させることを4回繰り返すことで正方形を描きます。
import turtle
# 画面とタートルオブジェクトの準備
screen = turtle.Screen()
screen.setup(width=400, height=400)
screen.title("正方形を描く")
t = turtle.Turtle()
t.shape("turtle") # カメの形にする
t.speed(1) # 描画速度 (1:遅い - 10:速い, 0:最速)
# 正方形を描くループ
for _ in range(4): # 4回繰り返す
t.forward(100) # 100ピクセル前進
t.right(90) # 右に90度回転
# 画面が閉じないようにする
turtle.done()
解説
for _ in range(4)
: 4回同じ動作を繰り返すためのループです。t.right(90)
: カメが現在向いている方向から、右に90度回転します。この操作ではカメは移動しません。t.forward(100)
: カメが向いている方向に100ピクセル進みます。t = turtle.Turtle()
: カメ(タートル)オブジェクトを作成します。screen = turtle.Screen()
: 描画する画面を作成します。import turtle
:turtle
モジュールをインポートします。
例2:星を描く
turtle.right()
を異なる角度で使用して、星形を描きます。五芒星の場合、外角が72度なので、right(144)
(180−360/5=180−72=108度が内角。星の頂点での回転は360/5=72度を2回曲がるように見えるため、144度)のように角度を指定します。
import turtle
screen = turtle.Screen()
screen.setup(width=500, height=500)
screen.title("星を描く")
t = turtle.Turtle()
t.shape("turtle")
t.speed(3)
t.pencolor("blue") # ペンの色を青に
t.pensize(2) # ペンの太さを2に
# 星を描くループ
for _ in range(5): # 5回繰り返す
t.forward(150) # 150ピクセル前進
t.right(144) # 右に144度回転 (星の角度)
turtle.done()
解説
t.pencolor()
やt.pensize()
で線の色や太さを変えることができます。- 星の各頂点での回転角度は、多角形の外角を考慮し、星が描かれるための特徴的な角度を使用します。五芒星の場合、
144
度が適切です。
例3:螺旋を描く
ループ内でforward()
の距離とright()
の角度を少しずつ変えることで、螺旋模様を描くことができます。
import turtle
screen = turtle.Screen()
screen.setup(width=600, height=600)
screen.title("螺旋を描く")
screen.bgcolor("black") # 背景色を黒に
t = turtle.Turtle()
t.pencolor("cyan") # ペンの色をシアンに
t.speed(0) # 最速
# 螺旋を描くループ
for i in range(200): # 200回繰り返す
t.forward(i) # 進む距離を徐々に長くする (iは0から199まで変化)
t.right(91) # わずかに90度より大きい角度で回転
turtle.done()
解説
t.right(91)
: 90度ではなく91度とすることで、わずかなずれが生じ、それが螺旋を描く効果を生み出します。もし90度ぴったりにすると正方形が複数描かれることになります。t.forward(i)
: ループ変数i
を距離として使うことで、毎回進む距離が少しずつ長くなります。これにより、外側に広がっていく効果が生まれます。t.speed(0)
: 最速で描画します。これにより、複雑な図形も素早く描画できます。screen.bgcolor("black")
: 画面の背景色を設定します。
turtle.right()
とleft()
を組み合わせて、色を変えながら複雑なパターンを描画することもできます。
import turtle
import random # ランダムな色を使うためにインポート
screen = turtle.Screen()
screen.setup(width=600, height=600)
screen.title("カラフルな多角形パターン")
screen.bgcolor("white")
t = turtle.Turtle()
t.speed(0)
t.pensize(2)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
# 多角形を繰り返してパターンを描く
for i in range(36): # 36回繰り返す
t.pencolor(random.choice(colors)) # リストからランダムに色を選択
for _ in range(6): # 六角形を描く (6回繰り返す)
t.forward(100)
t.right(60) # 六角形の内角を考慮した回転角度
t.right(10) # 各六角形を描いた後、全体を10度回転させる
turtle.done()
- 内側のループでは
right(60)
で六角形を描き、外側のループではright(10)
で全体の向きを少しずつ変えることで、放射状のパターンが生まれます。 - 外側のループで36回、内側のループで6回(六角形)描画します。
random.choice(colors)
:colors
リストからランダムに色を選びます。import random
: ランダムな選択をするためにrandom
モジュールをインポートします。
turtle.left()(または turtle.lt())を使用する
turtle.right()
がカメを時計回りに回転させるのに対し、turtle.left()
は反時計回りに回転させます。しかし、数学的な角度の概念を利用すれば、right()
をleft()
で、left()
をright()
で代替することが可能です。
説明
- また、
right(X)
はleft(360 - X)
と同じ効果を持ちます(正の角度の場合)。 left(90)
はright(-90)
と同じ効果を持ちます。right(90)
はleft(-90)
と同じ効果を持ちます。turtle.left(angle)
:angle
で指定された度数だけ反時計回りに回転します。
コード例
import turtle
screen = turtle.Screen()
screen.setup(width=400, height=400)
screen.title("turtle.left() で代替")
t = turtle.Turtle()
t.shape("turtle")
t.speed(1)
# right(90) の代替として left(-90) を使う
t.forward(100)
t.left(-90) # 右に90度回転と同じ効果
t.forward(100)
# right(90) の代替として left(270) を使う (360 - 90 = 270)
t.forward(100)
t.left(270) # 右に90度回転と同じ効果
t.forward(100)
turtle.done()
turtle.setheading()(または turtle.seth())を使用する
turtle.right()
やturtle.left()
が「現在の向きからの相対的な回転」であるのに対し、turtle.setheading()
は「絶対的な向き」を設定します。タートルは指定された絶対角度に即座に向きを変えます。
説明
right(X)
の代わりに、現在の向きを取得し、それにX
を加えてsetheading()
で設定することができます。turtle.setheading(angle)
: タートルの向きをangle
で指定された絶対角度に設定します。0
度: 東(右)90
度: 北(上)180
度: 西(左)270
度: 南(下)
コード例
import turtle
screen = turtle.Screen()
screen.setup(width=400, height=400)
screen.title("turtle.setheading() で代替")
t = turtle.Turtle()
t.shape("turtle")
t.speed(1)
# 初期状態(0度、東向き)
t.forward(100)
# right(90) の代替
current_heading = t.heading() # 現在の向きを取得 (初期は0)
t.setheading(current_heading + 90) # 0 + 90 = 90度 (北向き)
t.forward(100)
# さらに right(90) の代替
current_heading = t.heading() # 現在の向きを取得 (今は90度)
t.setheading(current_heading + 90) # 90 + 90 = 180度 (西向き)
t.forward(100)
turtle.done()
利点
- 例えば、特定の角度(例:常に90度)を向かせたい場合などに
setheading(90)
と書く方が、right()
やleft()
で相対的に調整するよりも分かりやすいことがあります。 - 絶対的な向きで制御したい場合に非常に便利です。特定の方向へ向かわせたい場合に、現在の向きを気にせずに直接指定できます。
これは直接的な「向きの変更」の代替ではありませんが、描画される結果としての「線の方向」を制御する点で関連性があります。goto()
はカメを特定の座標に直接移動させます。これにより、カメの向きが変わるわけではありませんが、線の方向は変わります。
説明
turtle.goto(x, y)
: カメを画面上の指定された(x, y)
座標に移動させます。ペンが下がっていれば線が描かれます。移動後にカメの向きは、移動前の位置から新しい位置への方向を向きます。
コード例
import turtle
screen = turtle.Screen()
screen.setup(width=400, height=400)
screen.title("turtle.goto() を使った描画")
t = turtle.Turtle()
t.shape("turtle")
t.speed(1)
t.penup() # ペンを上げる (移動中に線を描かない)
# 開始位置へ移動
t.goto(-100, 0)
t.pendown() # ペンを下げる (ここから線を描く)
# 最初の線
t.goto(100, 0) # 東へ移動
# right(90) の結果(南へ線を引く)を goto で再現
t.goto(100, -100) # 南へ移動 (X座標は維持し、Y座標を減らす)
# さらに right(90) の結果(西へ線を引く)を goto で再現
t.goto(0, -100) # 西へ移動 (Y座標は維持し、X座標を減らす)
t.penup()
t.goto(0, 0) # 終了位置へ移動
turtle.done()
- カメの向きを細かく制御する必要がなく、終点座標さえ分かれば良い場合に効率的です。
- 特定の座標を正確に指定して図形を描きたい場合に便利です。
turtle.goto()
: 直接座標を指定してカメを移動させます。これは向きの変更とは少し異なりますが、結果的に描画される線の方向を制御できます。turtle.setheading()
: カメの絶対的な向きを設定します。現在の向きに関わらず、指定した角度へ即座に向きを変えさせたい場合に非常に有効です。turtle.left()
:right()
と逆の方向(反時計回り)に回転させます。負の角度を使えばright()
と同じ効果を出せます。