Karel gets advanced

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

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

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

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

Напишите код для программы 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

Измените код 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

Карл очнулся в другом мире, мире, в котором все вверх ногами. Протестируйте код 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. Библиотека для робота Карла для Windows, для Linux (32bit) и для Linux (64bit)
  7. Библиотека curses для Windows: pdcurses.dll, pdcurses.lib и заголовочные файлы: curses.h, panel.h
  8. Файл для компиляций программ для Карла: Makefile
  9. ViM Quick Reference Card (.pdf)
  10. Конфигурационный файл Томаша для ViM
  11. Конфигурационный файл Даниела для ViM

Video

Рекурсия с Эмой