Mastermind

Upozornenia:

Preberanie zadaní

Cvičiaci Miesto a čas
Tibor Vince 16.5. utorok 12:30 PK3_L1 (laboratorium L1, prizemie, Park Komenskeho 3)
Juraj Mihaľov pondelok 15.5. celý deň a v stredu 17.5. do 12:00 v kancelárii v budove PK6
Miroslav Biňas utorok 16.5. od 08:30 do 12:00 A539, Letná 9, Košice
Aleš Deák streda 17.5. od 12:30, B521, Letná 9, Košice
Tomáš Tarkanič utorok 16.5. od 09:00 do 12:00 A537, Letná 9, Košice
Róbert Juraj Zima streda 17.5., od 07:30, A515, Letná 9, Košice
Ján Juhár pondelok 15.5., od 09:00, A537, Letná 9, Košice

Ciele

Logik a.k.a. Mastermind

Mastermind je hra pre dvoch hráčov, ktorá je v našich končinách skôr známa pod názvom Logik. Predpokladám, že ste ju už hrali. Ak však patríte do skupiny hráčo, ktorí pod Quake 3 nejdú, tak vám odporúčam pred týmto zadaním niekoľko partií tejto hry odohrať. Napríklad online verziu tu alebo si nainštalujte verziu pre OS Android.

Mastermind hracie pole

Mastermind hracie pole

Pravidlá hry

Následne si hráči vymenia role a hrajú znova. Hru vyhráva hráč, ktorému sa podarí uhádnuť súperovu kombináciu za menší počet ťahov.

Zadanie

Áno - vašou úlohou je vytvoriť implementáciu hry Logik v jazyku C. Aby to však nebolo až také jednoduché, tu je niekoľko zmien:

Ukážková hra

Pre názornejšiu predstavu toho, ako môže vyzerať jedna partia sa môžete pozrieť napríklad na toto video na YouTube. Alebo vám k tomu môže pomôcť nasledovný výpis:

9347
---- ----
1234 0A2B
5678 0A1B
9012 1A0B
9340 3A0B
9345 3A0B
9346 3A0B
9347 4A0B

Následná komunikácia v rámci dvojriadkového LCD display-u môže vyzerať napríklad takto:

Poznámka: Keďže sa na to určite budete pýtať, či má komunikácia s hráčom vyzerať presne takto, tak si všimnite v úvode výpisu text "môže vyzerať napríklad takto": nie, vaša implementácia môže vyzerať ináč a môže zobrazovať iné texty.

Vybavenie

Pre potreby vytvorenia hry budete potrebovať:

Vývojové prostedie

Vývojové prostredie (IDE) pre Arduino je možné stiahnuť priamo zo stránky www.arduino.cc. Pokiaľ však používate niektorú linuxovú distribúciu, môžete si tento nástroj nainštalovať priamo z repozitára:

Poznámka: Je veľmi pravdepodobné, že verzia Arduino IDE v repozitároch vašej distribúcie bude staršia, ako tá, ktorá je dostupná na oficiálnej stránke. Preto vám odporúčame miesto inštalovania Arduino IDE z repozitárov si nainštalovať najnovšiu verziu priamo zo stránky www.arduino.cc.

Miesto Arduino IDE môžete použiť aj nástroj Fritzing, ktorý ponúka viac možností, ako len vývojové prostredie pre programovanie mikrokontroléra. Pomocou neho môžete napríklad nakresliť schému zapojenia vášho riešenia.

Podobne, ako Arduino IDE môžete aj Fritzing nájsť v repozitároch vašej distribúcie alebo si ho môžete stiahnuť priamo z domovskej stránky projektu.

Tí najväčší makači však budú určite pre vývoj používať textový editor Vim. V tom prípade im určite pomôže napríklad aj tento článok.

Schéma zapojenia

Na obrázku nižšie sa nachádza schéma celého zapojenia. V tomto prípade je veľmi dôležité, aby vaše pripojené vstupy aj výstupy zodpovedali uvedeným PIN-om.

mastermind - schematic

mastermind - schematic

Modul LCD

Tento modul sa týka vášho LCD display-a. Sám osobe nebude kontrolovaný, pretože jeho funkcionalita závisí od typu vášho LCD display-a. Jednotlivé funkcie a ich zoznam sa nachádza v hlavičkovom súbore lcd_wrapper.h.

Dôležitou je funkcia lcd_init(), ktorá slúži na inicializovanie display-a. Túto funkciu volajte podľa potreby z funkcie setup(). Pokiaľ si použitie vašej knižnice vyžaduje aj nejakú globálnu premennú, vytvorte, resp. príslušné volanie zapíšte do súboru lcd_wrapper.cpp, pretože celá práca a všetky volania display-a sa budú nachádzať len v tomto súbore (module).

Modul Mastermind

Tento modul obsahuje samotnú logiku celej hry.

Úloha #1: Funkcia generate_code()

Táto funkcia slúži na vygenerovanie tajného kódu, ktorý má byť uhádnutý. Vygenerovaný kód vráti ako referenciu na reťazec znakov, ktorý je zložený len zo znakov číslic.

Funkcia má tieto pozičné parametre:

Funkcia vráti referenciu na vygenerovaný reťazec alebo NULL, ak sa tento reťazec vygenerovať nepodarilo. Funkcia vráti NULL aj v prípade, ak parameter repeat bude mať hodnotu false a dĺžka reťazca bude väčšia ako 10.

Príklad použitia

char* code = NULL;

// code will be generated as sequence not repeating digits of length 4
code = generate_code(false, 4);
// code = "1234";
free(code)

// code will be generated as sequence of repeating digits of length 5
code = generate_code(true, 5);
// code = "65656";
free(code);

// no code will be generated
code = generate_code(true, -10);
// code = NULL;

Úloha #2: Funkcia get_score()

Pomocou tejto funkcie dôjde k vyhodnoteniu aktuálneho pokusu. Výsledkom bude nastavenie správnych hodôt pre počet uhádnutých číslic nachádzajúcich sa na správnej pozícii, ako aj pre počet uhádnutých číslic, ktoré nie sú na správnej pozícii.

Funkcia má tieto pozičné parametre:

Funkcia nevracia žiadnu hodnotu.

Príklad použitia

int peg_a;
int peg_b;

get_score("9347", "1234", &peg_a, &peg_b);
assert(peg_a == 0 && peg_b == 2);

get_score("9347", "9348", &peg_a, &peg_b);
assert(peg_a == 3 && peg_b == 0);

get_score("9347", "1256", &peg_a, &peg_b);
assert(peg_a == 0 && peg_b == 0);

get_score("9347", "9436", &peg_a, &peg_b);
assert(peg_a == 1 && peg_b == 2);

Úloha #3: Funkcie turn_off_leds() a render_leds()

Obe tieto funkcie slúžia na prácu s RGB diódami. Funkcia turn_off_leds() nemá žiadny parameter a po jej zavolaní všetky diódy zhasnú.

Funkcia render_leds() naopak na základe toho, koľko číslic hráč uhádol, rozsvieti príslušné RGB diódy - za každú uhádnutú číslicu na pozícii, rozsvieti jednu RGB diódu na červeno, a za každú uhádnutú číslicu, ktorá sa nenchádza na správnej pozícii, rozsvieti jednu RGB diódu na modro.

Poznámka: Žiadna dióda nie je spätá so žiadnou pozíciou číslice. To znamená, že hráč nesmie vedieť, že ak svieti RGB dióda č. 1, že uhádol číslicu na prvej pozícii.

Funkcia render_leds() má nasledovné pozičné parametre:

Funkcie nevracajú žiadnu hodnotu.

Príklad použitia

turn_off_leds();

render_leds(2, 1);
// two leds will have red color, one will have blue and last one will be off

Úloha #4: Funkcia render_history()

Úlohou tejto funkcie je vypísať na display príslušný záznam z histórie spolus jeho hodnotením.

Funkcia render_history() má nasledovné pozičné parametre:

Funkcia nevracia žiadnu hodnotu.

Príklad použitia

char* history[3][4];

history[0][0] = "1234";
history[1][0] = "5678";
history[2][0] = "9012";

render_history("9347", history, 2);
// renders and evaluates "9012"

Úloha #5: Funkcia play_game()

Funkcia, ktorá reprezentuje samotnú hru od jej spustenia až po jej dohranie.

Táto funkcia je špecifická kvôli tomu, že hernú slučku bude obsahovať sama v sebe a nebude využívať funkciu loop(), ktorú ponúka Arduino. Týmto prístupom sa totiž dokážeme vyhnúť nadmernému používaniu globálnych premenných, k čomu nás väčšina príkladov/tutoriálov/knižiek venovaných Arduinu priamo povzbudzuje.

Funkcia má jeden pozičný parameter:

Funkcia po skončení nič nevracia.

Príklad použitia

void loop(){
    char* code = generate_code(false, 4);
    play_game(code);
    free(code);
}

Odovzdávanie projektu

Zadanie sa odovzdáva prostredníctvom systému na správu verzií Git na serveri http://git.kpi.fei.tuke.sk/. Riešenie tejto úlohy odovzdáte ako súčasť vášho projektu s názvom prog-2017.

Štruktúra vášho projektu bude vyzerať nasledovne:

.
├── ps4
│   ├── ps4.ino
│   ├── lcd_wrapper.cpp
│   ├── lcd_wrapper.h
│   ├── mastermind.cpp
│   └── mastermind.h
└── README

kde význam súborov v priečinku ps4/ je nasledovný:

Upozornenie: Je dôležité, aby vaše súbory zachovali uvedenú štruktúru. Ak sa niektorý zo súborov síce v repozitári nachádza, ale v inom priečinku, bude to považované za chybu a takýto projekt nebude považovaný za správny! Ak sa naopak vo vašom projekte nachádzajú súbory alebo priečinky navyše, tieto nebudú považované za chybu.

Upozornenie: Pri názvoch priečinkov, súborov a obsahu súboru README záleží na veľkosti písmen!

Kostra projektu

Tentokrát je kostra projektu reprezentovaná len jedným hlavičkovým súborom, ktorý si môžete stiahnuť z tohto odkazu.

Hodnotenie a testovanie

Za zadanie môžete získať max. 7 bodov. Počet získaných bodov sa bude odrážať od výsledku testov, ktorými vaše zadanie úspešne prejde. Overovať sa bude:

Testovanie vašich riešení sa bude vykonávať automaticky každé 3 hodiny a to konkrétne o 0300, 0600, 0900, 1200, 1500, 1800, 2100 a 2400.

Vaše riešenia opäť 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, budete vylúčení z predmetu!

Ďalšie zdroje

Diskusia

Upozornenie: Do svojich príspevkov nevkladajte správne riešenia úloh a ani ich od ostatných nežiadajte! Nepoužívajte sprosté slová! Takéto príspevky budú zmazané! Riaďte sa podľa pravidiel etického kódexu.