Python TurtleでY座標をマスター!ycor()徹底解説

2025-06-06

簡単に言うと:



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

エラーの原因
turtleモジュールをインポートし忘れているか、タートルオブジェクトを適切に作成していない場合に発生します。ycor()は、特定のタートルインスタンス(例: t.ycor()のように)に対して呼び出す必要があります。

トラブルシューティング

  • タートルオブジェクトを作成していますか? t = turtle.Turtle()のように、turtle.Turtle()を呼び出してタートルオブジェクトを作成し、変数に代入していることを確認してください。
  • import turtle を忘れていませんか? プログラムの先頭でimport turtleと記述していることを確認してください。


# 悪い例 (NameErrorが発生する可能性)
# print(turtle.ycor()) 
# print(t.ycor()) # tが定義されていない

# 良い例
import turtle
t = turtle.Turtle()
print(t.ycor())

AttributeError: 'module' object has no attribute 'ycor'

エラーの原因
turtleモジュール自体に対してycor()を呼び出そうとした場合に発生します。ycor()は、turtle.Turtle()で作成されたタートルオブジェクトのメソッドであり、モジュール全体のメソッドではありません。

トラブルシューティング

  • turtle.ycor()ではなく、タートルインスタンス(例: my_turtle.ycor())に対して呼び出していることを確認してください。


import turtle

# 悪い例 (AttributeErrorが発生する)
# print(turtle.ycor()) 

# 良い例
my_turtle = turtle.Turtle()
print(my_turtle.ycor())

タートルが画面に表示されない、または動かない

エラーの原因
これはycor()のエラーというよりも、turtleプログラム全般でよくある問題です。ycor()はタートルの位置を返すだけで、タートルを動かしたり表示したりする機能はありません。タートルが動かないと感じる場合、プログラムの実行フローや、画面の保持方法に問題がある可能性があります。

トラブルシューティング

  • turtle.speed()を0に設定していませんか? speed(0)は最速ですが、アニメーションが無効になるため、タートルが動いているように見えないことがあります。アニメーションを見たい場合は、speed(1)からspeed(10)までの値を使用してください。
  • タートルを動かすコマンド(forward(), backward(), goto(), sety()など)を正しく使っていますか? ycor()を呼び出す前に、タートルが実際に動いているか確認してください。
  • 画面を閉じていませんか? プログラムの最後にturtle.done()turtle.exitonclick()を呼び出していますか?これらがないと、プログラムがすぐに終了し、タートルグラフィックスウィンドウが一瞬で閉じてしまうことがあります。


import turtle

t = turtle.Turtle()
t.forward(100) # タートルを動かす

current_y = t.ycor()
print(f"現在のY座標: {current_y}")

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

ycor()の値が期待と異なる

エラーの原因
タートルの初期位置や、実行した移動コマンドを誤解している可能性があります。turtleの座標系は通常、画面中央が(0,0)で、上にYが正、下にYが負です。

トラブルシューティング

  • デバッグのために値を頻繁に表示する
    プログラムの様々な段階でprint(t.ycor())を使ってY座標を記録し、タートルの動きを追跡することで、どこで期待と異なる値になっているかを特定できます。
  • 移動コマンドを再確認する
    forward(), backward(), left(), right(), goto(), setx(), sety()などの各コマンドが、タートルの位置にどのように影響するかを正確に理解していますか?特に、forward()backward()はタートルの現在の向きに基づいて移動します。
  • 初期位置を理解する
    デフォルトでは、タートルは画面中央の(0,0)から始まります。


import turtle

t = turtle.Turtle()
print(f"開始時のY座標: {t.ycor()}") # 0.0

t.left(90) # 上を向く
t.forward(50) # 上に50進む
print(f"50上に進んだ後のY座標: {t.ycor()}") # 50.0

t.right(180) # 下を向く
t.forward(20) # 下に20進む
print(f"20下に進んだ後のY座標: {t.ycor()}") # 30.0 (50 - 20)

turtle.done()

TypeError: ycor() takes 0 positional arguments but 1 was given

エラーの原因
ycor()関数に誤って引数を渡してしまった場合に発生します。ycor()は引数を必要としません。

トラブルシューティング

  • t.ycor()のように、括弧の中に何も引数を入れずに呼び出していることを確認してください。
import turtle

t = turtle.Turtle()

# 悪い例 (TypeErrorが発生する)
# print(t.ycor(10)) 

# 良い例
print(t.ycor())


turtle.ycor()は、タートルが現在どのくらいの高さ(Y座標)にいるかを知るための関数です。これを使って、タートルの位置に基づいて何かを判断したり、表示したりするプログラムが書けます。

タートルの現在のY座標を表示する

これは最も基本的な使用例です。タートルを動かした後に、その位置を確認します。

import turtle

# 画面とタートルをセットアップ
screen = turtle.Screen()
t = turtle.Turtle()
t.speed(1) # タートルがゆっくり動くように設定

print(f"初期のY座標: {t.ycor()}") # 実行すると 0.0 が表示されるはず

# タートルを上に移動
t.forward(50)
print(f"50進んだ後のY座標: {t.ycor()}") # 実行すると約 50.0 が表示されるはず

# タートルを左に90度回転し、さらに進む(X座標が変わるがY座標は変わらない)
t.left(90)
t.forward(30)
print(f"さらに進んだ後のY座標: {t.ycor()}") # 実行すると約 50.0 のまま表示されるはず

# タートルを下(現在の向きから)に移動
t.right(180) # 向きを反転
t.forward(20) # 20戻る
print(f"20戻った後のY座標: {t.ycor()}") # 実行すると約 30.0 (50 - 20) が表示されるはず

turtle.done() # 画面がすぐに閉じないようにする

Y座標に基づいて条件分岐を行う

タートルのY座標が特定のしきい値を超えたら色を変える、といった処理ができます。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.shape("turtle")
t.speed(3)

# タートルを上向きに設定
t.left(90)

# 少しずつ上に移動し、Y座標をチェック
for _ in range(10): # 10回繰り返す
    t.forward(20)
    current_y = t.ycor()
    print(f"現在のY座標: {current_y:.2f}") # 小数点以下2桁で表示

    # Y座標が100を超えたら色を変える
    if current_y > 100:
        t.pencolor("red") # ペンの色を赤に
        t.fillcolor("red") # タートルの塗りつぶし色を赤に
    elif current_y > 50:
        t.pencolor("blue") # ペンの色を青に
        t.fillcolor("blue") # タートルの塗りつぶし色を青に
    else:
        t.pencolor("black") # それ以外は黒に
        t.fillcolor("black") # タートルの塗りつぶし色を黒に

    t.stamp() # 現在の位置にタートルの形をスタンプする

turtle.done()

Y座標を基準にした描画ループの終了

タートルが特定のY座標に到達したら、描画を停止する例です。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.speed(5)
t.pensize(2)

# タートルを上向きに設定
t.left(90)

# Y座標が画面の上端に近づくまで描画を続ける
while t.ycor() < screen.window_height() / 2 - 20: # 画面の上端から少し手前で止まるように設定
    t.forward(10)
    t.right(20) # 少しずつ右に曲がりながら進む
    t.dot(5, "blue") # 点を描く

print(f"Y座標が上限に達しました: {t.ycor():.2f}")
t.hideturtle() # タートルを隠す

turtle.done()

ユーザーに目標Y座標を入力してもらい、タートルがそこまで移動するプログラムです。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.shape("turtle")
t.speed(2)

# ユーザーから目標Y座標を入力してもらう
try:
    target_y = float(screen.textinput("目標Y座標", "タートルを移動させる目標Y座標を入力してください (-200から200の範囲が推奨):"))
except (ValueError, TypeError):
    print("無効な入力です。デフォルト値として0に設定します。")
    target_y = 0.0

# タートルの初期位置
initial_y = t.ycor()
print(f"現在のY座標: {initial_y:.2f}")
print(f"目標Y座標: {target_y:.2f}")

# 目標Y座標まで移動
if target_y > initial_y:
    t.setheading(90) # 上を向く
    while t.ycor() < target_y:
        t.forward(5)
        if t.ycor() >= target_y: # 目標を超えないように微調整
            t.sety(target_y)
elif target_y < initial_y:
    t.setheading(270) # 下を向く
    while t.ycor() > target_y:
        t.forward(5)
        if t.ycor() <= target_y: # 目標を超えないように微調整
            t.sety(target_y)
else:
    print("タートルはすでに目標Y座標にいます。")

print(f"移動後のY座標: {t.ycor():.2f}")

turtle.done()


turtle.ycor() はタートルの現在のY座標を取得するための直接的で最も一般的な方法ですが、Y座標を操作したり、Y座標に関連する情報を取得したりする他の方法もあります。

turtle.pos() または turtle.position() を使う

turtle.pos()(または turtle.position())は、タートルの現在の(x, y)座標のペアをタプルとして返します。このタプルからY座標だけを取り出すことで、ycor()と同じ情報を得ることができます。

  • 欠点: Y座標だけが必要な場合でも、タプルから要素を取り出す追加の手順が必要です。
  • 利点: X座標とY座標の両方が一度に取得できるため、両方の情報が必要な場合に便利です。


import turtle

t = turtle.Turtle()
t.forward(50)
t.left(90)
t.forward(30)

# 1. ycor() を使う方法
y_coord_ycor = t.ycor()
print(f"ycor() を使ったY座標: {y_coord_ycor}")

# 2. pos() を使う方法
pos_tuple = t.pos()
y_coord_pos = pos_tuple[1] # タプル (x, y) の2番目の要素がY座標
print(f"pos() を使ったY座標: {y_coord_pos}")

turtle.done()

turtle.sety(y) を使う(Y座標の設定)

これはycor()の代替というよりは補完的な機能ですが、タートルのY座標を直接設定したい場合に非常に便利です。ycor()は現在の位置を「取得」しますが、sety()はY座標を「設定」します。

  • 関連: Y座標を設定した後、ycor()を使ってその設定が正しく反映されたかを確認できます。
  • 利点: タートルのY座標を特定の絶対値に直接変更できます。


import turtle

t = turtle.Turtle()
print(f"初期のY座標: {t.ycor()}") # 0.0

# Y座標を50に設定
t.sety(50)
print(f"sety(50) 後のY座標: {t.ycor()}") # 50.0

# Y座標を-100に設定
t.sety(-100)
print(f"sety(-100) 後のY座標: {t.ycor()}") # -100.0

turtle.done()

turtle.goto(x, y) を使う(X, Y座標の両方を設定)

sety()と同様に、goto()もY座標を設定するための方法ですが、X座標も同時に設定できます。これもycor()の代替というよりは、タートルの位置を操作する別の方法です。

  • 関連: goto()で移動した後、ycor()でその位置のY成分を確認できます。
  • 利点: タートルを特定の画面上の位置に正確に配置したい場合に便利です。


import turtle

t = turtle.Turtle()
print(f"初期のY座標: {t.ycor()}") # 0.0

# タートルを(100, 75)に移動
t.goto(100, 75)
print(f"goto(100, 75) 後のY座標: {t.ycor()}") # 75.0

# タートルを(-50, -25)に移動
t.goto(-50, -25)
print(f"goto(-50, -25) 後のY座標: {t.ycor()}") # -25.0

turtle.done()

タートルの移動コマンドを「手動で追跡」する(非推奨)

これは直接的な代替というよりは、プログラムがタートルのY座標を内部的に管理するアプローチです。タートルがforward(), backward(), setheading(), left(), right()などのコマンドで移動するたびに、Y座標の変化を自分で計算して変数に保持します。

  • 欠点: 非常に複雑でエラーを起こしやすく、turtleモジュールが提供する組み込みの正確な機能(ycor()など)を使用する方がはるかに信頼性が高いです。特殊な理由がない限り、この方法は推奨されません。
  • 利点: デバッグ目的や、タートルの内部的な座標計算の仕組みを理解するのに役立つかもしれません。

例(概念のみ、実用性は低い)

import turtle
import math

t = turtle.Turtle()
t.speed(1)

# Y座標を追跡する変数
my_current_y = 0.0

# タートルを上向きに設定
t.left(90)

# 手動で移動とY座標の更新
distance = 50
t.forward(distance)
# 現在の向き (0=東, 90=北, 180=西, 270=南) に基づいてY座標を計算
# Yの変化 = 距離 * sin(ラジアンに変換した角度)
# Pythonのturtle.heading()は度数で返します
heading_rad = math.radians(t.heading())
my_current_y += distance * math.sin(heading_rad)

print(f"手動で計算したY座標: {my_current_y:.2f}")
print(f"実際のY座標 (ycor()): {t.ycor():.2f}")

turtle.done()

上記の例では、turtle.heading()math.sin()を使って手動でY座標を計算していますが、これはいかに複雑で誤差が生じやすいかを示すためのものです。