Черепашка меняет скорость и отражается от стен

В прошлом уроке мы рассмотрели, как остановить Черепашку, когда она дошла до определенной границы.

from turtle import *
shape('turtle') # форма - черепашка (а не треугольник)
def move():
        fd(5)
        if xcor() < 200:
                ontimer(move,30)

move()

done()

Теперь сделаем так, чтобы Черепашка разворачивалась, когда доходила до правой стороны экрана (x = 200)

from turtle import *
shape('turtle')
def move():
        fd(5)
        if xcor() > 200:
                rt(180)
        ontimer(move,30)

move()

done()
1. Черепашка после запуска программы ползет влево и, достигнув координаты x = -200, разворачивается и начинает ползти вправо
2. Черепашка ползает влево-вправо, разворачиваясь на границах x = -200 и x = 200
3. Черепашка ползает вверх-вниз, разворачиваясь на границах y = -200, y = 200

Не менее интересным может быть вариант с замкнутыми границами слева и справа: дойдя до правой границе Черепашка оказывается слева:

from turtle import *
shape('turtle')
speed(0) # нужно, чтобы Черепашка мгновенно переходила с правой границы на левую. Если убрать - будет переходить плавно.
def move():
        fd(5)
        if xcor() > 200:
                setx(-200) # изменить координату x Черепашки

        ontimer(move,30)

move()

done()

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

from turtle import *
from random import randrange as rnd
shape('turtle')
speed(0)
def click(x,y):
        h = rnd(0,360)
        seth(h)
        move()
        
def move():
        fd(5)
        ontimer(move,30)

onscreenclick(click)
done()

На этот раз задача сложная: рассчитать правильное отражение от стены. Угол падения равен углу отражения.

from turtle import *
from random import randrange as rnd
shape('turtle')
speed(0)
def click(x,y):
        h = rnd(0,360)
        seth(h)
        move()
        
def move():
        fd(5)
        x,y = pos()
        if x > 200 or x < -200:
                h = heading()
                seth(180-h)
        if y > 200 or y < -200:
                h = heading()
                seth(-h)
        ontimer(move,30)

onscreenclick(click)
done()
4. Черепашка отражается от верхней и нижней границы, но дойдя до левой границе — оказывается на правой (и наоборот).

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

from turtle import *
from random import randrange as rnd
shape('turtle')
speed(0)
        
def move():
        fd(m)
        ontimer(move,30)

m = 5
move()

done()

Осталось добавить изменение скорости:

from turtle import *
from random import randrange as rnd
shape('turtle')
speed(0)
        
def move():
        global m # изменения m должны сохранится 
        fd(m)
        ontimer(move,30)
        m -= 1

m = 5
move()

done()

Чтобы легче было разглядеть, что происходит, я изменил начальную скорость.
А чтобы было реалистичнее — направил Черепашку вверх.

urtle import *
from random import randrange as rnd
shape('turtle')
speed(0)
        
def move():
        global m # изменения m должны сохранится 
        fd(m)
        ontimer(move,30)
        m -= 1

lt(90) # поворот вверх
m = 15  # начальная скорость стала больше
move()

done()

Черепашка падает вниз в бесконечность. Чтобы спасти ее от падения — добавим реакцию на щелчок:

from turtle import *
from random import randrange as rnd
shape('turtle')
speed(0)
        
def click(x,y):
        global m
        m += 10
                
def move():
        global m # изменения m должны сохранится 
        fd(m)
        ontimer(move,30)
        m -= 1

lt(90) # поворот вверх
m = 15  # начальная скорость стала больше
onscreenclick(click)
move()

done()

Щелкайте! Щелкайте!

5. Придумайте способ, который позволит остановить Черепашку плавно и без возвратного движения.

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

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

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