Problem Set 10: Elevator Saga

Ciele

  • Precvičenie logického a algoritmického myslenia.
  • Oboznámiť sa s tzv. callback funkciami.

Úloha

Cieľom je vytvoriť efektívne riadenie výťahov a odviesť stanovený počet ľudí pred uplynutím zadaného času. Hra má 10 levelov a so stúpajúcim levelom rastie obtiažnosť. Hra obsahuje 4 výťahy a 5 poschodí. S každým levelom sa mení počet osôb, čas a obtiažnosť.

Ukážka hry Elevator Saga.
Obr. 1: Ukážka hry Elevator Saga.

Ako na to?

Riadiť výťahy je možné volaním nasledujúcich funkcií:

  • void go_to_floor (int id, int floor, bool directly) - Pre výťah s identifikátorom id pridá do fronty poschodie floor, ak je parameter directly nastavený na false. Avšak ak je parameter directly nastavený na true, výťah pôjde priamo na zadané poschodie.
  • void stop (int id) - Zastaví pohyb výťahu id.
  • int* get_pressed_floors (int id) - Vráti zoznam stlačených poschodí pre výťah id.
  • int current_floor (int id) - Vráti aktuálne poschodie výťahu s identifikátorm id.
  • int max_passenger_count (int id) - Pre výťah s označením id vráti maximálny počet pasažierov, ktorí môžu byť vo výťahu naraz v jednom čase.
  • float get_load_factor (int id) - vráti vyťaženie výťahu.

Výťahy samotné vedia podávať hlásenia o svojich stavoch, teda volajú nasledovné funkcie, keď konkrétny stav nastane:

  • void on_event_elevator_idle (int id) - Túto funkciu zavolá výťah s označením id, keď vykoná všetky jemu priradené akcie.
  • void on_event_elevator_floor_button_pressed (int id, int floor) - Výťah id touto funkciou informuje o stlačení poschodia floor.
  • void on_event_elevator_stopped_at_floor (int floor_num) - Funkcia je automaticky volaná, ak na poschodí floor_num zastane ľubovoľný výťah.
  • void up_button_pressed (int floor_num) - Funkcia je automaticky volaná, ak na poschodí floor_num chce nejaký pasažier ísť hore.
  • void down_button_pressed (int floor_num) - Funkcia je automaticky volaná, ak na poschodí floor_num chce nejaký pasažier ísť dole.

Odovzdávanie projektu

Vypracované zadanie odovzdajte do 16.12.2018 Vášmu cvičiacemu. Presný spôsob obhajoby zadania Vám upresní Váš cvičiaci.

Zadanie sa odovzdáva aj prostredníctvom systému na správu verzií Git na serveri git.kpi.fei.tuke.sk.

Názov Vášho projektu musí byť v tvare: zap-2018.

Projekt musí mať nasledujúcu štruktúru priečinkov a súborov:

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

Význam jednotlivých súborov je nasledovný:

  • README resp. README.md - Súbor, v ktorom bude uvedená Vaša skupina, ktorú navštevujete na cvičeniach v tvare:
GROUP : C1
  • /ps10/main.c - Zdrojový kód s programom.

Kostra projektu

Z nasledujúceho odkazu si stiahnite súbor game.zip, ktorý obsahuje kostru projektu. V súbore main.c naprogramujte logiku riadenia výťahov. Automaticky volané funkcie sú v tomto súbore už predpripravené. Kód, ktorý má byť vykonávaný pri každom cykle hry, je potrebné napísať alebo volať vo funkcii loop().

V prostredí OS Linux môžete pre stiahnutie použiť príkaz wget v tvare:

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

Hodnotenie

Za zadanie môžete získať max. 10 bodov. Za každý prejdený level (z celkového počtu 10) máte jeden bod.

Váš kód musí byť preložiteľný prekladačom gcc s nasledovnými prepínačmi:

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

Vaše riešenia prejdú kontrolou originality. Preto sa pri práci na Vašom zadaní správajte podľa pravidiel etického kódexu! V prípade, že odovzdáte zadanie, ktoré nie je Vaše, môžete byť vylúčení z predmetu!