В прошлый раз мы рассмотрели, как научить Черепашку начинать движение после щелчка мыши.
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
вызвана больше не будет: Черепашка остановится.
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
не происходит и Черепашка останавливается.
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()
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
работать не будет.
Надеюсь, все понятно без дополнительных объяснений?
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()
Щелкните 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()
21. Черепашка по щелчку ползет вправо и останавливается, после того, как уползет правее x=100
22. Черепашка по щелчку ползет влево и останавливается, после того, как уползет левее x=-100
23. Черепашка по щелчку ползет вниз и останавливается, после того, как уползет ниже y=-100
24. Черепашка по щелчку ползет в случайном направлении и останавливается после того, как выползет из квадрата, ограниченного линиями: x=-100,x=100,y=-100,y=100
25. Черепашка по щелчку ползет в случайном направлении и останавливается после того, как уползет на расстояние больше 100 от центра (команда distance(0,0))