Черепашка узнает новые команды

Команды Черепашки ограничены тем, что заложили в нее создатели. Но как быть, если нам требуется нарисовать много квадратов? Конечно, можно скопировать и вставить много раз команды для рисования квадрата, но это будет не слишком красиво и не очень понятно. А уж когда потребуется что-то изменить, то станет совсем грустно.
Попробуйте разобраться в такой программе:

from turtle import *

speed(0)

fd(120)
rt(90)
fd(120)
rt(90)
fd(120)
rt(90)
fd(120)
rt(90)

fd(60)
lt(90)
fd(60)
lt(90)
fd(60)
lt(90)
fd(60)
lt(90)

lt(180)
fd(60)
lt(90)
fd(60)
lt(90)
fd(60)
lt(90)
fd(60)
lt(90)

fd(60)
rt(90)
fd(60)
rt(90)
fd(60)
rt(90)
fd(60)
rt(90)

rt(180)
fd(120)
rt(90)


fd(60)
lt(90)
fd(60)
lt(90)
fd(60)
lt(90)
fd(60)
lt(90)

lt(180)
fd(60)
lt(90)
fd(60)
lt(90)
fd(60)
lt(90)
fd(60)
lt(90)

fd(60)
rt(90)
fd(60)
rt(90)
fd(60)
rt(90)
fd(60)
rt(90)


done()

Чтобы не было грустно, а было хорошо и удобно, мы создадим новую команду, которую назовем sq (от слова square). Тогда рисование квадрата можно будет выполнять одной командой sq().

 

from turtle import *
def sq():
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
done()

Что произошло после запуска данной программы? Подсказка: «ничего» — неправильный ответ. Правильный ответ должен звучать так: программа запустилась без ошибок, показала окно с Черепашкой, ничего не нарисовала.
Слова словами, но ведь ничего не нарисовано! И это правильно, ведь команды рисовать не было, а было объяснение новой команды “sq”. Чтобы воспользоваться этой командой нужно написать sq(). Обратите внимание на скобки: без скобок программа запустится и не покажет ошибок, однако нарисовано ничего не будет. На самом деле def – это создание функции (другие названия: подпрограмма, вспомогательный алгоритм, процедура). Пока мы работаем с Черепашкой это будет удобно называть «созданием новой команды».

 

from turtle import *
def sq():
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
sq()
done()

Теперь нарисуем два квадрата рядом, на расстоянии 50.

 

from turtle import *
def sq():
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
sq()
fd(50)
sq()
done()

Думаю, будет лучше поднять перо после рисования. И опустить – перед рисованием:

 

from turtle import *
def sq():
    pd()
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
    pu()
sq()
fd(50)
sq()
done()

Для красоты добавим заливку цветом:

 

from turtle import *
def sq():
    color('red','yellow')
    begin_fill()
    pd() 
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
    rt(90)
    fd(100)
    pu()
    end_fill()
sq()
fd(50)
sq()
done()
1. Нарисовать 4 квадрата (80х80) в линию по горизонтали, с расстоянием между квадратами, равным 20
2. Создать команду «Прямоугольник» (rect)
3. Нарисовать 6 прямоугольников 80х60 в два ряда
4. Создать команду «Треугольник» (равносторонний)
5. Нарисовать квадрат 50х50, 30х30, 90х90, 10х10, 40х40

При выполнении последнего задания у вас должна была появится мысль, что здесь что-то не так, что должен быть какой-либо другой удобный способ рисования разных квадратов. Конечно же, он существует: для этого нужно использовать параметр:

 

from turtle import *
def sq(a):
    color('red','yellow')
    begin_fill()
    pd() 
    fd(a)
    rt(90)
    fd(a)
    rt(90)
    fd(a)
    rt(90)
    fd(a)
    pu()
    end_fill()
sq(100)
fd(50)
sq(20)
done()
6. Изменить команду «Квадрат» так, чтобы можно было рисовать квадрат с произвольного размера
7. Изменить команду «Прямоугольник» так, чтобы можно было рисовать прямоугольник произвольного размера (потребуется два параметра. Объявлять: def rect(a,b), вызывать: rect(100,80)
8. Изменить команду «Треугольник», чтобы можно было рисовать треугольник произвольного размера
9. Нарисовать несколько квадратов, вложенных друг в друга sq1
10. Нарисовать несколько квадратов, вложенных друг в друга Снимок экрана от 2016-01-03 14:14:05
11. Нарисовать несколько квадратов, вложенных друг в друга Снимок экрана от 2016-01-03 14:39:12

Больше команд, хороших и разных!
Создадим команду (функцию) для рисования цифры 1 b 2 стиле индекса на почтовых конвертах. Для упрощения расчетов будем использовать команды pos и getpos Черепашки.
Снимок экрана от 2016-01-07 18:40:03

from turtle import *
def one():
        x,y = pos()
        pu()
        setpos(x,y+30)
        pd()
        setpos(x+30,y+60)
        setpos(x+30,y)
        pu()
        setpos(x+30,y)

def two():
        x,y = pos()
        pu()
        setpos(x,y+60)
        pd()
        setpos(x+30,y+60)
        setpos(x+30,y+30)
        setpos(x,y)     
        setpos(x+30,y)  
        pu()
        
one()
fd(10)
two()
fd(10)
done()
12. Создайте команды для рисования цифр: 0,6
13. Создайте надпись с текущим годом: 2016
Снимок экрана от 2016-01-05 23:17:38

14. Составьте из этих цифр другие числа:
6012, 1602, 6666, 0000. Во всех ли случаях удалось составить цифры, не подгоняя положение Черепашки?

4 thoughts on “Черепашка узнает новые команды

  1. Недавно начал учить питон и наткнулся на вашу страничку. Проект суперский! И хотя я уже знаком в питоне и с функциями и списками и т.д. тем не менее ваши задачи открывают для меня много нового. Спасибо.
    На 9-ом задании зациклился немного и вот что получилось:

    from turtle import *
    def tre(dl, ch):
        n = int(dl)
        x = (dl/(ch*2))
        y = (x/2)
        chet = ch
        while chet != 0:
            ht()
            down()
            fd(n)
            lt(120)
            fd(n)
            lt(120)
            fd(n)
            lt(120)
            up()
            fd(x)
            lt(90)
            fd(y)
            rt(90)
            n = n - (dl/ch)
            chet = chet - 1
    print(''' Программа рисует РАВНОСТОРОННИЕ треугольники
    равномерно вложенные друг в друга.''')
    print('Введите длинну стороны внешнего треугольника: ', end='')
    dl = float(input())
    print('Введите количество вложенных треугольников: ', end='')
    ch = int(input())
    tre(dl, ch)
    done()
    

    Если можно прокоментировать буду рад. Может можно как то оптимизировать.

    1. Привет. Рад, что задачи нравятся, признаюсь, мне и самому нравятся.
      Теперь по задаче (я отредактировал комментарий — добавил

       до кода и 

      после кода)
      В данном случае функция использована не совсем правильно: логичнее треугольник выделить в свою функцию. Не то, чтобы это сильно было важно, но так будет логичнее.
      Логичнее использовать for x in range вместо while
      Если уж использовать while, то безопаснее так: while chet > 0.
      В данной задаче счетчик не сможет «перескочить» через ноль, но лучше себя приучить к безопасному сравнению. Чтобы ненароком не уйти в зацикливание.
      В конце я добавил я вывод сообщения «the end..», чтобы было понятно, что программа не зависла, а благополучно закончила свою работу.

      from turtle import *
      def tr(n):
          down()
          fd(n)
          lt(120)
          fd(n)
          lt(120)
          fd(n)
          lt(120)
          up()
          
      def tre(dl, ch):
          n = int(dl)
          x = (dl/(ch*2))
          y = (x/2)
          for z in range(ch):
              ht()
              tr(n)
              fd(x)
              lt(90)
              fd(y)
              rt(90)
              n = n - (dl/ch)
      print(''' Программа рисует РАВНОСТОРОННИЕ треугольники
      равномерно вложенные друг в друга.''')
      print('Введите длинну стороны внешнего треугольника: ', end='')
      dl = float(input())
      print('Введите количество вложенных треугольников: ', end='')
      ch = int(input())
      speed(10)
      tre(dl, ch)
      print ('the end...')
      done()
      

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

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