4. týždeň

Super Karel rocks on

Более сложные алгоритмические задачи

Тема лабораторной

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

Objectives

  • Управлять роботом с помощью всех доступных сенсоров и команд.
  • Использовать собственные функции, логические ветвления и циклы.
  • Освоить работу с алгоритмическими задачами по сложности уровнем выше.

Postup

Step 1: Setup

Task 1.1

Создайте каталог ~/labs/lab04 и скопируйте файл, необходимый для компиляции программы: Makefile.

Task 1.2

Файл Makefile вы можете найти в директориях с прошлых занятий ~/labs/lab02 или ~/labs/lab03. Его затем нужно скопировать в каталог ~/labs/lab04.

Step 2: Collector

В этой программе робот будет заниматься сбором значков.

Task 2.1

Напишите код для программы collector, в которой Карл будет собирать значки по всей карте, там, где только их найдет. Код протестируйте на карте collector.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST       0         3
ST.+---------------+
 5 | 2   .   2   . |
   |               |
 4 | .   .   .   3 |
   |               |
 3 | .   1   .   . |
   |               |
 2 | .   .   2   3 |
   |               |
 1 | >   .   2   . |
   +---------------+
     1   2   3   4   AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (4, 5)   NORTH     18         0
ST.+---------------+
 5 | .   .   .   ^ |
   |               |
 4 | .   .   .   . |
   |               |
 3 | .   .   .   . |
   |               |
 2 | .   .   .   . |
   |               |
 1 | .   .   .   . |
   +---------------+
     1   2   3   4   AVE.

Task 2.2

Измените код collector так, чтобы Карл начал сбор значков с левого нижнего угла мира. Мир для тестирования: collector2.kw.

Step 3: Multiplier

На этом этапе Карл будет удваивать количество значков.

Task 3.1

Напишите код для программы multiplier, в которой Карл будет увеличивать количество значков в два раза на соответствующих местах. Конечно же, не забывайте: переменные использовать нельзя! Решение протестируйте: multiplier.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST      99         0
ST.+-------------------+
 5 | .   4   .   .   . |
   |                   |
 4 | 4   .   .   .   . |
   |                   |
 3 | .   3   .   .   1 |
   |                   |
 2 | .   .   .   .   . |
   |                   |
 1 | >   1   .   2   . |
   +-------------------+
     1   2   3   4   5   AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST      84         0
ST.+-------------------+
 5 | .   8   .   .   . |
   |                   |
 4 | 8   .   .   .   . |
   |                   |
 3 | .   6   .   .   2 |
   |                   |
 2 | .   .   .   .   . |
   |                   |
 1 | >   2   .   4   . |
   +-------------------+
     1   2   3   4   5   AVE.

Additional tasks

Task A.1

Напишите код для программы highway, благодаря которой Карл пройдет путь с востока на запад и заполнит по пути все дыры разной глубины. Заполнять нужно только те места, которые еще не заполнены. Код протестируйте: highway.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 4)   EAST      99         0
ST.+-----------------------------------+
 6 | .   .   .   .   .   .   .   .   . |
   |                                   |
 5 | .   .   .   .   .   .   .   .   . |
   |                                   |
 4 | >   .   .   .   .   .   .   .   . |
   |   +   +---+   +   +---+   +   +---|
 3 | . | 1 | . | . | . | . | . | 1 | . |
   |   |   |   +---+   |   |   |   |   |
 2 | . | 1 | .   . | 1 | . | 1 | . | . |
   |   +---+       |   |   +---+   |   |
 1 | . | .   .   . | . | .   . | . | . |
   +-----------------------------------+
     1   2   3   4   5   6   7   8   9   AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (9, 4)   EAST      90         0
ST.+-----------------------------------+
 6 | .   .   .   .   .   .   .   .   . |
   |                                   |
 5 | .   .   .   .   .   .   .   .   . |
   |                                   |
 4 | .   .   .   .   .   .   .   .   > |
   |   +   +---+   +   +---+   +   +---|
 3 | 1 | 1 | . | 1 | 1 | . | 1 | 1 | . |
   |   |   |   +---+   |   |   |   |   |
 2 | 1 | 1 | .   . | 1 | . | 1 | 1 | . |
   |   +---+       |   |   +---+   |   |
 1 | 1 | .   .   . | 1 | .   . | 1 | . |
   +-----------------------------------+
     1   2   3   4   5   6   7   8   9   AVE.

Task A.2

Измените код highway таким образом, чтобы Карл мог начинать свой путь с любого края его пути. В начале движения Карл будет повёрнут на открытый путь. Таким образом, Карл сможет двигать и с запада на восток, и с востока на запад. Код тестируйте на карте highway2.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (8, 4)    WEST      99         0
ST.+-------------------------------+
 4 | .   .   .   .   .   .   .   < |
   |   +   +---+   +---+   +-------|
 3 | . | 1 | . | . | . | 1 | .   . |
   |   +---+   |   |   |   |       |
 2 | . | .   . | . | . | . | .   . |
   |   |       +---+   |   |       |
 1 | 1 | .   .   .   . | . | .   . |
   +-------------------------------+
     1   2   3   4   5   6   7   8  AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 4)    WEST      93         0
ST.+-------------------------------+
 4 | <   .   .   .   .   .   .   . |
   |   +   +---+   +---+   +-------|
 3 | 1 | 1 | . | 1 | . | 1 | .   . |
   |   +---+   |   |   |   |       |
 2 | 1 | .   . | 1 | . | 1 | .   . |
   |   |       +---+   |   |       |
 1 | 1 | .   .   .   . | 1 | .   . |
   +-------------------------------+
     1   2   3   4   5   6   7   8  AVE.

Task A.3

Карл очнулся в другом мире, мире, в котором все вверх ногами. Протестируйте код highway на карте, в которой все также вверх ногами. Если нужно, подправьте код. Карты: highway3.kw, highway4.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 3)   EAST      99         0
ST.+-----------------------------------+
 6 | . | .   .   . | . | .   . | . | . |
   |   +---+       |   |   +---+   |   |
 5 | . | 1 | .   . | 1 | . | 1 | . | . |
   |   |   |   +---+   |   |   |   |   |
 4 | . | 1 | . | . | . | . | . | 1 | . |
   |       +---+       +---+       +---|
 3 | >   .   .   .   .   .   .   .   . |
   |                                   |
 2 | .   .   .   .   .   .   .   .   . |
   |                                   |
 1 | .   .   .   .   .   .   .   .   . |
   +-----------------------------------+
     1   2   3   4   5   6   7   8   9   AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (9, 3)   EAST      90         0
ST.+-----------------------------------+
 6 | 1 | .   .   . | 1 | .   . | 1 | . |
   |   +---+       |   |   +---+   |   |
 5 | 1 | 1 | .   . | 1 | . | 1 | 1 | . |
   |   |   |   +---+   |   |   |   |   |
 4 | 1 | 1 | . | 1 | 1 | . | 1 | 1 | . |
   |       +---+       +---+       +---|
 3 | .   .   .   .   .   .   .   .   > |
   |                                   |
 2 | .   .   .   .   .   .   .   .   . |
   |                                   |
 1 | .   .   .   .   .   .   .   .   . |
   +-----------------------------------+
     1   2   3   4   5   6   7   8   9   AVE.

Additional Resources

  1. Karel Language Reference
  2. Here you can find the original library of Karel the Robot, including the library installation instructions.
  3. Rudolf Pecinovský: Základy algoritmizace - глава 10
  4. Pavel Herout: Učebnice jazyka C (1. díl) - главы 5.1, 5.4, 5.5
  5. Заголовочный файл робота Карла karel.h
  6. Заголовочный файл супер робота Карла superkarel.h
  7. Файл для компиляций программ для Карла Makefile
  8. Файл для компиляции программ для супер Карла Makefile-superkarel
  9. GNU Make Tutorial
  10. ViM Quick Reference Card (.pdf)
  11. Конфигурационный файл Томаша для ViM
  12. Конфигурационный файл Даниела для ViM

Video