From def9f04a3f2ec5dc89b26161a080c7fd12532016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Vasi=C4=BE?= Date: Sun, 5 Jun 2022 16:02:35 +0200 Subject: [PATCH] finalne_zadanie --- final/.gitignore | 54 +++++++++++++ final/LICENSE | 29 +++++++ final/Makefile | 14 ++++ final/README.md | 78 +++++++++++++++++++ final/README.pdf | Bin 0 -> 64393 bytes final/game.c | 199 +++++++++++++++++++++++++++++++++++++++++++++++ final/game.h | 39 ++++++++++ final/hra | Bin 0 -> 24553 bytes final/main.c | 7 ++ final/world.c | 182 +++++++++++++++++++++++++++++++++++++++++++ final/world.h | 123 +++++++++++++++++++++++++++++ 11 files changed, 725 insertions(+) create mode 100644 final/.gitignore create mode 100644 final/LICENSE create mode 100644 final/Makefile create mode 100644 final/README.md create mode 100644 final/README.pdf create mode 100644 final/game.c create mode 100644 final/game.h create mode 100755 final/hra create mode 100644 final/main.c create mode 100644 final/world.c create mode 100644 final/world.h diff --git a/final/.gitignore b/final/.gitignore new file mode 100644 index 0000000..ecf4432 --- /dev/null +++ b/final/.gitignore @@ -0,0 +1,54 @@ +game + +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf diff --git a/final/LICENSE b/final/LICENSE new file mode 100644 index 0000000..39d1664 --- /dev/null +++ b/final/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2019, Daniel Hládek +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/final/Makefile b/final/Makefile new file mode 100644 index 0000000..bf0933d --- /dev/null +++ b/final/Makefile @@ -0,0 +1,14 @@ +CFLAGS=-std=c99 -Wall -g + +all: game + +%.o: %.c + gcc $(CFLAGS) -c $< -o $@ + +clean: + rm *.o + rm hra + +game: main.o game.o world.o + gcc main.o game.o world.o -lcurses -lm -o hra + diff --git a/final/README.md b/final/README.md new file mode 100644 index 0000000..c3799a6 --- /dev/null +++ b/final/README.md @@ -0,0 +1,78 @@ +# Piškvorky - hra + +## Obsah + +- Predstavenie hry +- Kompilácia a spustenie hry +- Priebeh hry a jej koniec +- Štruktúry a funkcie hry +- Zdroje + +## Predstavenie hry + +Počítačová verzia hry piškvorky je určená pre dvoch hráčov. Títo hráči sa počas hrania hry pri počítači striedajú. Cieľom hry je vytvoriť piškvorku. Hráč, ktorý vytvorí piškvorku, vyhráva. Po vytvorení piškvorky sa hra ukončí a oznámi výherného hráča. Hra je naprogramovaná v jazyku C. + +## Kompilácia a spustenie hry + +Pre kompiláciu hry je potrebné použiť pripravený Makefile, ktorý sa nachádza v rovnakom priečinku, ako zdrojové kódy programu. Pre kompiláciu programu je potrebné mať nainštalovanú knižnicu ncurses. + +Hru skompilujeme pomocou nasledujúceho príkazu: + + make all + +A následne ju spustíme pomocou príkazu: + + ./hra + +## Priebeh hry + +Po spustení hry sa na obrazovku vykreslí herný plán a pod ním sa zobrazia oznamy o aktuálnom stave hry. + +Herný plán tvorí sieť, ktorej veľkosť sa mení v závislosti od veľkosti výstupnej obrazovky. Každé políčko v tejto sieti je má svoje číslo, ktoré hráč zadáva ako vstup do programu počas hrania hry. + +Ako už bolo vyššie spomenuté, tak táto verzia hry je určená pre dvoch hráčov. Hráči sa počas hrania striedajú pri počítači. Hráč zadá do programu číslo políčka, ktoré chce obsadiť. Následne sa na danom políčku namiesto čísla vyobrazí znak hráča. Ak hráč zadá číslo políčka, ktoré je obsadené, príp. číslo mimo rozsah, alebo iný znak, tak prichádza o pokus a nasleduje další hráč. Hru vyhráva hráč, ktorý ako prvý úspešne zostaví piškvorku. + +Na hernej obrazovke sa následne objaví oznam o skončení hry a potom v termináli OS aj oznam oznamujúci, ktorý hráč vyhral. + +## Štruktúry a funkcie hry + +Hra je naprogramovaná pre použitie knižnicou world.h. + +Obsahuje základnú riadiacu štruktúru celej hry. Teraz si podrobnejšie popíšeme jej jednotlivé premenné. Pri premenných, pri ktroých je z popisu jasné, na čo sú určené, nebudeme popis uvádzať: + + int vyskaPolicka + int sirkaPolicka + + int poslednePolickoX //premenná uchováva súradnicu X posledného políčka + int poslednePolickoY //rovnako ako predchádzajúca premenná, ale súradnicu Y + + int pocetPolicokX //počet políčok v 1 riadku + int pocetPolicokY //počet políčok v 1 stĺpci + int celkovyPocetPolicok + + int** hernePole //v dvojrozmernom poli je uložený aktuálny herný plán + + char hrac1 + char hrac2 + char aktualnyHrac + char nasledujuciHrac + +Teraz si stručne popíšeme jednotlivé funkcie hry: + +- **void*** inicializaciaHry(): každá hra, ktorá využíva knižnicu world, musí obsahovať funkciu, ktorá na začiatku nainicializuje hru; v tomto prípade táto funkcia nainicializuje riadiacu štruktúru hry, jednotlivé položky štruktúry a herný plán +- **void** vykreslenieHry(struct hra* hra): funkcia vykreslí aktuálny stav hry na základe herného a vypíše informačné hlásenia +- **int** hernaSlucka(struct event* udalost, void* hra): okrem inicializačnej funkcie musí každá hra naprogramovaná v knižnici world obsahovať aj riadiacu funkciu, táto funkcia riadi stav celej hry, štruktúra event obsahuje vstup z knižnice world +- **int**** dvojrozmernePole(int prvyRozmer, int druhyRozmer): funkcia nainicializuje dvojrizmerné pole typu int +- **void** stavPolicka(struct hra* hra, int vstup): funkcia skontroluje, či zadaný vstup je platný a či je políčko v hernom poli je obsadené +- **void** zmenaHraca(struct hra* hra): funkcia zmení aktuálneho hráča po vykonaní jednej hernej slučky +- **void** vertikalneVytvoreniePiskvorky(struct hra* hra): hra skontroluje vytvorenie piškvorky vo vertikálnom smere +- **void** horizontalneVytvoreniePiskvorky(struct hra* hra): skontroluje vytvorenie piškvorky vo horizontálnom smere +- **void** krizoveVytvoreniePiskvorkyZlava(struct hra* hra): skontroluje vytvorenie šikmej piškvorky z ľavej strany +- **void** krizoveVytvoreniePiskvorkySprava(struct hra* hra): skontroluje vytvorenie šikmej piškvorky spravej strany +- **void** koniecHry(char* sprava): funkcia obsahuje príkazy potrebné pre ukončenie hry, funkcia musí po ukončení hry vypísať informáciu (ľubovoľnú) + +Kvôli výskytu dvojciferných čísel sme museli upraviť aj spôsob načítavania čísel do pamäte, keďže pôvodná verzia dokázala načítať iba jeden znak. Po úprave dokáže knižnica world načítať trojciferné číslo a pred potvrdením ho je možné aj editovať. + +## Zdroje + +[How to clear a specific line with NCurses?] (https://stackoverflow.com/questions/5072881/how-to-clear-a-specific-line-with-ncurses) \ No newline at end of file diff --git a/final/README.pdf b/final/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..600e91e8ccfd668a0f6f07b524b232bf6121b922 GIT binary patch literal 64393 zcmd42bCfMlwFWwr$(4>iT{6d*j}I-F?UCf8Ka|#NLrR za%QZI87nd)R?Z}n6%?kTqhhW|Vj13g?ia2kFoTpDQ`dn-N5{{%7pCrE(r zAJBh5B?WM4!D%GL|Mjc#Pq~yNE+aUN0w1oUy_3=ZzAo1PtV`I;(($L2G{TlY?GZFG zurd5OM$*XI#L*O&fsLM?n;X}`@rNHPaMz4Wjn(MQAvmw>>KzB)nNAvCINY?>{o{e( z9{}PPxPKv6UVU(tIu}oguj!*Jegz9-!>AdmEW4{JCA+XNCud8|cJo}@re$o^PqA6y zaC3d$4J=1VnAd9`UM~A^f8G>dn&h=>fxd+W^*Zv8KMZ|;eQhekcz>Rrre9w?&HI2i zr(6~_(oI|p^UHZ!aOG%hclx{?En2yGd=t=--a67+*Yn&CfTB$8wGlzBxT$ zoN6vQR3_$0j16{MUVnc&y7^4aVAP+ND8NUv&sXPeFMPpcSgq^$#HWjykr>a~gc(|1 zY+MqpVkgzWchuLhB&!#?)L$XL#dXhi>tr=RbG#F_NXdc!mbZkW0-liyd0 zjMueyF(P6iaxQy{B?Eqn?B<_Sc|m*u+HeH{RK{bQ%g_`!YAjGLyv;ot zY|}hyOiCUYVG$m$RWY4Ndr7U+8VefYC)BnK*R9!0|OQ z+}^nMxcPO*ShfJ70aQ!q*_FbCl*=++%YdmkpnlfB6#b!pm2|B}x_41V=6AbeXK}K=24(*? zz2Ok>@=)LGp=oy=eJ_7}r+xdZe0+aF74lNBj=lZm7YXEz4Gx8kq&foR)rD7^HiFGG zv*h9e;Kxmu=Pf4m?IEng&L5>kpFfc$0Se?5$qc zD;om`OD^Outt#faR|G$dpB30%f*0oZCJr8EBwQ5sNk}w17uT_eAa=Lg77n1NE9%6$ z2at(#<7-BNO&dk!YYQuH_?iA!3MDW0i#TUVa6camN|Z%A555OrKGcDiQx`pKXFm{B zl1LBY0P2~}Y6l>jiL)dm6x5yqXi66h4|Dmloz=jF!MKF$H7J z<^{OU@x|uge*dv&`Qkh6Q>XqrCi!zadjfh*p<9yI^qWyeX5mOb8%V8iqh20G#D_-w zRkAzS+l#};Ivz>syUpctjWZ{g>!A&l>NFizKqSI*CupL8hFGg%SM~GZfE4_N1W~+h zEq+C^fc4Qay|6Bl++-~zGz@SNF^^#0s0k<*FsLjn2$O6q?%0D1*kaG)QTj}Mn6bb2 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

foIx`5)K6D|0IzsdJV|X(kUBA;9O+q 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 Lz~kUh2C4iH=q+N= literal 0 HcmV?d00001 diff --git a/final/game.c b/final/game.c new file mode 100644 index 0000000..01b5ce4 --- /dev/null +++ b/final/game.c @@ -0,0 +1,199 @@ +#include //pripojm potrebn kninice +#include +#include +#include "world.h" +#include "game.h" + +#define DLZKA_HLASENIA 500 //zadefinujem maximlnu dku hlsenia + +void* inicializaciaHry() { //vytvorm funkciu pre prvotn inicializciu hry + struct hra* hra = (struct hra*) malloc(sizeof(struct hra)); //nainicializujem riadiacu truktru pre cel hru + hra->vyskaPolicka = (LINES / 10); //nainicializujem jednotliv prvky truktry + hra->sirkaPolicka = (COLS / 10); + hra->pocetPolicokX = 4; + hra->pocetPolicokY = 6; + hra->poslednePolickoX = (COLS / 10) * hra->pocetPolicokX; //vypotam koncov sradnice hracieho poa v osi X a Y + hra->poslednePolickoY = (LINES / 10) * hra->pocetPolicokY; + hra->celkovyPocetPolicok = hra->pocetPolicokX * hra->pocetPolicokY; + hra->hraciePole = dvojrozmernePole(hra->pocetPolicokY, hra->pocetPolicokX); + hra->hrac1 = 'X'; + hra->hrac2 = 'O'; + hra->aktualnyHrac = hra->hrac1; + hra->nasledujuciHrac = hra->hrac2; + + int cisloPolicka = 1, i, j; + for (i = 0; i < hra->pocetPolicokY; i++) { + for (j = 0; j < hra->pocetPolicokX; j++) { + hra->hraciePole[i][j] = cisloPolicka; //nainicializujem hracie poli pozinmi slami + cisloPolicka++; + } + } + + return hra; +} + +void vykreslenieHry(struct hra* hra) { //funkcia vykresl aktulny stav hry + int i, j; + + clear(); //vyistm predchdzajci pln hry + for (i = 0; i < hra->poslednePolickoY + hra->vyskaPolicka; i += hra->vyskaPolicka) { + for (j = 0; j < hra->poslednePolickoX; j++) set_cell('-', j, i); //nakreslm hranice plnu na osi X + } + + for (i = 0; i < hra->poslednePolickoX + hra->sirkaPolicka; i += hra->sirkaPolicka) { + for (j = 0; j < hra->poslednePolickoY; j++) set_cell('|', i, j); //nakreslm hranice plnu na osi Y + } + + int k, l; //zadeklarujem premenn pre riadenie vpisu z hernho poa + for (j = 0, l = 0; j < hra->poslednePolickoY; j += hra->vyskaPolicka, l++) { //v rmci hernho plnu je potrebn posva sa aj v rmci osi Y, zaiatok je v prvej polovici polka a posva sa o jedno polko + for (i = 0, k = 0; i < hra->poslednePolickoX; i += hra->sirkaPolicka, k++) { // poiatok vykresovania je v polovici prvho polka hernho plnu v osi X, pln sa posva o jedno polko + /*index prvho hra: -5 + index druhho hra: -6*/ + if (hra->hraciePole[l][k] == -5) mvprintw(j + hra->vyskaPolicka / 2, i + hra->sirkaPolicka / 2, "%c", hra->hrac1); //ak sa namiesto psla polka nachdza na prslunej pozcii index prvho hra, tak na jeho miesto vykreslm znak prvho hra + else if (hra->hraciePole[l][k] == -6) mvprintw(j + hra->vyskaPolicka / 2, i + hra->sirkaPolicka / 2, "%c", hra->hrac2); //ak sa namiesto psla polka nachdza na prslunej pozcii index druhho hra, tak na jeho miesto vykreslm znak druhho hra + else mvprintw(j + hra->vyskaPolicka / 2, i + hra->sirkaPolicka / 2, "%d", hra->hraciePole[l][k]); + } + } + + mvprintw(LINES - (2 * (LINES / 10)), 10, "Aktualny hrac: %c", hra->aktualnyHrac); //zobrazm aktulneho hra + mvprintw(LINES - (2 * (LINES / 10)) + 1, 10, "Zadajte cislo neobsadeneho policka: "); //hlkou vyzvem hra na zadanie sla polka + + refresh(); //vyobrazm novovygenerovan pln hry +} + +int hernaSlucka(struct event* udalost, void* hra) { //funkcia je riadiaca truktra pre kninicu world + struct hra* vstupneData = (struct hra*) hra; //vstupn truktru pre hru prevediem na prslun dtov typ + + stavPolicka(vstupneData, udalost->key); //zmenm stav hernho plnu + + zmenaHraca(vstupneData); //zmenm hra + vykreslenieHry(vstupneData); //a nakoniec vykreslm aktulny stav hry + + vertikalneVytvoreniePiskvorky(hra); //skontrolujem, i je pikvorka vytvoren + horizontalneVytvoreniePiskvorky(hra); + krizoveVytvoreniePiskvorkyZlava(hra); + krizoveVytvoreniePiskvorkySprava(hra); + + return 0; +} + +int** dvojrozmernePole(int prvyRozmer, int druhyRozmer) { //funkcia vytvor dvojrozmern pole typu int + int i; + int **pole = (int**) malloc(prvyRozmer * sizeof(int*)); //nainicializujem prv rozmer poa + for (i = 0; i < prvyRozmer; i++) pole[i] = (int*) malloc(druhyRozmer * sizeof(int)); //nainicializujem druh rozmer poa + + return pole; +} + +void stavPolicka(struct hra* hra, int vstup) { //funkcia skontroluje, i bolo zadan platn slo polka, prirad ho prslunmu hrovi a prslune zmen hern pln + int i, j; + + for (i = 0; i < hra->pocetPolicokY; i++) { //postupne prejdem cel pole + for (j = 0; j < hra->pocetPolicokX; j++) { + if (hra->hraciePole[i][j] <= 0 && hra->hraciePole[i][j] > hra->celkovyPocetPolicok) break; //ak hr zadal neplatn slo polka, tak sa v hernom plne nevykon iadna zmena + if (hra->hraciePole[i][j] == vstup) { //ak sa zadan slo zhoduje s kontrolovanm slom, tak zmenm hern pln + if (hra->aktualnyHrac == hra->hrac1) hra->hraciePole[i][j] = -5; //zmenm slo polka na prslun index + else hra->hraciePole[i][j] = -6; + } + } + } +} + +void zmenaHraca(struct hra* hra) { //funkcia zmen hra po vykonan jednej hernej sluky + if (hra->aktualnyHrac == hra->hrac1) { //zmena z 1. hra na druhho + hra->aktualnyHrac = hra->nasledujuciHrac; + hra->nasledujuciHrac = hra->hrac1; + } else { //a naopak + hra->aktualnyHrac = hra->nasledujuciHrac; + hra->nasledujuciHrac = hra->hrac2; + } +} + +/*nasledujce funkcie kontroluj vytvorenie pikvorky (jednotliv funkcie sa lia matematickmi vpotami pre urenie, +i sa pikvorka vytvorila), komentre bud uveden len pri prvej funkcii a na zaiatku kadej funkcie*/ +void vertikalneVytvoreniePiskvorky(struct hra* hra) { //funkcia kontroluje vytvorenie pikvorky vo vertiklnom smere + int i, j; + char sprava[DLZKA_HLASENIA]; //v sprve oznmim hra, ktor vyhral + + for (i = 0; i < hra->pocetPolicokX; i++) { + for (j = 0; j + 2 < hra->pocetPolicokY; j++) { + if ((hra->hraciePole[j][i] == -5 && hra->hraciePole[j + 1][i] == -5 && hra->hraciePole[j + 2][i] == -5)) { //kontrolujem, i vyhral hr . 1 + sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac1); + koniecHry(sprava); //hru ukonm + } + else if (hra->hraciePole[j][i] == -6 && hra->hraciePole[j + 1][i] == -6 && hra->hraciePole[j + 2][i] == -6) { //kontrolujem, i vyhral hr . 1 + sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac2); + koniecHry(sprava); //hru ukonm + } + } + } +} + +void horizontalneVytvoreniePiskvorky(struct hra* hra) { //funkcia kontroluje vytvorenie pikvorky vo horizontlnom smere + int i, j; + char sprava[DLZKA_HLASENIA]; + + for (i = 0; i < hra->pocetPolicokY; i++) { + for (j = 0; j + 2 < hra->pocetPolicokX; j++) { + if ((hra->hraciePole[i][j] == -5 && hra->hraciePole[i][j + 1] == -5 && hra->hraciePole[i][j + 2] == -5)) { + sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac1); + koniecHry(sprava); + } + else if (hra->hraciePole[i][j] == -6 && hra->hraciePole[i][j + 1] == -6 && hra->hraciePole[i][j + 2] == -6) { + sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac2); + koniecHry(sprava); + } + } + } +} + +void krizoveVytvoreniePiskvorkyZlava(struct hra* hra) { //funkcia kontroluje vytvorenie pikvorky krom z avej strany + int i, j; + char sprava[DLZKA_HLASENIA]; + + for (i = 0; i < hra->pocetPolicokX; i++) { + for (j = 0; j < hra->pocetPolicokY; j++) { + if ((hra->hraciePole[i][j] == -5 && hra->hraciePole[i + 1][j + 1] == -5 && hra->hraciePole[i + 2][j + 2] == -5)) { + sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac1); + koniecHry(sprava); + } + else if (hra->hraciePole[i][j] == -6 && hra->hraciePole[i + 1][j + 1] == -6 && hra->hraciePole[i + 2][j + 2] == -6) { + sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac2); + koniecHry(sprava); + } + } + } +} + +void krizoveVytvoreniePiskvorkySprava(struct hra* hra) { //funkcia kontroluje vytvorenie pikvorky krom spravej strany + int i, j; + char sprava[DLZKA_HLASENIA]; + + for (i = 0; i < hra->pocetPolicokX; i++) { + for (j = hra->pocetPolicokY - 1; j - 2 >= 0; j--) { + if ((hra->hraciePole[i + 2][j - 2] == -5 && hra->hraciePole[i + 1][j - 1] == -5 && hra->hraciePole[i][j] == -5)) { + sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac1); + koniecHry(sprava); + } + else if (hra->hraciePole[i + 2][j - 2] == -6 && hra->hraciePole[i + 1][j - 1] == -6 && hra->hraciePole[i][j] == -6) { + sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac2); + koniecHry(sprava); + } + } + } +} +//tu konia funkcie kontrolujce vytvorenie pikvorky + +void koniecHry(char* sprava) { //funkcia vykon prkazy potrebn pre ukonenie hry + //zmaem riadiace hlky + move(LINES - (2 * (LINES / 10)), 0); //nastavm kurzor na prslun riadok + clrtoeol(); //a zmaem ho + + move(LINES - (2 * (LINES / 10)) + 1, 0); //rovnako aj tu + clrtoeol(); + + mvprintw(LINES - (2 * (LINES / 10)), 10, "Koniec hry."); //hrom oznmim koniec hry + refresh(); //vyobrazm hru + napms(2000); //zobrazm koncov stav hry + abort_game(sprava); //a hru ukonm +} diff --git a/final/game.h b/final/game.h new file mode 100644 index 0000000..a7679db --- /dev/null +++ b/final/game.h @@ -0,0 +1,39 @@ +#include "world.h" + +struct hra { //vytvorm truktru riadiacu cel hru + int vyskaPolicka; + int sirkaPolicka; + + int poslednePolickoX; + int poslednePolickoY; + + int pocetPolicokX; + int pocetPolicokY; + int celkovyPocetPolicok; + + int** hraciePole; + + char hrac1; + char hrac2; + char aktualnyHrac; + char nasledujuciHrac; +}; + +//funkcia pre inicializciu hry +void* inicializaciaHry(); + +int hra(struct event* udalost, void* hra); +void vykreslenieHry(struct hra* hra); +int hernaSlucka(struct event* udalost, void* hra); + +int** dvojrozmernePole(int prvyRozmer, int druhyRozmer); + +void stavPolicka(struct hra* hra, int vstup); +void zmenaHraca(struct hra* hra); + +void vertikalneVytvoreniePiskvorky(struct hra* hra); +void horizontalneVytvoreniePiskvorky(struct hra* hra); +void krizoveVytvoreniePiskvorkyZlava(struct hra* hra); +void krizoveVytvoreniePiskvorkySprava(struct hra* hra); + +void koniecHry(char* sprava); diff --git a/final/hra b/final/hra new file mode 100755 index 0000000000000000000000000000000000000000..04e8d3de1f95829dd2eb80e05773382d95bdf0cb GIT binary patch literal 24553 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 J*G<09`+wSr8=wFH literal 0 HcmV?d00001 diff --git a/final/main.c b/final/main.c new file mode 100644 index 0000000..3aed949 --- /dev/null +++ b/final/main.c @@ -0,0 +1,7 @@ +#include "game.h" +#include "world.h" + +int main(int argc, char** argv){ + start_world(inicializaciaHry,hernaSlucka,free); + return 0; +} \ No newline at end of file diff --git a/final/world.c b/final/world.c new file mode 100644 index 0000000..679faa2 --- /dev/null +++ b/final/world.c @@ -0,0 +1,182 @@ +#include "world.h" +#include +#include +#include +#include +#include + +int TIMEOUT; + +void abort_game(const char* message){ + endwin(); + puts(message); + exit(1); +} + +void check_bounds(const char* source,int x, int y){ + char msg[200]; + if (x < 0 || x >= COLS){ + sprintf(msg,"%s:: width %d is out of bounds (0,%d)",source,x,COLS); + abort_game(msg); + } + if (y < 0 || y >= LINES){ + sprintf(msg,"%s:: height %d is out of bounds (0,%d)",source,y,LINES); + abort_game(msg); + } +} + +void clear_screen(){ + // Clear screen + mvaddch(0,0,' '); + int screenchars = LINES*COLS; + for (int j = 1; j < screenchars;j++ ){ + addch(' '); + } +} + +void game_speed(int value){ + if (value < 0){ + abort_game("world_seed:: cannot be negative\n"); + } + TIMEOUT =value; +} + +void set_message(const char* message,int x,int y) { + int l = strlen(message); + for (int i = 0; i < l; i++){ + check_bounds("set_message",x+i,y); + set_cell(message[i],x+i,y); + } +} + +void assert_message(int event,const char* message){ + if (event == 0){ + abort_game(message); + } +} + + +void set_cell(int character,int x,int y) { + check_bounds("set_cell",x,y); + set_color_cell(character,x,y,COLOR_WHITE,COLOR_BLACK); +} + +void set_color_cell(int character,int x,int y,short front_color,short back_color){ + check_bounds("set_color_cell",x,y); + if (has_colors()){ + int pair = COLOR_COUNT * front_color + back_color; + attron(COLOR_PAIR(pair)); + mvaddch(y,x,character); + attroff(COLOR_PAIR(pair)); + } + else{ + mvaddch(y,x,character); + } +} + +int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void*)){ + srand(time(NULL)); + int r = 1; + // Speed global variable + TIMEOUT = 100; + if (initscr() == NULL){ + // TODO Which Error? + puts("Curses Error."); + return -1; + } + + curs_set(FALSE); // Neviditeľný kurzor + if (has_colors()){ // Zistenie či terminál podporuje farby + start_color(); + for (int i = 0; i < COLOR_COUNT;i++){ + for (int j = 0; j < COLOR_COUNT;j++){ + init_pair(i * COLOR_COUNT + j, i,j); + } + } + } + else { + puts("No colors!\n"); + } + void* game = NULL; + if (init_game != NULL){ + game = init_game(); + assert_message(game != NULL,"init_game:: should return non null pointer"); + } + timeout(TIMEOUT); + // Initial step + struct event event; + memset(&event,0,sizeof(struct event)); + event.height = LINES; + event.width = COLS; + event.type = EVENT_START; + clock_t start_time = clock(); + clock_t last_timeout = start_time; + clock_t next_timeout = last_timeout + TIMEOUT; + event.time_ms = start_time; + // Start event + r = world_event(&event,game); + refresh(); + while (!r) { + memset(&event,0,sizeof(struct event)); + event.height = LINES; + event.width = COLS; + + //začiatok upravenej časti programu + //upravená časť programu načítava číselný vstup od používateľa + char buff[4]; + const int VELKOST_BUFF = 4; + memset(buff, '\0', VELKOST_BUFF); + int i = 0; + + while (true) { + int buff_char = (char) getchar(); + + //zadaný vstup vyobrazujem + if (i > 0 && buff_char == 127) { + buff[i - 1] = '\0'; + i -= 2; + mvprintw(LINES - (2 * (LINES / 10)) + 1, 10 + 1 + strlen("Zadajte cislo neobsadeneho policka: "), " "); + mvprintw(LINES - (2 * (LINES / 10)) + 1, 10 + 1 + strlen("Zadajte cislo neobsadeneho policka: "), "%s", buff); //po zmazaní znaku sa odstráni aj z obrazovky + } + else if (buff_char >= '0' && buff_char <= '9') { + buff[i] = buff_char; + mvprintw(LINES - (2 * (LINES / 10)) + 1, 10 + 1 + strlen("Zadajte cislo neobsadeneho policka: "), "%s", buff); + } + i++; + refresh(); + + if (i == VELKOST_BUFF) break; + else if (buff_char == '\r') break; + } + + event.key = atoi(buff); + //začiatok upravenej časti programu + + // Draw new world + event.time_ms = clock(); + r = world_event(&event,game); + refresh(); + event.time_ms = clock(); + // set new timeout + int nt = next_timeout - event.time_ms; + //printf("%d\n",nt); + if (nt > 0){ + timeout(nt); + } + else { + timeout(TIMEOUT); + next_timeout = event.time_ms + TIMEOUT; + } + } + memset(&event,0,sizeof(struct event)); + event.height = LINES; + event.width = COLS; + event.type = EVENT_END; + event.time_ms = clock(); + world_event(&event,game); + if (destroy_game != NULL){ + destroy_game(game); + } + endwin(); + return r; +}; diff --git a/final/world.h b/final/world.h new file mode 100644 index 0000000..95a0242 --- /dev/null +++ b/final/world.h @@ -0,0 +1,123 @@ +#ifndef _WORLD_H_ +#define _WORLD_H_ + +#include +#include +#include +#include +#include +#include + +/** + * World represented as a rectangular matrix of colorful characters. + * + * Point [0,0] is displayed the upper left corner of the screen. + * + */ + +enum event_type { + EVENT_START, + EVENT_TIMEOUT, + EVENT_KEY, + EVENT_MOUSE, + EVENT_RESIZE, + EVENT_ESC, + EVENT_END, +}; + +struct event { + /** + * Last width of the screen. + */ + int width; + /** + * Last height of the screen. + */ + int height; + /** + * Last pressed key or Curses event. + * + * Special event values: + * ERR if timeout, + * KEY_RESIZE if screen resize + * KEY_EVENT, other event, + * KEY_MOUSE, mouse clicked + * + * Key values: + * + * ' ' Space + * KEY_DOWN Arrow down + * KEY_UP Arrow up + * KEY_LEFT Arrow left + * KEY_RIGHT Arrow right + * KEY_A1 Upper left of keypad + * KEY_A3 Upper right of keypad + * KEY_B2 Center of keypad + * KEY_C1 Lower left of keypad + * KEY_C3 Lower right of keypad + * + * KEY_ENTER + * KEY_BACKSPACE + */ + int key; + int alt_key; + enum event_type type; + int mouse_x; + int mouse_y; + int mouse_left; + int mouse_right; + int mouse_middle; + long int time_ms; +}; + +void abort_game(const char* message); + +/** + * Sets cell to a state. + * @param event + * @param x coordinate of cell + * @param y coordinate of cell + * @param new state of the cell + */ +void set_cell(int character,int x,int y); + +/** + * COLOR_BLACK 0 + * COLOR_RED 1 + * COLOR_GREEN 2 + * COLOR_YELLOW 3 + * COLOR_BLUE 4 + * COLOR_MAGENTA 5 + * COLOR_CYAN 6 + * COLOR_WHITE 7 + */ + +#define COLOR_COUNT 8 + +void set_color_cell(int character,int x,int y,short front_color,short back_color); +void check_bounds(const char* source,int x, int y); +void game_speed(int value); +void set_message(const char* message,int x,int y); +void assert_message(int event,const char* message); + +/** + * + * @param event + * @param number of commandline arguments + * @param init_world + * @param destroy_world + * + * void init_world(struct event* w); + * Initializes user state. + * Free user state. + * @param event + */ + +int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void* game)); + +void game_speed(int value); + +void set_message(const char* message,int x,int y); +void clear_screen(); + +#endif