turtle.rt()だけじゃない!Pythonタートルの多様な回転・移動テクニック

2025-06-06

turtle.rt() とは

  • 引数 (angle):
    • 数値(整数または浮動小数点数)を指定します。
    • 単位はデフォルトでは度(degree)です。
    • 角度が正の数の場合、タートルは右に回転します。
    • 角度が負の数の場合、タートルは左に回転します(turtle.left() と同じ効果になります)。
  • 別名: turtle.right() と同じ機能を持つ、より短い書き方です。
  • 機能: turtle.rt(angle) は、引数 angle で指定された角度だけ、タートルを現在向いている方向から右(時計回り)に回転させます。
import turtle

# 画面とタートルをセットアップ
screen = turtle.Screen()
my_turtle = turtle.Turtle()

# タートルを前方に100ピクセル進める
my_turtle.forward(100)

# タートルを右に90度回転させる
my_turtle.rt(90) # my_turtle.right(90) と同じ意味

# 再び前方に100ピクセル進める
my_turtle.forward(100)

# 画面を閉じないようにする
screen.mainloop()

このコードを実行すると、タートルはまず右にまっすぐ進み、その後90度右に回転して下に進み、L字型の線が描画されます。



turtle モジュールは比較的シンプルですが、初心者の方がつまづきやすいポイントがいくつかあります。特に turtle.rt() (または turtle.right()) に関連するエラーは、主に以下のパターンに分類されます。

AttributeError: 'module' object has no attribute 'rt' または AttributeError: 'Screen' object has no attribute 'rt'

  • トラブルシューティング: turtle.rt() を呼び出す前に、必ず turtle.Turtle() でタートルオブジェクトを生成し、その変数名(上記の例では my_turtle)を使って呼び出しているか確認してください。
  • 正しい使い方: Turtle オブジェクトを作成し、そのオブジェクトに対して rt() を呼び出します。
    import turtle
    
    my_turtle = turtle.Turtle() # Turtleオブジェクトを作成
    my_turtle.rt(90) # 正しい呼び出し方
    
  • 誤ったコード例:
    import turtle
    
    # 間違い1: モジュールで直接呼び出す
    turtle.rt(90) # エラー!
    
    screen = turtle.Screen()
    # 間違い2: Screenオブジェクトで呼び出す
    screen.rt(90) # エラー!
    
  • 原因: turtle.rt() を呼び出すオブジェクトが間違っている場合に発生します。rt()Turtle オブジェクトのメソッドであり、turtle モジュール自体や Screen オブジェクトのメソッドではありません。
    • 例1: turtle.rt(90) のように、モジュール名で直接呼び出そうとしている。
    • 例2: screen.rt(90) のように、画面オブジェクトで呼び出そうとしている。

TypeError: rt() missing 1 required positional argument: 'angle'

  • トラブルシューティング: rt() の括弧 () の中に、回転させたい角度を数値(例: 9045.5)で入れているか確認してください。
  • 正しい使い方: 角度を数値で指定します。
    import turtle
    
    my_turtle = turtle.Turtle()
    my_turtle.rt(90) # 90度回転
    
  • 誤ったコード例:
    import turtle
    
    my_turtle = turtle.Turtle()
    my_turtle.rt() # 角度が指定されていない!
    
  • 原因: turtle.rt() 関数は、回転させる角度を引数として必要とします。この引数が渡されていない場合に発生します。

TypeError: 'str' object cannot be interpreted as an integer または TypeError: an integer is required (got type str)

  • トラブルシューティング: rt() の引数がクォーテーションで囲まれていないか ("90" ではなく 90)、また、計算結果が数値になっているか確認してください。
  • 正しい使い方: 数値(整数または浮動小数点数)を渡します。
    import turtle
    
    my_turtle = turtle.Turtle()
    my_turtle.rt(90) # 整数
    my_turtle.rt(45.5) # 浮動小数点数
    
  • 誤ったコード例:
    import turtle
    
    my_turtle = turtle.Turtle()
    my_turtle.rt("90") # 文字列として渡している!
    
  • 原因: turtle.rt() の引数に、数値ではない文字列などを渡している場合に発生します。角度は数値である必要があります。

NameError: name 'turtle' is not defined または NameError: name 'my_turtle' is not defined

  • トラブルシューティング: コードの冒頭に import turtle があるか、そして turtle.Turtle() を使ってタートルオブジェクトを変数に代入しているか確認してください。
  • 正しい使い方:
    import turtle # まずモジュールをインポート
    
    my_turtle = turtle.Turtle() # 次にタートルオブジェクトを定義
    my_turtle.rt(90)
    
  • 誤ったコード例:
    # import turtle を忘れている
    # my_turtle = turtle.Turtle() を忘れている
    
    my_turtle.rt(90) # my_turtleが定義されていないためエラー
    
  • 原因: turtle モジュールや作成したタートルオブジェクトが正しくインポートまたは定義されていない状態で、それらを使おうとしている場合に発生します。

プログラムが実行されても何も表示されない、またはすぐにウィンドウが閉じてしまう

  • トラブルシューティング:
    • プログラムの最後に turtle.done() または screen.mainloop() を追加してください。これにより、ユーザーがウィンドウを閉じるまでプログラムが待機します。
    • :
      import turtle
      
      screen = turtle.Screen()
      my_turtle = turtle.Turtle()
      
      my_turtle.forward(50)
      my_turtle.rt(90)
      my_turtle.forward(50)
      
      screen.mainloop() # または turtle.done()
      
    • screen = turtle.Screen() を使って画面オブジェクトを取得し、screen.mainloop() を使うのが一般的です。turtle.done()turtle モジュールレベルで便利な関数です。
  • 原因: turtle グラフィックスのウィンドウが表示されず、またはすぐに閉じてしまうのは、プログラムの終了処理が適切に行われていないためです。タートルの描画が完了しても、ウィンドウが開いたままになるようにする必要があります。

論理的なエラー: タートルが意図した方向に回転しない

  • 原因: プログラムがエラーを出さずに実行されるものの、タートルが期待通りに回転しない場合、それは論理的なエラーです。rt() の引数に渡す角度が間違っているか、他の回転や移動のコマンドとの組み合わせに問題がある可能性があります。
    • 例: 90度回転させたいのに、誤って my_turtle.rt(180) と書いてしまっている。
    • 例: rt() の前に left()setheading() など、タートルの向きを変更する他の関数が実行されている。


turtle.rt()turtle.right() の短縮形であり、タートル(カメのアイコン)を右に回転させるために使われます。

例1: 四角形を描く (基本的な使い方)

最も基本的な例として、四角形を描いてみましょう。タートルを動かして、90度右に回転させる操作を繰り返します。

import turtle

# 1. 画面 (Screen) とタートル (Turtle) の設定
screen = turtle.Screen() # 描画するウィンドウを取得
screen.setup(width=600, height=400) # ウィンドウサイズを設定
screen.bgcolor("lightblue") # 背景色を設定
screen.title("基本的な四角形") # ウィンドウのタイトルを設定

my_turtle = turtle.Turtle() # タートルオブジェクトを作成
my_turtle.shape("turtle") # タートルの形をカメにする
my_turtle.color("red") # タートルの色を赤にする
my_turtle.pensize(3) # ペンの太さを3にする

# 2. 四角形を描く
# タートルを前方に100ピクセル進める
my_turtle.forward(100)
# タートルを右に90度回転させる
my_turtle.rt(90)

my_turtle.forward(100)
my_turtle.rt(90)

my_turtle.forward(100)
my_turtle.rt(90)

my_turtle.forward(100)
my_turtle.rt(90) # 描画終了後、元の向きに戻る

# 3. 描画が終わるまでウィンドウを閉めないようにする
screen.mainloop()
# または turtle.done() でも可 (ただしscreenオブジェクトが不要な場合)

解説:

  • これを4回繰り返すことで、一辺が100ピクセルの正方形が描かれます。
  • my_turtle.rt(90) でタートルを90度右に回転させます。
  • my_turtle.forward(100) で100ピクセル前進します。

例2: forループを使って多角形を描く (繰り返し処理の活用)

四角形を繰り返し処理で描くように、for ループを使って多角形(例:正三角形、正五角形など)を描くことができます。

import turtle

screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.bgcolor("lightgreen")
screen.title("forループで多角形")

my_turtle = turtle.Turtle()
my_turtle.shape("turtle")
my_turtle.color("blue")
my_turtle.pensize(3)
my_turtle.speed(1) # 描画速度 (1: slowest, 10: fast, 0: fastest)

num_sides = 6 # 描く多角形の辺の数 (例: 3で三角形、5で五角形、6で六角形)
side_length = 80 # 各辺の長さ

# 多角形を描くための角度を計算 (外角)
# 正N角形の内角の和は (N-2) * 180 度
# 内角は (N-2) * 180 / N 度
# 外角は 360 / N 度 (タートルが曲がる角度は外角)
turn_angle = 360 / num_sides

# forループで辺の数だけ繰り返す
for _ in range(num_sides):
    my_turtle.forward(side_length)
    my_turtle.rt(turn_angle)

screen.mainloop()

解説:

  • for _ in range(num_sides): ループを使って、指定された辺の数だけ「進む」と「右に曲がる」を繰り返します。
  • turn_angle = 360 / num_sides で、各辺を描いた後にタートルが回転すべき角度(外角)を計算します。例えば、正三角形なら 360 / 3 = 120 度、正六角形なら 360 / 6 = 60 度回転します。
  • num_sides で辺の数を指定します。

例3: 星形を描く (少し複雑な回転)

rt() を使って星形のような複雑な図形も描くことができます。星形の場合、回転角度は360度を頂点の数で割るだけでは描けません。

import turtle

screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.bgcolor("darkblue")
screen.title("星形")

star_turtle = turtle.Turtle()
star_turtle.shape("classic") # クラシックな矢印形
star_turtle.color("yellow")
star_turtle.pensize(2)
star_turtle.speed(0) # 最速で描画

num_points = 5 # 星の尖った部分の数 (例: 5点星)
side_length = 150 # 各辺の長さ

# 星を描くための回転角度
# 5点星の場合、144度回転 (360 / 5 * 2 = 144)
turn_angle = 360 / num_points * 2 
# または 180 - (180 / num_points) でも描けるが、rtを使うなら外角の考え方
# 外角の考え方だと、180 - (内角)
# 5点星の各尖った角の内角は 36度。180-36 = 144度。
# または、内角の和は (N-2)*180 でN=5の場合、540度。各内角は108度。
# 直線を描いてから曲がる角度は、外角。
# 星の場合、内側の五角形を形成しないように直線を描いてから外側へ曲がる。
# 360度を5つの頂点で分けるのではなく、2周して5つの頂点を通るイメージで 360 * 2 / 5 = 144 度。

for _ in range(num_points):
    star_turtle.forward(side_length)
    star_turtle.rt(turn_angle)

screen.mainloop()

解説:

  • 5点星の場合、各辺を描いた後に 144 度右に回転させることで、星の形が完成します。この 144 度という角度は、幾何学的な考察が必要です。シンプルに考えると、タートルが描く線の方向が、2つの頂点を結ぶ線になっているためです。
  • 星形を描くには、一般的な多角形とは異なる回転角度が必要です。

例4: ユーザー入力を受け付けて多角形を描く

input() 関数を使って、ユーザーに辺の数を入力してもらい、それに応じて多角形を描画する例です。

import turtle

screen = turtle.Screen()
screen.setup(width=700, height=500)
screen.bgcolor("whitesmoke")
screen.title("カスタム多角形")

my_turtle = turtle.Turtle()
my_turtle.shape("arrow")
my_turtle.color("purple")
my_turtle.pensize(2)
my_turtle.speed(0)

# ユーザーから辺の数を入力してもらう
while True:
    try:
        num_sides_str = screen.textinput("多角形の描画", "何角形を描きますか? (3以上の整数を入力):")
        if num_sides_str is None: # キャンセルされた場合
            print("入力がキャンセルされました。プログラムを終了します。")
            break
        num_sides = int(num_sides_str)
        if num_sides < 3:
            print("3以上の整数を入力してください。")
        else:
            break
    except ValueError:
        print("無効な入力です。整数を入力してください。")

if num_sides is not None and num_sides >= 3:
    side_length = 80 # 各辺の長さ
    turn_angle = 360 / num_sides # 回転角度 (外角)
    
    # 描画位置を少し調整して中央に描かれるようにする(オプション)
    my_turtle.penup()
    my_turtle.goto(-side_length / 2, side_length / 2)
    my_turtle.pendown()

    for _ in range(num_sides):
        my_turtle.forward(side_length)
        my_turtle.rt(turn_angle)

screen.mainloop()

解説:

  • my_turtle.penup(), my_turtle.goto(), my_turtle.pendown() は、ペンを上げて(線を引かずに)位置を移動し、描画開始位置を調整するためのものです。
  • 入力された辺の数に基づいて、回転角度を計算し、多角形を描画します。
  • 入力が有効な数値(3以上の整数)であることを try-except ブロックと while ループで検証します。
  • screen.textinput() を使って、ポップアップウィンドウでユーザーからの入力を受け取ります。


turtle.rt() はタートルを現在の向きから相対的に右に回転させる便利な関数ですが、他にもタートルの向きを制御する方法がいくつかあります。

turtle.left(angle) または turtle.lt(angle)

  • :
    import turtle
    
    screen = turtle.Screen()
    my_turtle = turtle.Turtle()
    
    my_turtle.forward(100)
    my_turtle.left(90) # 左に90度回転
    my_turtle.forward(100)
    my_turtle.lt(90) # 短縮形でも同じ
    my_turtle.forward(100)
    
    screen.mainloop()
    
  • rt() との関係:
    • my_turtle.rt(90)my_turtle.left(-90) と同じ効果を持ちます。
    • my_turtle.left(90)my_turtle.rt(-90) と同じ効果を持ちます。
  • 使い方: rt(angle) と同様に、引数 angle で回転させる角度を指定します。
  • 機能: rt() が右(時計回り)に回転させるのに対し、left() または lt() はタートルを現在の向きから**左(反時計回り)**に回転させます。

turtle.setheading(angle) または turtle.seth(angle)

  • 用途: 特定の方向を確実に指したい場合や、複雑な動きを相対的な回転で計算するのが難しい場合に非常に便利です。
  • :
    import turtle
    
    screen = turtle.Screen()
    my_turtle = turtle.Turtle()
    
    my_turtle.forward(50) # 右に50進む (デフォルトは右向き)
    
    my_turtle.setheading(90) # 上を向く
    my_turtle.forward(50) # 上に50進む
    
    my_turtle.seth(180) # 左を向く (sethはsetheadingの短縮形)
    my_turtle.forward(50) # 左に50進む
    
    my_turtle.setheading(270) # 下を向く
    my_turtle.forward(50) # 下に50進む
    
    screen.mainloop()
    
  • rt() との違い: rt() は「今いる場所からX度右に曲がる」ですが、setheading() は「絶対的にY度の方角を向く」という命令です。
  • 使い方: 引数 angle に、タートルが向くべき絶対的な角度を指定します。
  • 機能: rt()left() が相対的な回転であるのに対し、setheading() または seth() はタートルの向きを絶対的な角度に設定します。
    • デフォルトでは、0度は右(東)、90度は上(北)、180度は左(西)、270度は下(南)を向きます。

turtle.goto(x, y)

  • 用途: 特定の座標に移動したい場合、または座標を基準にして図形を描きたい場合に有効です。
  • :
    import turtle
    
    screen = turtle.Screen()
    screen.setup(width=400, height=400)
    screen.setworldcoordinates(-200, -200, 200, 200) # 座標系の設定
    
    my_turtle = turtle.Turtle()
    my_turtle.speed(1)
    my_turtle.pensize(3)
    
    my_turtle.penup() # ペンを上げる(線を描かずに移動)
    my_turtle.goto(0, 50) # (0,50)に移動
    my_turtle.pendown() # ペンを下げる
    
    my_turtle.goto(50, -50) # (50,-50)へ移動(向きが変わる)
    my_turtle.goto(-50, -50) # (-50,-50)へ移動(向きが変わる)
    my_turtle.goto(0, 50) # (0,50)へ戻る(向きが変わる)
    
    screen.mainloop()
    
  • rt() との違い: rt() はその場での回転ですが、goto() は位置と向きの両方を一度に変更します。goto() は、移動前のタートルから移動先のタートルへの直線を引くように、自動的に向きを調整します。
  • 使い方: 引数 xy に、移動先の座標を指定します。
  • 機能: goto() は、タートルを現在の位置から指定された (x, y) 座標へ直接移動させます。移動中にペンが下がっていれば線が引かれます。この関数は直接的に向きを変更するわけではありませんが、移動の際に自動的に向きが変わるため、結果的に向きの制御とみなせます。

turtle.towards(x, y)

  • 用途: ある点から別の点へ正確に向かわせたい場合に非常に便利です。
  • :
    import turtle
    
    screen = turtle.Screen()
    my_turtle = turtle.Turtle()
    my_turtle.pensize(2)
    
    # ターゲットポイント
    target_x = 100
    target_y = 50
    
    # ターゲットを指す角度を計算し、その角度にタートルを向ける
    angle_to_target = my_turtle.towards(target_x, target_y)
    my_turtle.setheading(angle_to_target)
    
    # ターゲットに向かって進む
    my_turtle.forward(100)
    
    # ターゲットに到達したことを示す点(オプション)
    my_turtle.penup()
    my_turtle.goto(target_x, target_y)
    my_turtle.dot(10, "green") # 緑色の点を描く
    my_turtle.pendown()
    
    screen.mainloop()
    
  • 使い方: my_turtle.setheading(my_turtle.towards(x, y)) のように使用します。
  • 機能: towards() は、タートルが現在位置から指定された (x, y) 座標へ向かうために必要な絶対的な角度を返します。この関数自体はタートルの向きを変更しませんが、setheading() と組み合わせて使うことで、特定の点へ向かってタートルを回転させることができます。

これらの代替メソッドは、それぞれ異なるシナリオで役立ちます。

  • 特定の点への向きの計算: towards() は、setheading() と組み合わせて、特定のターゲットへタートルを向かせたい場合に役立ちます。
  • 位置と向きの変更: goto() は、特定の座標へ移動しつつ、その過程で自然に向きを変えたい場合に便利です。
  • 絶対的な回転: setheading() (seth()) は、特定の方向(例:真上、真下)を向かせたい場合に確実です。
  • 相対的な回転: rt() (right()) や left() (lt()) は、現在の向きからの微調整や、多角形のような繰り返しのパターンを描くのに適しています。