Черепашка принимает решения

В прошлый раз мы рассмотрели, как научить Черепашку начинать движение после щелчка мыши.

from turtle import *

def click(x,y):
        move()
        
def move():
        fd(2)
        ontimer(move,30)
                
onscreenclick(click)    

done()

Теперь научим ее останавливаться.
Чтобы остановить движение Черепашки, нужно отменить вызов ontimer или обнулить скорость. Кроме того, нужно решить, когда останавливать Черепашку.
Черепашка ползет вправо, начиная из точки с координатами (0,0). Остановим ее, когда она уползет вправо на 100. Для этого будем определять координаты Черепашки и продолжать движение только в том случае, если x < 100:

from turtle import *

def click(x,y):
        move()
        
def move():
        fd(2)
        x = xcor()
        if x < 100:
                ontimer(move,30)
                
onscreenclick(click)    

done()

xcor() — возвращает значение координаты х (т.е. расстояние от центра по горизонтали)
if — это оператор, выполняющий действие только после успешной проверки.
Если x < 100, то вызов ontimer выполняется и move будет вызвана еще раз через 30 мс.
Если же x > 100, то ontimer не выполняется и move вызвана больше не будет: Черепашка остановится.

1. Будет ли Черепашка делать еще один шаг, если x = 100? Почему?
2. Если Черепашка начинает движение из точки 0 и делает по 2 шага (как в примере), то в какой точке она остановится?
3. Если Черепашка начинает движение из точки 0 и делает по 1 шагу (fd(1)), то в какой точке она остановится? Проверьте, дописав print(x)
4. Отправьте Черепашку влево и остановите ее после точки -100.
5. Отправьте Черепашку вверх. Остановите после точки 100.
6. Отправьте Черепашку вниз. Остановите после точки -100.

Теперь научим Черепашку останавливаться по щелчку.
Для начала сделаем так, чтобы Черепашка ползла сразу после запуска программы:

from turtle import *
        
def move():
        fd(2)
        ontimer(move,30)
                
move()
done()

Теперь добавим остановку по щелчку:

from turtle import *
        
def click(x,y):
        global m 
        m = False
        
def move():
        fd(2)
        if m:
                ontimer(move,30)
                
m = True
onscreenclick(click)    
move()

done()

Сначала выполняется строка m = True что означает, что движение разрешено.
Затем onscreenclick(click), что создает привязку команды(функции) click к щелчку на экране.
После чего выполняется move и Черепашка начинает движение.
Поскольку m равно True, то движение продолжается.
По щелчку выполняется click и значение переменной m меняется на False. Это приводит к тому, что очередного вызова ontimer не происходит и Черепашка останавливается.

7. Что произойдет, если удалить строку global m?
8. Что означает global (см. Справочник)
9. Что будет, если True и False поменять местами?
10. Добавьте print(x) в move и убедитесь, что вызова move больше не происходит (координаты перестают появляться на экране)

...
def move():
        x = xcor()
        print(x)
...

Давайте рассмотрим другой вариант с остановкой по щелчку:

from turtle import *
        
def click(x,y):
        global m
        m = False
        
def move():
        x = xcor()
        print(x)
        if m:
                fd(2)
        ontimer(move,30)
                
m = True
onscreenclick(click)    
move()

done()

Черепашка также ползет после запуска, так же останавливается после щелчка. Но move продолжает выполнятся, просто Черепашка не двигается.
Это дает нам некоторые интересные возможности.

from turtle import *
        
def click(x,y):
        global m
        m = not m
        
def move():
        x = xcor()
        print(x)
        if m:
                fd(2)
        ontimer(move,30)
                
m = True
onscreenclick(click)    
move()

done()

m = not m делает из False — True и наоборот.
Как обычно, print поможет понять, что происходит.
Измените программу, убрав print из move и добавив его в click таким образом:

from turtle import *
        
def click(x,y):
        global m
        print(m)
        m = not m
        print(m)
        print()
        
def move():
        x = xcor()
        if m:
                fd(2)
        ontimer(move,30)
                
m = True
onscreenclick(click)    
move()

done()
11. Черепашка ползет вверх сразу после запуска программы, останавливается по щелчку.
12. Черепашка ползет вниз сразу после запуска программы, останавливается по щелчку, снова начинает ползти по щелчку
13. Черепашка стоит после запуска программы. После щелчка начинает движение влево. По щелчку останавливается.
14. *Черепашка ползет вправо после запуска программы. По щелчку начинает ползти влево.
15. Что означают и чему равны x,y в функции click(x,y). Используйте print(x,y).

Теперь рассмотрим другой способ остановки: через изменение скорости.
Эти приемы потребуются для создания игр, так что не стоит их пропускать.

Сначала перенесем скорость в переменную:

from turtle import *
        
def move():
        fd(m)
        ontimer(move,30)
                
m = 2
move()

done()

А теперь по щелчку будем обнулять m:

from turtle import *
        
def click(x,y):
        global m
        m = 0
        
def move():
        fd(m)
        ontimer(move,30)
                
m = 2
onscreenclick(click)
move()

done()

Без global m работать не будет.

Надеюсь, все понятно без дополнительных объяснений?

16. А теперь, не запуская, подумайте, что будет происходить в таком варианте:

from turtle import *
        
def click(x,y):
        global m
        m += 1 # увеличить значение m на 1
        
def move():
        fd(m)
        ontimer(move,30)
                
m = 2
onscreenclick(click)
move()

done()
17. Сделайте так, чтобы после запуска программы Черепашка ползла со скоростью 10, а по щелчку замедлялась на 1.
Щелкните 10 раз, еще раз. Что произошло?
18. Сделайте так, чтобы после запуска программы Черепашка ползла со скоростью 2, а по щелчку сразу останавливалась.
19. Сделайте так, чтобы после запуска программы Черепашка ползла со случайной скоростью от 1 до 5, а по щелчку сразу останавливалась.

И снова Черепашка будет ползти и останавливаться по щелчку:

from turtle import *
        
def click(x,y):
        global m
        if m != 0: # если значение m не равно нулю
                m = 0
        else: # иначе (если равно нулю)
                m = 2
        
def move():
        fd(m)
        ontimer(move,30)
                
m = 2
onscreenclick(click)
move()

done()

У оператора if есть не только возможность выполнять действие, если условие верно, и выполнять другое действие, если условие неверно. Это мы и видим в примере: то, что написано после else будет выполнено, если проверка даст ложь, т.е. если m окажется равно нулю.

Продолжаем управлять Черепашкой: научим ее ползти к месту щелчка.

from turtle import *
        
def click(x,y):
        seth(towards(x,y)) # повернуться в сторону точки с координатами (x,y)
        
def move():
        fd(2)
        ontimer(move,30)
                

onscreenclick(click)
move()

done()
20. Сделайте так, чтобы Черепашка ползла не к щелчку мыши, а от него.
21. Черепашка по щелчку ползет вправо и останавливается, после того, как уползет правее x=100
22. Черепашка по щелчку ползет влево и останавливается, после того, как уползет левее x=-100
23. Черепашка по щелчку ползет вниз и останавливается, после того, как уползет ниже y=-100
24. Черепашка по щелчку ползет в случайном направлении и останавливается после того, как выползет из квадрата, ограниченного линиями: x=-100,x=100,y=-100,y=100
25. Черепашка по щелчку ползет в случайном направлении и останавливается после того, как уползет на расстояние больше 100 от центра (команда distance(0,0))

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *