Problem Set 10: Elevator Saga

Objectives

  • Практика логического и алгоритмического мышления.
  • Ознакомиться с так называемыми callback функциями.

Task

Целью данного задания является создание эффективного управления лифтами для транспорта определённого количества людей за ограниченное время. В игре будет 10 уровней, в каждом последующем из которых сложность непрерывно растёт. В игре есть 4 лифта и 5 этажей. С каждым уровнем меняется количество людей, время и сложность уровня.

Иллюстрация игры Elevator Saga.
Obr. 1: Иллюстрация игры Elevator Saga.

How to do it?

Управления лифтами осуществляется с помощью 4 функций:

  • void go_to_floor (int id, int floor, bool directly) - Лифту с идентификатором id добавит в очередь floor, если параметр directly представляет false. Если же directly будет иметь значение true, лифт отправится сразу на данный этаж.
  • void stop (int id) - Остановит движение лифта с идентификатором id.
  • int* get_pressed_floors (int id) - Возвращает очередь этажей, на который должен попасть лифт с идентификатором id.
  • int current_floor (int id) - Возвращает этаж, на котором в данный момент находится лифт с идентификатором id.
  • int max_passenger_count (int id) - Возвращает для лифта с идентификатором id максимальное количество пассажиров, который лифт может перевозить.
  • float get_load_factor (int id) - возвращает нагрузку лифта.

Лифты имеют возможность уведомлять о своих состояниях, то есть вызывают соответствующие функции, когда переходят в определённое состояние:

  • void on_event_elevator_idle (int id) - данную функцию вызовет лифт с идентификатором id, если завершит всю очередь данных ему заданий.
  • void on_event_elevator_floor_button_pressed (int id, int floor) - лифт с идентификатором id данной функцией уведомляет, если был выбран этаж floor.
  • void on_event_elevator_stopped_at_floor (int floor_num) - функция автоматически вызывается, если на этаже floor_num остановится какой-то лифт.
  • void up_button_pressed (int floor_num) - функция автоматически вызывается, если на этаже floor_num какой-то пассажир хочет подняться на лифте.
  • void down_button_pressed (int floor_num) - функция автоматически вызывается, если на этаже floor_num какой-то пассажир хочет спуститься на лифте.

Project Submission

Задание нужно сдать до 16.12.2018. Последние тесты будут запущены в полночь этой даты.

Задание сдаётся с помощью системы контроля версий Git на сервере git.kpi.fei.tuke.sk.

Название вашего проекта должно быть точно в формате: zap-2018.

Сохраните иерархию файлов и директорий:

.
├── ps10
│   └── main.c
└── README

Значение отдельных файлов:

  • README или README.md - файл, в котором указывается группа, которую вы посещаете на практиках, должна быть строго в формате:
GROUP : C1
  • /ps10/main.c - код реализации программы.

Project Skeleton

По следующей ссылке скачайте архив game.zip, содержащий в себе структуру (скелет) программы. В файле main.c напрограммируйте логику управления лифтами. Автоматически вызывающиеся функции в данном файлы уже написаны. Код, который должен выполняться в каждой итерации игры, поместите в тело функции loop().

В среде OS Linux можете для загрузи использовать wget в виде:

wget http://it4kt.cnl.sk/c/zap/resources/game.zip

Assessment

За задание можно получить максимально max. 10 баллов. За каждый уровень по одному баллу.

Сборка будет осуществляться с помощью компилятора gcc со следующими параметрами:

gcc -Werror -Wall main.c lib/elevator_lib.so -o game

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