Как заставить черепаху отскакивать от стен

Я делаю программу для кого-то, чтобы они могли тренировать свои глаза, и я использую черепаху, чтобы она двигалась беспорядочно. Я хочу, чтобы черепаха отскакивала от стен, чтобы она не исчезла по сторонам, чтобы ее больше никогда не видели! Я посмотрел: TurtleGraphics Python: Отскакивает черепаха от стен? и использовал некоторый код от jnylen, так что ему следует отдать должное! В любом случае, вот мой старый и ужасный код (он сохранен для справки):

from random import *
from turtle import *
penup() # Get rid of those lines it leaves behind!
def main():
    while True: # I want this to be infinite
        a = randint(1,600)
        print a
        b = randint(1,359)
        print b
        c = randint(1,600)
        print c
        d = randint(1,359)
        print d #Checking my randoms
        forward(a)
        edge() # Keep calling edge, so it will bounce on the edge.
        left(b)
        edge() # Keep calling edge, so it will bounce on the edge.
        forward(c)
        edge() # Keep calling edge, so it will bounce on the edge.
        right(d)
        edge() # Keep calling edge, so it will bounce on the edge.

def edge():
    x, y = position()
    top = window_height()/2
    bottom = -top
    right = window_width()/2
    left = -right
    if (x <= left and 90 <= heading() <= 270) or (right <= x and not 90 <= heading() <= 270):
        f = 178 * h
        left(f)
        main()
    elif (y <= bottom and heading() >= 180) or (top <= y and heading <= 180):
        f = -2 * heading()
        left(f)
        main()
    else:
        main()
main()

Однако когда я запускаю его, я получаю результат:

189
199
553
152
26
175
597
263
119
201
582
329
231
267
344
28

Traceback (most recent call last):
  File "C:/Users/George/Desktop/Eyes.py", line 39, in <module>
    main()
  File "C:/Users/George/Desktop/Eyes.py", line 15, in main
    edge()
  File "C:/Users/George/Desktop/Eyes.py", line 38, in edge
    main()
  File "C:/Users/George/Desktop/Eyes.py", line 15, in main
    edge()
  File "C:/Users/George/Desktop/Eyes.py", line 38, in edge
    main()
  File "C:/Users/George/Desktop/Eyes.py", line 15, in main
    edge()
  File "C:/Users/George/Desktop/Eyes.py", line 38, in edge
    main()
  File "C:/Users/George/Desktop/Eyes.py", line 15, in main
    edge()
  File "C:/Users/George/Desktop/Eyes.py", line 31, in edge
    left(f)
TypeError: 'int' object is not callable

Пожалуйста, кто-нибудь может помочь мне это исправить. Я пробовал установить f на float, string и int, но ничего не работает! Вероятно, это что-то действительно очевидное, так что, если это так, извините.

Вот мой новый и, надеюсь, правильный код:

from random import *
from turtle import *
penup() # Get rid of those lines it leaves behind!
def main():
    while True: # I want this to be infinite
        a = randint(1,600)
        print a
        b = randint(1,359)
        print b
        c = randint(1,600)
        print c
        d = randint(1,359)
        print d #Checking my randoms
        forward(a)

        x, y = position()
        top = window_height()/2
        bottom = -top
        right = window_width()/2
        l = -right

        if (x <= l and 90 <= heading() <= 270) or (right <= x and not 90 <= heading() <= 270):
            f = 178 * heading()
            left(f)
            print "1"
        elif (y <= bottom and heading() >= 180) or (top <= y and heading <= 180):
            f = -2 * heading()
            left(f)
            print "2"
        else:
            print "3"

        left(b)

        x, y = position()
        top = window_height()/2
        bottom = -top
        right = window_width()/2
        l = -right
        if (x <= l and 90 <= heading() <= 270) or (right <= x and not 90 <= heading() <= 270):
            f = 178 * heading()
            left(f)
            print "1"
        elif (y <= bottom and heading() >= 180) or (top <= y and heading <= 180):
            f = -2 * heading()
            left(f)
            print "2"
        else:
            print "3"

        forward(c)

        x, y = position()
        top = window_height()/2
        bottom = -top
        right = window_width()/2
        l = -right
        if (x <= l and 90 <= heading() <= 270) or (right <= x and not 90 <= heading() <= 270):
            f = 178 * heading()
            left(f)
            print "1"
        elif (y <= bottom and heading() >= 180) or (top <= y and heading <= 180):
            f = -2 * heading()
            left(f)
            print "2"
        else:
            print "3"


        right(d)

        x, y = position()
        top = window_height()/2
        bottom = -top
        right = window_width()/2
        l = -right
        if (x <= l and 90 <= heading() <= 270) or (right <= x and not 90 <= heading() <= 270):
            f = 178 * heading()
            left(f)
            print "1"
        elif (y <= bottom and heading() >= 180) or (top <= y and heading <= 180):
            f = -2 * heading()
            left(f)
            print "2"
        else:
            print "3"


main()

person George    schedule 20.10.2013    source источник
comment
Помимо ответа @ lejlot, ваша программа неизбежно выйдет из строя, поскольку она содержит в себе бесконечную рекурсию (вы вызываете main, который вызывает edge, который снова вызывает main и т. Д.).   -  person BartoszKP    schedule 21.10.2013
comment
Я знаю, я собираюсь доработать код, чтобы он не вызывал так много функций, когда я действительно заканчиваю проект.   -  person George    schedule 21.10.2013
comment
Если вы не используете from <module> import *, причина ваших проблем, вероятно, была бы более очевидной.   -  person Nick T    schedule 24.10.2013


Ответы (1)


Вы перезаписали команду left на значение int здесь:

left = -right

поэтому, когда вы пытаетесь повернуть черепаху

left(f)

вы пытаетесь вызвать объект int, просто переименуйте свою локальную переменную left

person lejlot    schedule 20.10.2013
comment
Спасибо за ответ, программа теперь работает, но черепаха не подпрыгивает, она просто продолжается вечно! - person George; 21.10.2013
comment
BartoszKP указал на важную логическую ошибку, которую необходимо решить, чтобы эта работа работала - ваша многоуровневая рекурсия - это не только эффективность, это просто неправильный код. Мой ответ касается только синтаксической проблемы, а не концептуальной ошибки. - person lejlot; 21.10.2013
comment
Ой! Я только что понял, насколько я был глуп! Этот код никогда не будет работать, так как он выполняет только forward(a), а затем вызывает edge(), который вызывает main, который запускает forward(a), а затем снова вызывает edge()! О чем я только думал?! - person George; 23.10.2013
comment
Точно, после исправления этого и ошибки, описанной в моем ответе, все должно вернуться в нормальное состояние (после удаления этих повторений, которые действительно неверны, а не просто неэффективны) - person lejlot; 23.10.2013
comment
Сейчас я доработал свой код. Я редактировал это в вопросе. - person George; 24.10.2013