Проблемы с циклом while при использовании черепахи - PullRequest
0 голосов
/ 04 ноября 2019

Черепаха должна нарисовать два перекрывающихся прямоугольника. Затем выйдите за границы обоих прямоугольников. Черепаха должна начать рисовать / двигаться в случайных направлениях, пока она не окажется на границе или внутри прямоугольника один, но НЕ прямоугольника два. Следует также посчитать и распечатать количество шагов, предпринятых до его достижения.

Я не могу заставить работать оператор while. Проблема заключается в функции ranWalkRects (t, x0, y0, x1, y1, w1, h1, x2, y2, w2, h2, dz)

def ranWalkRects(t,x0,y0,x1,y1,w1,h1,x2,y2,w2,h2,dz):
    """has turtle t start at x0,y0 outside of both rectangles.
    Execute a random walk until it is inside or on the boundary of rectangle 1 but not
    inside or on the boundary of rectangle 2. Assume that rectangle 1 overlaps rectangle
    2 but that rectangle 1 does not lie entirely inside rectangle 2. Print out how many
    times the turtle moves from its starting position to the final position. Dz is
    the step size for the random walk. """

    rec1 = isInRect(t,x1,y1,w1,h1)
    rec2 = isInRect(t,x2,y2,w2,h2)
    t.pu()
    t.goto(x0,y0)
    t.pd()
    num_steps = 0
    while (rec1 and rec2) and (not rec1 and not rec2) and not (rec1 and not rec2):
        ngl = random.randint(0,359)
        t.lt(ngl)
        t.fd(dz)
        num_steps+=1
        x0,y0 = t.pos()
    print("Turtle takes ", num_steps,"steps before entering the rectangle")

ranWalkRects(tess,100,100,50,50,100,75,30,30,100,75,20)

После выхода не будет предпринято никаких шаговграницы двух прямоугольников, и я не уверен, почему.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Я представляю себе более простой подход, чем вы используете:

def ranWalkRects(t, x0, y0, x1, y1, w1, h1, x2, y2, w2, h2, dz):
    t.pu()
    t.goto(x0, y0)
    t.pd()
    num_steps = 0

    in_rec1 = isInRect(t, x1, y1, w1, h1)
    in_rec2 = isInRect(t, x2, y2, w2, h2)

    while not in_rec1 or in_rec2:
        angle = random.randrange(360)
        t.lt(angle)
        t.fd(dz)
        num_steps += 1

        in_rec1 = isInRect(t, x1, y1, w1, h1)
        in_rec2 = isInRect(t, x2, y2, w2, h2)

    print("Turtle takes", num_steps, "steps before entering the rectangle.")

Но я считаю, что isInRect() также подозрительно, поскольку первое, что он делает, это перемещает черепаху без сохранения своей текущей позиции! Как вы можете определить, находится ли черепаха в прямоугольнике, когда переместите ее в другое место? Это, вероятно, должно быть математическим определением и не требовать фактического перемещения черепахи.

0 голосов
/ 04 ноября 2019

Я не совсем понимаю вашу логику для случаев прямоугольника, но, учитывая, что rec1 и rec2 имеют значение True False для условий в прямоугольнике 1 и 2. ваше объяснение будет:

, а (не rec2) -уже достаточно, так как он должен работать в любом случае, кроме случаев, когда rec2 - True. Посмотрите на возможные логические наборы (rec1, rec2)

(0,0), (0,1), (1,0), (1,1) -> (запустить), (не запускать), (запустить), (не запускать), поэтому мы хотим (0,0) или (1,0) -> (X, 0) -> не rec2

И вы хотите, чтобы он работал во всех случаях, кромегде это находится в rec2. Упрощение логики оставляет (не rec2). Посмотрите на булевы уравнения. * этот тип означает, что rec1 не нужен

Также обратите внимание, что ваши функции, которые обновляют rec1 и rec2, не находятся в цикле while. Вы, вероятно, хотите, чтобы они тоже были внутри, иначе они никогда не будут обновляться во время цикла while, поэтому, если вы введете его, вы никогда не узнаете, где вы находитесь. Кроме того, выполните отладку, напечатав значения x0, y0 в цикле и дважды проверьте свою логику. Вот измененная функция для вас, чтобы попробовать.

def ranWalkRects(t,x0,y0,x1,y1,w1,h1,x2,y2,w2,h2,dz):
    """has turtle t start at x0,y0 outside of both rectangles.
    Execute a random walk until it is inside or on the boundary of rectangle 1 but not
    inside or on the boundary of rectangle 2. Assume that rectangle 1 overlaps rectangle
    2 but that rectangle 1 does not lie entirely inside rectangle 2. Print out how many
    times the turtle moves from its starting position to the final position. Dz is
    the step size for the random walk. """

    rec1 = isInRect(t,x1,y1,w1,h1)
    rec2 = isInRect(t,x2,y2,w2,h2)
    t.pu()
    t.goto(x0,y0)
    t.pd()
    num_steps = 0
    while not rec2:
        ngl = random.randint(0,359)
        t.lt(ngl)
        t.fd(dz)
        num_steps+=1
        x0,y0 = t.pos()
        print(x0,y0) # print for debug. 
        rec1 = isInRect(t,x1,y1,w1,h1) #this updates your conditions
        rec2 = isInRect(t,x2,y2,w2,h2)
    print("Turtle takes ", num_steps,"steps before entering the rectangle")

ranWalkRects(tess,100,100,50,50,100,75,30,30,100,75,20)

Конечно, это предполагает, что ваша логика верна, и тесты работают правильно. Я рекомендую вам отладить и попытаться подставить фиктивные значения для x0 и y0, чтобы убедиться, что ваша логика и тесты работают.

Также убедитесь, что вы инициализировали прямоугольники хотя бы графически. Вы никогда не вызывали прямоугольник в загруженном скрипте.

...