From 224bb7d22a3078e5ab926e164ed629061ee8ce7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Frankovi=C4=8D?= Date: Fri, 8 May 2026 14:17:41 +0200 Subject: [PATCH] Revert "taj" This reverts commit 733d099ceb3aa5724d8aba15757c447f89ec6332. --- a3/checkcheck.txt | 151 ------------------- a3/game.c | 219 --------------------------- a3/game.h | 36 ----- a3/program | Bin 21616 -> 0 bytes a3/program.c | 16 -- a3/snake.c | 100 ------------- a3/snake.h | 112 -------------- a3/test_logic | Bin 16344 -> 0 bytes a3/test_snake | Bin 16344 -> 0 bytes a3/test_snake.c | 73 --------- a5.2/Makefile | 14 -- a5.2/game | Bin 32368 -> 0 bytes a5.2/game.c | 218 --------------------------- a5.2/game.h | 26 ---- a5.2/game.o | Bin 12816 -> 0 bytes a5.2/main.c | 8 - a5.2/main.o | Bin 5272 -> 0 bytes a5.2/world.c | 198 ------------------------- a5.2/world.h | 113 -------------- a5.2/world.o | Bin 17408 -> 0 bytes a5/Makefile | 4 +- a5/game.c | 320 +++++++++++++++------------------------- a5/game.h | 36 +++-- a5/main.c | 5 +- du4/snake0.c | 104 ------------- du4/snake0.h | 112 -------------- du4/test_snake | Bin 16344 -> 0 bytes du4/test_snake.c | 73 --------- du5/program | Bin 16424 -> 0 bytes du6/a_station.h | 92 ------------ du6/station.o | Bin 3448 -> 0 bytes du6/test_station | Bin 16544 -> 0 bytes du6/test_station.c | 64 -------- master.zip | Bin 7522 -> 0 bytes world-master/.gitignore | 54 ------- world-master/LICENSE | 29 ---- world-master/Makefile | 14 -- world-master/README.md | 78 ---------- world-master/game.c | 106 ------------- world-master/game.h | 30 ---- world-master/main.c | 9 -- world-master/world.c | 198 ------------------------- world-master/world.h | 113 -------------- 43 files changed, 148 insertions(+), 2577 deletions(-) delete mode 100644 a3/checkcheck.txt delete mode 100644 a3/game.c delete mode 100644 a3/game.h delete mode 100755 a3/program delete mode 100644 a3/program.c delete mode 100644 a3/snake.c delete mode 100644 a3/snake.h delete mode 100755 a3/test_logic delete mode 100755 a3/test_snake delete mode 100644 a3/test_snake.c delete mode 100644 a5.2/Makefile delete mode 100755 a5.2/game delete mode 100644 a5.2/game.c delete mode 100644 a5.2/game.h delete mode 100644 a5.2/game.o delete mode 100644 a5.2/main.c delete mode 100644 a5.2/main.o delete mode 100644 a5.2/world.c delete mode 100644 a5.2/world.h delete mode 100644 a5.2/world.o delete mode 100644 du4/snake0.c delete mode 100644 du4/snake0.h delete mode 100755 du4/test_snake delete mode 100644 du4/test_snake.c delete mode 100755 du5/program delete mode 100644 du6/a_station.h delete mode 100644 du6/station.o delete mode 100755 du6/test_station delete mode 100644 du6/test_station.c delete mode 100644 master.zip delete mode 100644 world-master/.gitignore delete mode 100644 world-master/LICENSE delete mode 100644 world-master/Makefile delete mode 100644 world-master/README.md delete mode 100644 world-master/game.c delete mode 100644 world-master/game.h delete mode 100644 world-master/main.c delete mode 100644 world-master/world.c delete mode 100644 world-master/world.h diff --git a/a3/checkcheck.txt b/a3/checkcheck.txt deleted file mode 100644 index 86684d5..0000000 --- a/a3/checkcheck.txt +++ /dev/null @@ -1,151 +0,0 @@ -# ODOVZDANIE PROJEKTU: SNAKE GAME - -## Umiestnenie projektu -``` -/home/kubo/pvjc26/a3/ -``` - -## Spustenie hry -```bash -cd /home/kubo/pvjc26/a3/ -./program -``` - ---- - -## Čo bolo implementované - -### ✓ Herné požiadavky (podľa zadania) -1. **Svet (hracie pole)** - - Viditeľná oblasť obrazovky s hranicami - - Dynamické rozmery podľa veľkosti terminálu - -2. **Odmeny** - - 20 odmien (`*`) náhodne rozhádzaných po svete - - Zjedené odmeny označené súradnicami [-1, -1] - - Detekcia kedy sú všetky zjedené → víťazstvo - -3. **Had** - - Telo z `x` znakov - - Počiatok: 5 segmentov v strede obrazovky - - Reprezentácia: Spojový zoznam (linked list) - - Rast pri zjedení odmeny - -4. **Pohyb hada** - - Vektor rýchlosti [sx, sy] - - Zmena podľa šípiek: - - ↑ = [0, -1] - - ↓ = [0, 1] - - ← = [-1, 0] - - → = [1, 0] - - Bezpečnosť: Zákaz otočenia na 180° - -5. **Logika hry - konečné stavy** - - Zrážka so stenou → END_WALL - - Zrážka so sebou samým → END_SNAKE - - Všetky odmeny zjedené → END_FOOD (víťazstvo) - - Pokračovanie → END_CONTINUE - -### ✓ Technické implementácie -- Ncurses knižnica na grafiku v terminálu -- Herný loop s reálnym časom -- Detekcia vstupov v reálnom čase -- Spracovanie signálov bezpečne -- Čistá pamäť bez curiek - ---- - -## Súbory projektu - -### Jadrové súbory hry -- `snake.h` - Datové štruktúry, API -- `snake.c` - Logika hada (103 riadkov) - - `add_snake()` - Pridanie segmentu - - `remove_snake()` - Odstránenie chvosta - - `is_snake()` - Detekcia kolízie - - `step_state()` - Hlavná logika hry ⭐ - -### GUI a program -- `game.h` - Rozhranie hry (36 riadkov) -- `game.c` - GUI s ncurses (219 riadkov) - - `init_game()` - Inicializácia - - `render_game()` - Vykreslenie - - `handle_input()` - Vstup - - `run_game()` - Herný loop ⭐ -- `program.c` - Hlavný program (16 riadkov) - -### Dokumentácia a testovanie -- `README.md` - Dokumentácia projektu -- `PREZENTACIA.md` - Detailná prezentácia -- `test_snake.c` - Unit testy -- `validate.sh` - Validačný skript -- `program` - Skompilovaný spustiteľný súbor (22 KB) - ---- - -## Kompilácia - -```bash -gcc -o program program.c game.c snake.c -lncurses -Wall -``` - -**Závislosť:** `libncurses-dev` (už nainštalovaná) - ---- - -## Ovládanie hry - -| Klávesa | Akcia | -|---------|-------| -| ↑↓←→ | Pohyb hada | -| q | Ukončenie hry | - ---- - -## Testy - -Všetky testy úspešne prešli: -```bash -./test_logic -``` - -Výsledky: -- ✓ Adding snake parts -- ✓ Checking if coordinates are part of snake -- ✓ Counting snake parts -- ✓ Removing snake tail -- ✓ Testing game state -- ✓ Testing wall collision - ---- - -## Validácia projektu - -```bash -./validate.sh -``` - -Všetky kontroly prešli: -- ✓ 6/6 súborov -- ✓ FOOD_COUNT = 20 -- ✓ Bez chýb kompilácie -- ✓ Spustiteľný súbor -- ✓ Všetky testy prešli -- ✓ Všetky funkcie implementované -- ✓ Všetky datové štruktúry prítomné - ---- - -## Poznámky pre cvičiaceho - -1. **Spustenie:** `./program` -2. **Koniec:** Stlačiť 'q' alebo hra skončí pri zrážke/víťazstve -3. **Zdrojový kód:** Všetky súbory .c a .h v adresári -4. **Testovanie:** `./test_logic` pre overenie logiky - -Projekt je **úplný** a **testovaný**. Pripravený na prezentáciu! 🎮 - ---- - -**Vytvorené:** 8. máj 2026 -**Umiestnenie:** `/home/kubo/pvjc26/a3/snake/` diff --git a/a3/game.c b/a3/game.c deleted file mode 100644 index f16712b..0000000 --- a/a3/game.c +++ /dev/null @@ -1,219 +0,0 @@ -#include -#include -#include -#include -#include -#include "game.h" -#include "snake.h" - -#define GAME_SPEED 100000 // microseconds between steps - -struct state* init_game() { - struct state* state = (struct state*)malloc(sizeof(struct state)); - if (state == NULL) { - return NULL; - } - - // Get screen dimensions - int max_x, max_y; - getmaxyx(stdscr, max_y, max_x); - - state->width = max_x - 2; - state->height = max_y - 3; - - // Initialize snake in the center - state->snake = NULL; - int center_x = state->width / 2; - int center_y = state->height / 2; - - // Add 5 initial snake parts (head is added last) - state->snake = add_snake(state->snake, center_x, center_y); - state->snake = add_snake(state->snake, center_x, center_y + 1); - state->snake = add_snake(state->snake, center_x, center_y + 2); - state->snake = add_snake(state->snake, center_x, center_y + 3); - state->snake = add_snake(state->snake, center_x, center_y + 4); - - // Initialize velocity - state->sx = 1; // Moving right - state->sy = 0; - - // Initialize food randomly - srand((unsigned int)time(NULL)); - for (int i = 0; i < FOOD_COUNT; i++) { - state->foodx[i] = rand() % state->width; - state->foody[i] = rand() % state->height; - } - - return state; -} - -void render_game(struct state* state) { - if (state == NULL) { - return; - } - - // Clear the screen - clear(); - - // Draw border - for (int x = 0; x < state->width + 2; x++) { - mvaddch(0, x, '+'); - mvaddch(state->height + 1, x, '+'); - } - for (int y = 0; y < state->height + 2; y++) { - mvaddch(y, 0, '+'); - mvaddch(y, state->width + 1, '+'); - } - - // Draw food - for (int i = 0; i < FOOD_COUNT; i++) { - if (state->foodx[i] >= 0 && state->foody[i] >= 0) { - mvaddch(state->foody[i] + 1, state->foodx[i] + 1, '*'); - } - } - - // Draw snake - struct snake* current = state->snake; - while (current != NULL) { - if (current->x >= 0 && current->x < state->width && - current->y >= 0 && current->y < state->height) { - mvaddch(current->y + 1, current->x + 1, 'x'); - } - current = current->next; - } - - // Draw info line - int food_count = 0; - for (int i = 0; i < FOOD_COUNT; i++) { - if (state->foodx[i] >= 0 && state->foody[i] >= 0) { - food_count++; - } - } - - int snake_length = 0; - current = state->snake; - while (current != NULL) { - snake_length++; - current = current->next; - } - - mvprintw(state->height + 2, 0, "Food: %d Snake Length: %d Speed: (%d, %d)", - food_count, snake_length, state->sx, state->sy); - - refresh(); -} - -int handle_input(struct state* state) { - int ch = getch(); - - if (ch == ERR) { - return 0; // No input - } - - switch (ch) { - case 'q': - case 'Q': - return 1; // Quit - case KEY_UP: - if (state->sy == 0) { // Don't allow reversing - state->sx = 0; - state->sy = -1; - } - break; - case KEY_DOWN: - if (state->sy == 0) { // Don't allow reversing - state->sx = 0; - state->sy = 1; - } - break; - case KEY_LEFT: - if (state->sx == 0) { // Don't allow reversing - state->sx = -1; - state->sy = 0; - } - break; - case KEY_RIGHT: - if (state->sx == 0) { // Don't allow reversing - state->sx = 1; - state->sy = 0; - } - break; - } - - return 0; -} - -void cleanup_game(struct state* state) { - if (state != NULL) { - free_snake(state->snake); - free(state); - } -} - -void run_game() { - // Initialize ncurses - initscr(); - cbreak(); - noecho(); - keypad(stdscr, TRUE); - nodelay(stdscr, TRUE); - curs_set(0); // Hide cursor - - struct state* game = init_game(); - if (game == NULL) { - endwin(); - return; - } - - int game_over = 0; - int end_reason = 0; - - while (!game_over) { - // Handle input - if (handle_input(game)) { - break; // User quit - } - - // Update game state - end_reason = step_state(game); - if (end_reason != END_CONTINUE) { - game_over = 1; - } - - // Render - render_game(game); - - // Delay - usleep(GAME_SPEED); - } - - // Show end game message - if (game_over) { - const char* message = ""; - switch (end_reason) { - case END_WALL: - message = "GAME OVER: Hit wall! Press any key to exit..."; - break; - case END_SNAKE: - message = "GAME OVER: Snake bit itself! Press any key to exit..."; - break; - case END_FOOD: - message = "VICTORY: All food eaten! Press any key to exit..."; - break; - case END_USER: - message = "Game ended. Press any key to exit..."; - break; - default: - message = "Game ended. Press any key to exit..."; - } - - mvprintw(game->height / 2, 5, "%s", message); - refresh(); - nodelay(stdscr, FALSE); - getch(); - } - - // Cleanup - cleanup_game(game); - endwin(); -} diff --git a/a3/game.h b/a3/game.h deleted file mode 100644 index 90172ae..0000000 --- a/a3/game.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef GAME_H_INCLUDED -#define GAME_H_INCLUDED - -#include "snake.h" - -/** - * Initialize the game state - * @return initialized game state - */ -struct state* init_game(); - -/** - * Render the current game state to the screen - * @param state the game state to render - */ -void render_game(struct state* state); - -/** - * Handle input and update game state - * @param state the game state to update - * @return 0 if game should continue, non-zero if should exit - */ -int handle_input(struct state* state); - -/** - * Clean up and free game resources - * @param state the game state to free - */ -void cleanup_game(struct state* state); - -/** - * Run the main game loop - */ -void run_game(); - -#endif // GAME_H_INCLUDED diff --git a/a3/program b/a3/program deleted file mode 100755 index 04dd1d4a731623acdd7464870654723a6f97487f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21616 zcmeHPdvF}ZneWxZ7RFc$Hek%d3)o;|yvXt+7GRJcYp;W4E4GC%5VEYaBWcUhuDm;o zWC|Mv*@4ZXLxejLa=Da`svKNF-5D2^GF+7{3}@jafK63Ec@aSbw~KT{5G5#Jy!ZRM z``ewJXq>Cm{c%;dt=jqe`+bk@`MRfjrZv;|`!=mFak&JiQgMqQ&NEXXwOVj+lg@zD zik0F#9OsHF#1!yl5>xV8MIcpau%wVyXuK4Z>}FGD5_*|}1yimeQL=MNW9KRfQ{h%T z*_BgP^LDyX<4jqeE3ZoV5jHxm>(A6`N3luYtnAV{eoPl=JHMuEN8uv732ir_?U=fC zJehJlDJJw=sr}iht=htF*Q)L8bRB$BVoGID+V;K~`fJLo*LK}Ylpj0Yr(nU9%liuK zC@%lgq?=Q0)#W+0gT4Q8Kf9qV+_+-d4Q-*tZQ)3wYjM}g6^mCa^TwmzYFP!Umj^%U zQyVrn2sBGSVceW0-HK;_B%7t>r2o{H+orsGU)LjLH!S>UbnKZOvy8Q)q(k*48`7af z{&bT|p7L}}kdBJSH(a7yVSvQoqK7X#WxU=_`N`5#056zC@QMTeD+ip)_uywwKLRkB z|Dz80T@Ls@2i$bP?{mQG9PmdS@SP6$zd7I^IpCKA_uyww+W|}#pA!!F6At*#9PpF_ zzTN@99=HcTdkO)Vte$T;;JANB$~_*bae>+v@@$BWARO zIUnCOX@r_ZT7^37hezm}qK@8Nr<* zZia}9L_ixSjYa4Lh7--2`ONLFvb(LlNMHx_(a4i(~V z3$AbBq_ow7Pq*lISn%^Kc$WpAVZpmCc%=n@$bz45!TT(@bsYSz1=n3fS{<<9G|zK- z+JaxmAm~90evt(~Y{6$+@O}$^i3NYvg3qzwCoTA;7QC1(MxYphVgxt>zpuRFGk?!$ zg+EpP^IL`R@9#HDvM2pLuT;D&RkF)JyhVuY{81b$=hh0+ZzW0Qy=*qy+$VXOa58V^ zd75Z4$MQT)keNeyo+if3lX;#dpv<@PJWV{A2l6~kIGI?Ur->%hnCEGN$!yK@G_hpX zQV^<1e!DGi>}68-M2J!t?o~jsM8Te_-R^vGH%&_}6XxaT|Zc#{Z~* zU-DlYlc&D!Prm2x86K)sN9i*$W?o>Uguaa_&B`xPW?By#U1DTYiX0 z&4hU&F0Fegk4x*E>`>+0Zqj>MQ|Kq9{_+QiEIi{+j`?5u=vMzr6QzFFasR0^<}5hy zX$KYAA=MAqp02;{Rd+!w5{nxAJ*%#wtUvj_Io+RHbq$#G3twcj=@5GJ@$%*1U3bAY zS3cQiIw7P?1ME=qG2AftlLP5~7=rziW}j2+^vjg=NyWM~`xw}xbm6C;K*v3dj7YzO z3mFckYLyPCNWon%=Su4t^&BNEeKoB7N#BIOXU~L4Op|(7m9x#JmvfY$f#_po0O8rUixsZ>*T44q;HHA zQr)C#LC2+8N~9XbQ*~p>*C{5)F&6n#4HN!kNy<0gTkm2WR`{V!p~SAR&!$jnS7@>+ zl-U*5oC)FBGQ6Q7<* zo+8^+!?3^U&E%%Oiu5q_l?DaHrs3~7HjA`+e8aAuJ;O8i{wrCZu(oQIKe=ZRZ8<0^ z_btNsk2ZU*1_V_}eoj>xf?F{X0saK=RKw5_0!Y3PMfXf(WxwA8*^xzB;E{Fm4XTFf z^&|G>UsJ}aaefESY`NBI`2h)hL)2KXrgQG;ch&fY_I7hjI^fGqzUqcwq>3nqKd?Cb zWTmAle-A<4nd}DTr=S3HWf`(q9=2NEDXTK9t3tt*RT-}Q+k0^p4*1ek`pA9Kc|#h_ zky_VRvA@5oIge2IHCmrX2~quVFjWV`6aJo;p!QIO3e-|mLRIa=XZa{yPF1@OCCcla z1imzyG(A&QhrIh!5c(!E50Vyj5`o(6k~z05UBLQP z`kG1AmZ^$;?@L^CD|RgeWb9AXR#08!7*V-DA_F!GB{AR|BQjDYOKcd+ z$8Am?vBa&c$2aQg@r~hJ$7b&R@qllf%t=+B?ufg`H?A*kOQDI3bk|4Mn9LodYft9n z=+WC%lByfWa76c1TURGPUY&e3`4Yy!%kXgTPacz<{4kZ3F8LEqs^=BNu>3nKNH~x_ zI+4wexcUk%Bo8hm8u8*<=O*YReW!c&oX+wnS&M7`8+%TdgH-ODfNy3Vp_LObWm0lT zNhI^gR3)LM7;_a=C{y{!$4aGy&^v%qrt*6V#3S#a?%vC2dFNGcYoot@ZF}+Ea#?wD$v$lpxj{!^H z_9+f;A%`|Qx(uCI77mL~6!wf2^8!=D^g85Jzjzl7oa^L?Y3Uo`FjEIFdTbc*$sRwl zhO6=h26M#bM&=(yHIu&4o;{<&oC+g-_L#B;(s$rWI(p!nE|H!Ix46)Sc^Dy}Oy$0} zDNMcP|2PW-b0Qp+nH%VM|7ILZO)nkqUxTB|tiZ9vtQ=VegAQ$g2Iwt+jG6ghjxaMD zOoo|r!Td@yRB8LfI{<+ypW>E>%`* zm2;#DS`q3O<1Qne22jx6@)}DfhLa6LN8KnX{WzKMK$Dn)`lLs$mQ`&SPSU7{sd6YO z$2W8i4AaSaJVDu}KLpM9=Y542O8(Y>?orim)UY(oXTjLRUTsFd9yXu6atEX7?K3#GVT=Sc$Gm1wJpq)AvnN)nbwqj=AE{OSt%f}7!EJ3`Q=?WtZ>ZZr@*_=8(CPr)#LKmV z+-d>9Vk$826Y_554{9Fwq3 zLs<0H88*TSZ*UrI&1bc{edF5gTeg1nM$c+KA0ucQk+a%R1u1|YyijU{yw25{9~Z7m zOK+kjaeBqzz&mOo&@+_H4uP)%ogn<(Z1w#y=X!wJ;o8sx>gskA~W=Ha&tzoB1ev)#}WGu-QE%>Huaxt$f=;?_Ae*DalQ6;Nsa zHPDs6LD>Z8M1D>Ds(^Qpy-xU7v3MB2T{!0mVZIseZ{^vm0rxD<`ilW%(%JAAFF_ng#YdbN17LfAXK%>~iSk?Av7V(*O04 zPesiCy}g%b1h?U0qHH)tqLS0wlSFn@D$vquRo(Q^L22=7eFB>yLm9Dkd^-x<+;DkYZx z;Y>D4{6V^BMdELAo~C!9ku(v5TF&3jd`s7lznPh>)P?n16N0pvsMw+u^liUbV7vdv ztA#S*btRcz)gSLLKBg6oVY7*Zy; zrXEeJG_BRNUemiZ?a;Ja(>_h@=kb?#{;qAq+O>GnZfHzI%!FsjQtwi4)#4Qi$yV>J zUgoV@wot=o_ekBcOnjWRYf(ROLGrL}XpdH)SL7$tr+!o-+@hWoEXjjB;oUYI@BB!d zuX8rph>QzY;evXF=*vblNc^JQ_kXN^A2Q@W_h76A4@vzC1z+c^{}eKl)&DsM{ICP= z6o-E3yHJ@iIzd~StlZb3;}RDOd%vc4yo8u3_`7?_;_xAUE-^bdJ}?e&((i!hN!%^o zzFcX_XH{euJLuoyfZqw+lPfHrnT7u05g1ihfmlAw|>9J zeqMCI-*&*qwf|NVCJ*Qw?ovhq>5_gM5+K+sOho2i9^y>&OIbZNR z!}Z_hpx>eW*XwqXYYZ^jTH2zG!L~rijN(iFV4_PjMcX^t3=`|RRg-Jb2m9dw*35&u14hJ* z?Z$WiSPTw?67B7~VPfF|w2450YDX;E0&P^Og;wC3gj!^$Jp$Hm#gccxw|O1yaIo&H zn^)IuTniW*g#>(lE%mS4DgqleZCSH=Q((*b_1k>g1KU@x+2jlG#ssywZ2%_uvOkQy z3TRDVZd6dqTLaL30DrbaK~9Q|1J1TH18;zE)^hPbfl!-)U|^R7xl=;UJC&_AXUID! z*o;7J$>1QwJ`o+XtAdFgB8*Vb4DyZ+R(;DB3A8_hj)2#Y+}8OgjL0|OG3<` z|C4BMdanovRo-vHL9BL`$O|WFIJMivSykkY5(RNZ_eMz6t`lhB!W}dMp?EZ)+C|W= z7m-9qfO=$Z&y0Lw1?>^oxCI_V;Yc76H$rl=i-JOBhnJ4jz8QHplbn{?9;3iMmWZf& z;L-{S?B<~(90)YV(R=BiSlCsAHu0eF=e-wHQtblbAPfYswFqBkwCBjA8;Pi`LL6OK z_w6XCzr5l_jQ%kcQzxRf0x3`u-uUizGuQ}f#uRPk9QG?QVjaR8iJFGDC6e%B#ON?$ z=57nrm^|nNHCT=tduW59Fr2!DyQF+OEjaEJ6wT9r0Ipsr*eaeFKC@R<y6qTC3#W#^ilb>6w`{n#SINHr6F--0vDD=}(W~*JXJNKqiFt?;Q+>OkKpges zYmUcPJO%dl{kG=iG*t%ESwW)b7;E|b9L3aApiR#tg=q&^d}QD9L`fFJ9B117{`!TJ+l-EPJe75KF|Bkj_qaE`43R7N> zA$zj1+y4_ViV6GA-7o3;CSG@ficI$Q|2|Nwy+_+I?Y0G+Z^xKEWwSq^*Bh9!o+>?m zJIDAzoBcs;&(!+AVDiCsOkc3s^L;bZOL$?9jFH$*aq6R3>-qC@6;qq}pItxy0Y_xd z?a$8_OzrXG_T%zjv)S`=IMaQssHwgEerdC>s8)(hM{VtAFaLe0&%jS#wz+i--XG7d z&pgwQVOwdj=k?4nec`blRAgeF=@&q$?{fLPKEeAPx^-ab`lG~l+>Xxxqf=yiUeBz+ z<`tAC6v-Xgp6L`ATkUhtrM1e0%V7s>$NY2{6UOE9bC|nUY1r*O3eFwR*X38`5S3y3 zMK+x3O36xdeNTzxv9?w*JdV=iKRpU^{dxSM^*64&vQWqLdPSeLbvQ1Ub?I`Q%>M6g MQyOz@1~yjwH$gkOmjD0& diff --git a/a3/program.c b/a3/program.c deleted file mode 100644 index 122f567..0000000 --- a/a3/program.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include -#include "game.h" - -int main() { - printf("Starting Snake Game...\n"); - printf("Use arrow keys to move the snake.\n"); - printf("Press 'q' to quit.\n"); - printf("Eat all food (*) to win!\n\n"); - sleep(2); - - run_game(); - - printf("Thanks for playing!\n"); - return 0; -} diff --git a/a3/snake.c b/a3/snake.c deleted file mode 100644 index 62b4c81..0000000 --- a/a3/snake.c +++ /dev/null @@ -1,100 +0,0 @@ -#include -#include "snake.h" - -struct snake* add_snake(struct snake* snake, int x, int y) { - struct snake* new_part = (struct snake*)malloc(sizeof(struct snake)); - if (new_part == NULL) { - return snake; - } - new_part->x = x; - new_part->y = y; - new_part->next = snake; - - return new_part; -} - -struct snake* remove_snake(struct snake* snake) { - if (snake == NULL) { - return NULL; - } - if (snake->next == NULL) { - free(snake); - return NULL; - } - - struct snake* current = snake; - while (current->next->next != NULL) { - current = current->next; - } - - free(current->next); - current->next = NULL; - - return snake; -} - -int is_snake(struct snake* snake, int x, int y) { - struct snake* current = snake; - while (current != NULL) { - if (current->x == x && current->y == y) { - return 1; - } - current = current->next; - } - return 0; -} - -void free_snake(struct snake* sn) { - while (sn != NULL) { - struct snake* temp = sn; - sn = sn->next; - free(temp); - } -} - -int step_state(struct state* state) { - if (state == NULL || state->snake == NULL) { - return END_USER; - } - - int new_x = state->snake->x + state->sx; - int new_y = state->snake->y + state->sy; - - if (new_x < 0 || new_x >= state->width || new_y < 0 || new_y >= state->height) { - return END_WALL; - } - - // Check if new position is on snake's body - if (is_snake(state->snake, new_x, new_y)) { - return END_SNAKE; - } - - // Find food at new position - int food_index = -1; - int items_left = 0; - - for (int i = 0; i < FOOD_COUNT; i++) { - if (state->foodx[i] == new_x && state->foody[i] == new_y) { - food_index = i; - } else if (state->foodx[i] >= 0 && state->foody[i] >= 0) { - items_left++; - } - } - - if (food_index >= 0) { - // Food found - mark as eaten and grow snake - state->foodx[food_index] = -1; - state->foody[food_index] = -1; - state->snake = add_snake(state->snake, new_x, new_y); - - if (items_left == 0) { - return END_FOOD; - } - return END_CONTINUE; - } else { - // No food - normal movement (remove tail and add head) - state->snake = remove_snake(state->snake); - state->snake = add_snake(state->snake, new_x, new_y); - return END_CONTINUE; - } -} \ No newline at end of file diff --git a/a3/snake.h b/a3/snake.h deleted file mode 100644 index a546cc7..0000000 --- a/a3/snake.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef snake_h_INCLUDED -#define snake_h_INCLUDED - -// Number of food items on the plane -#define FOOD_COUNT 20 - -/** - * One part of the snake; - * - * The snake is a linked list; - */ - -struct snake { - // x position of the snake part - int x; - // y position of the snake part - int y; - // Pointer to the next snake part. - // The last part of the snake has NULL pointer to the next part. - struct snake* next; -}; - -// End game reason constants, return value of step_state -enum endgame { - // Continue the game - END_CONTINUE = 0, - // Snake hit a wall - END_WALL, - // Snake hit itself - END_SNAKE, - // No food left - END_FOOD, - // Other reason to end - END_USER -}; - -/** - * State of the game. - * - * The state consists of the snake, its speed and food on the plane. - * - * The snake is a linked list of snake parts. - * - * Speed vector is a vector added to the last head position to create a new head. - * - * Food are points on the plane. Food with negative coordinates meads food is already eaten. - */ - -struct state { - // Snake as a linked list - struct snake* snake; - // X of the food positions - int foodx[FOOD_COUNT]; - // Y of the food positions - int foody[FOOD_COUNT]; - int sx; - int sy; - int width; - int height; -}; - -/** - * Add a new snake part with given position. The new snake part becomes the new head. - * - * @param head of the snake. - * @param x coordinate of the new head; - * @param y coordinate of the new head. - * @return new head of the snake. - */ -struct snake* add_snake(struct snake* snake,int x,int y); - -/** - * Remove the last snake part. - * The last snake part should always have NULL next pointer. - * - * @param head of the snake. - * @return new head of the snake. - */ -struct snake* remove_snake(struct snake* snake); - -/** - * Finds out if given coordinates are part of the snake. - * @param snake - * @param x coordinate to search in snake - * @param y coordinate to search in snake - * @return True, if there is a snake part with coordinates x,y. False otherwise - * - */ -int is_snake(struct snake* snake,int x, int y); -/** - * Remove and free each snake part; - * @param head of the snake. - */ -void free_snake(struct snake* sn); -/** - * Change game state. - * - * The function shoud calculate new posision of the snake head - * from the current position and speed vector. - * Then it should modify snake parst or food coordinates according to the rules: - * - * - If the new position is on the snake, end the game, return END_SNAKE. - * - If the new position is on the food, mark food as eaten - * (set its coordinates to -1) and add new snake part on the position of the food. If there is no food left, return END_FOOD. else return END_CONTINUE. - * - If the new position is on the plane, add new snake part on the new position and remove the last part of the snake, return END_CONTINUE. - * - * @param current state of the game - * @return reason to end the game according to enum endgame. - */ -int step_state(struct state* state); - -#endif // snake_h_INCLUDED diff --git a/a3/test_logic b/a3/test_logic deleted file mode 100755 index d7888db6865441f81f5882e3e237f00ae715456a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16344 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 ZZ_F}omw8%tm$P4@A2yT?0fPW5{s(8y8D; -#include -#include "snake.h" - -int main() { - printf("=== Testing Snake Game Library ===\n\n"); - - // Test 1: Add snake parts - printf("Test 1: Adding snake parts\n"); - struct snake* snake = NULL; - snake = add_snake(snake, 5, 5); - snake = add_snake(snake, 5, 6); - snake = add_snake(snake, 5, 7); - printf("Added 3 snake parts\n"); - - // Test 2: Check if coordinates are part of snake - printf("\nTest 2: Checking if coordinates are part of snake\n"); - printf("Is (5,5) part of snake? %d (expected: 1)\n", is_snake(snake, 5, 5)); - printf("Is (5,6) part of snake? %d (expected: 1)\n", is_snake(snake, 5, 6)); - printf("Is (10,10) part of snake? %d (expected: 0)\n", is_snake(snake, 10, 10)); - - // Test 3: Count snake parts - printf("\nTest 3: Counting snake parts\n"); - int count = 0; - struct snake* curr = snake; - while (curr != NULL) { - count++; - curr = curr->next; - } - printf("Snake has %d parts (expected: 3)\n", count); - - // Test 4: Remove snake tail - printf("\nTest 4: Removing snake tail\n"); - snake = remove_snake(snake); - count = 0; - curr = snake; - while (curr != NULL) { - count++; - curr = curr->next; - } - printf("After removal, snake has %d parts (expected: 2)\n", count); - - // Test 5: Test game state step - printf("\nTest 5: Testing game state\n"); - struct state state; - state.snake = snake; - state.width = 20; - state.height = 20; - state.sx = 1; // Move right - state.sy = 0; - - // Initialize food - for (int i = 0; i < FOOD_COUNT; i++) { - state.foodx[i] = 10 + i; - state.foody[i] = 10; - } - - int result = step_state(&state); - printf("Step result: %d (0=CONTINUE, 1=WALL, 2=SNAKE, 3=FOOD, 4=USER)\n", result); - - // Test 6: Test wall collision - printf("\nTest 6: Testing wall collision\n"); - state.sx = 20; // Move far to the right (should hit wall) - state.sy = 0; - result = step_state(&state); - printf("After moving right 20, result: %d (expected: 1=WALL)\n", result); - - // Cleanup - free_snake(state.snake); - - printf("\n=== All tests completed ===\n"); - return 0; -} diff --git a/a5.2/Makefile b/a5.2/Makefile deleted file mode 100644 index a55c26d..0000000 --- a/a5.2/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -CFLAGS=-std=c99 -Wall -g - -all: game - -%.o: %.c - gcc $(CFLAGS) -c $< -o $@ - -clean: - rm -f *.o game - -game: main.o game.o world.o - gcc main.o game.o world.o -lcurses -lm -o game - -.PHONY: all clean diff --git a/a5.2/game b/a5.2/game deleted file mode 100755 index e381e5d14d34b0a40e835840d092c76fdac7672a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32368 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 diff --git a/a5.2/game.c b/a5.2/game.c deleted file mode 100644 index a21706b..0000000 --- a/a5.2/game.c +++ /dev/null @@ -1,218 +0,0 @@ -#include -#include -#include -#include -#include "world.h" -#include "game.h" - -// Helper function to get a random position within bounds -// Returns 1 if position is valid, 0 if we can't find a distinct position -static int get_random_position(int* x, int* y, int width, int height, - int cat_x, int cat_y, - int* existing_x, int* existing_y, int existing_count) { - // Leave 1 cell for border - int min_x = 1; - int max_x = width - 2; - int min_y = 1; - int max_y = height - 2; - - int attempts = 0; - while (attempts < 100) { - *x = min_x + rand() % (max_x - min_x + 1); - *y = min_y + rand() % (max_y - min_y + 1); - - // Check if position is distinct from cat - if (*x == cat_x && *y == cat_y) { - attempts++; - continue; - } - - // Check if position is distinct from other entities - int distinct = 1; - for (int i = 0; i < existing_count; i++) { - if (*x == existing_x[i] && *y == existing_y[i]) { - distinct = 0; - break; - } - } - - if (distinct) { - return 1; - } - attempts++; - } - return 0; -} - -// Initialize the game state -void* init_game() { - // Allocate memory for the game state - struct game* state = calloc(1, sizeof(struct game)); - - if (state == NULL) { - return NULL; - } - - // Use current time for random seed (more random than time(NULL) alone) - srand((unsigned int)time(NULL) + rand()); - - // Initial state values - state->score = 0; - strcpy(state->message, ""); - - // Place cat at a random position (leaving room for border) - state->cat_x = 5 + rand() % 20; - state->cat_y = 2 + rand() % 15; - - // Place 5 mice at distinct random positions - for (int i = 0; i < MOUSE_COUNT; i++) { - int px, py; - get_random_position(&px, &py, 30, 20, state->cat_x, state->cat_y, - state->mouse_x, state->mouse_y, i); - state->mouse_x[i] = px; - state->mouse_y[i] = py; - state->mouse_alive[i] = 1; // All mice start alive - } - - return state; -} - -// Draw the game state on screen -static void draw_game(struct game* state, struct event* event) { - // Clear screen - clear_screen(); - - // Draw border around the playing field (using walls: '#' in cyan) - // Top and bottom borders - for (int x = 0; x < event->width; x++) { - set_color_cell('#', x, 0, COLOR_CYAN, COLOR_BLACK); - set_color_cell('#', x, event->height - 1, COLOR_CYAN, COLOR_BLACK); - } - - // Left and right borders - for (int y = 1; y < event->height - 1; y++) { - set_color_cell('#', 0, y, COLOR_CYAN, COLOR_BLACK); - set_color_cell('#', event->width - 1, y, COLOR_CYAN, COLOR_BLACK); - } - - // Draw cat in yellow - set_color_cell('c', state->cat_x, state->cat_y, COLOR_YELLOW, COLOR_BLACK); - - // Draw alive mice in green - for (int i = 0; i < MOUSE_COUNT; i++) { - if (state->mouse_alive[i]) { - set_color_cell('m', state->mouse_x[i], state->mouse_y[i], COLOR_GREEN, COLOR_BLACK); - } - } - - // Display score - char score_msg[50]; - snprintf(score_msg, sizeof(score_msg), "Score: %d/5", state->score); - set_message(score_msg, 2, event->height - 2); - - // Display end-game message if game is won - if (state->game_won) { - set_message(state->message, (event->width - 40) / 2, event->height / 2); - } -} - -// Handle game events -int game_event(struct event* event, void* game) { - struct game* state = (struct game*)game; - - // Handle ESC key to quit - if (event->type == EVENT_ESC) { - return 1; // Non-zero means end the game - } - - // Handle keyboard input (arrow keys to move cat) - if (event->type == EVENT_KEY) { - if (event->key == KEY_UP) { - int new_y = state->cat_y - 1; - // Clamp to walls (1 inside border, event->height-2 is last valid position) - if (new_y > 0) { - state->cat_y = new_y; - } - } else if (event->key == KEY_DOWN) { - int new_y = state->cat_y + 1; - if (new_y < event->height - 1) { - state->cat_y = new_y; - } - } else if (event->key == KEY_LEFT) { - int new_x = state->cat_x - 1; - if (new_x > 0) { - state->cat_x = new_x; - } - } else if (event->key == KEY_RIGHT) { - int new_x = state->cat_x + 1; - if (new_x < event->width - 1) { - state->cat_x = new_x; - } - } - } - - // Handle timer tick (move mice) - if (event->type == EVENT_TIMEOUT) { - for (int i = 0; i < MOUSE_COUNT; i++) { - if (state->mouse_alive[i]) { - // Random direction: 0=up, 1=down, 2=left, 3=right, 4=stay - int direction = rand() % 5; - - int new_x = state->mouse_x[i]; - int new_y = state->mouse_y[i]; - - if (direction == 0) { // Up - new_y = state->mouse_y[i] - 1; - } else if (direction == 1) { // Down - new_y = state->mouse_y[i] + 1; - } else if (direction == 2) { // Left - new_x = state->mouse_x[i] - 1; - } else if (direction == 3) { // Right - new_x = state->mouse_x[i] + 1; - } - // direction 4 means stay (no change to new_x, new_y) - - // Clamp mouse to walls - if (new_x > 0 && new_x < event->width - 1) { - state->mouse_x[i] = new_x; - } - if (new_y > 0 && new_y < event->height - 1) { - state->mouse_y[i] = new_y; - } - } - } - } - - // Check collision: cat catches mouse - for (int i = 0; i < MOUSE_COUNT; i++) { - if (state->mouse_alive[i] && - state->cat_x == state->mouse_x[i] && - state->cat_y == state->mouse_y[i]) { - state->mouse_alive[i] = 0; // Mark mouse as eaten - state->score++; - } - } - - // Check if all mice are caught (game won) - if (state->score == MOUSE_COUNT && !state->game_won) { - strcpy(state->message, "Zlapil si vsetky mysky! Lusty macko! :-D"); - state->game_won = 1; - state->win_tick = 0; - } - - // If game is won, display message and eventually exit - if (state->game_won) { - state->win_tick++; - draw_game(state, event); - // After 30 frames (~3 seconds at 10fps), exit - if (state->win_tick > 30) { - return 1; - } - return 0; - } - - // Draw the current game state - draw_game(state, event); - - return 0; // Continue the game -} diff --git a/a5.2/game.h b/a5.2/game.h deleted file mode 100644 index a2212d3..0000000 --- a/a5.2/game.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _GAME_H_INCLUDE_ -#define _GAME_H_INCLUDE_ -#include "world.h" - -#define MOUSE_COUNT 5 - -// Game state structure -struct game { - int cat_x; // Cat X position - int cat_y; // Cat Y position - int mouse_x[MOUSE_COUNT]; // 5 mouse X positions - int mouse_y[MOUSE_COUNT]; // 5 mouse Y positions - int mouse_alive[MOUSE_COUNT]; // 1 if alive, 0 if eaten - int score; // Score (0-5) - char message[100]; // End-game message - int game_won; // Flag to track if game is won - int win_tick; // Counter to display message for a few frames -}; - -// Returns pointer to newly allocated game state -void* init_game(); - -// Handles game events and updates state -int game_event(struct event* event, void* game); - -#endif diff --git a/a5.2/game.o b/a5.2/game.o deleted file mode 100644 index 22f4c6d67be81f620cfcf9d85c690557bd5b7242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12816 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 diff --git a/a5.2/main.c b/a5.2/main.c deleted file mode 100644 index db1f35d..0000000 --- a/a5.2/main.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "game.h" -#include "world.h" -#include - -int main(int argc, char** argv) { - start_world(init_game, game_event, free); - return 0; -} diff --git a/a5.2/main.o b/a5.2/main.o deleted file mode 100644 index 9cff6a409253181805b0bb080eed1ae81236dc34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5272 zcmb_gUu;`f89(>hH*xF4N$RFcNwqqxY@wQ+EbXGEZQ3-cn?$64)Ffy{0`JY z(e-tkAhsbPfg*(1v=@*N@PZIR0>NH*Kv0+lLI@%8vKQW9ViG)bs)YDcQNG_f-*IkE zoEO9=`JC_jeSgon=U?)Ae&w2NSwfQ~E{R=9qe6@f?DBJxofF5zuy{1^^uN}ZcHUq5 z!rumWUVXf@(|)-0Wd{aJJHPC3zv^(m{s6k4p!v-^&)Pyb!b(6ogr*Nolx8D>tqg6u z7oZ(iT|#wMj|6R*`f%K-`Ju2AQc5PA1{{=$Owk*^2&BK~N7TjPsai|&wrpdvjmy@N zZI9@O<)r;o;wsINoTkx3F9DPMNy*1kcfD<4&qyI573U@2C;1D*A=wW~{-VT>N`6-I zBa*))`4f`AEcuM&=Olkh@>fy?iZiYUDL+r_hj#yGNE_QgO>#!!BdBi+plqbZ!LSEm z6Cdsc@>SCJDhK-&IQ#$(viTXf_oxxh+td!h99XY#-l6UYtf7vE|0BuizW|i!j*^M6 z97oO+cq08_t#6#7MIcu|3VQp^x)eqM+i$)soGQ$%ei2KZAG0qcXOhe5b4k*j63OJH zWGqEl9I>3Hv5b?=2~s%&A~}`-)RVI=A1B8o`HeZx9bZmgJZ=%*J3=vObs(m7Va!2L zo3KMe*2hxmWbEYV$sy}V@8DBH9OgV!Rg&UT_`bLmOI=DP$wvlGB4U4pF20Ne}m;#4}t>rX=9vQY!GuSj(Fh`>v(4x?}kK(F$-mP^3r=|I@yt!gs}_d->#R;lVdf#f;SjjN*O*TMp-5e>KIi)cxWTDe>& zT-LX}n;B_jcDEiDu(#cyQW6`1=c#&RQ7}?j)|Rj5Z?3P2`?Ydd72)=#$3?<~T<>v) zEzt_yAS~Q(2KBOvBnK23t_pbl=K5-$gMT7_M=ai0&n(Q$WL`LvJCmEtWE)}I_hu`e z?*+9IiEdD;&TgHX&Q71rWGk6$D=g2J$UeK_wzmCJHE8-Y#BAHYU-Qe^&@I-z7AdKk z(%tN4&<*vV7gZPxH9e4E#SV7Y%%j?Kchl0n2Rz|0~;n z$-px#f5pJxXZbAypXWGVH}Gl3zh&UKSV7-WUFSRM@AQ2Gf1TwY8~E2){<(oaV)?fQ zUT68w2L3L~4-NdEEI&5zejb;4knXNSUAKCK?&8=3pbYzAU19yS01`cK;NMiRIA`F0 zVtLWP-(!2d4|M!LFkUe185XY@_zo*@HiLAWVU|BIaJ>#5F^(>}j}Eh-1F}BL%=jOLk_h(L?@vP@dRBEE{6&^04Sb$ut=Dmu89#5>-(oqsuaWm9 z#;+RoF3UH#H|x(Zj_KejQAn<}-JrLG$kDq&^;OLUUfs=w-c~4bWjAz1uGngcoJ7lB zv0W+D{Ea5*B<~iBfp>3@+6`R4;_Y>**L+XAP#(M&GL%hi#NbNx=Ov7X^ub$QR7Z zjHjuGufBKaj~Gc z#6k6I|2Gcsf0zCBeN1MOw4d&AuWO!7WcQ)DAz5kKevfdRlg2U?|6u4pO$|? z3}Tx8BM3^Q-(O1FoqsL=l$dVcZ<7As0n+;%-*1S1I={xd<%Zua&VP#sjK6c>Yx-lG fnR}lg@ohF-h7chR*FjKIH~%HBU%zv-gX#ZYbzT6C diff --git a/a5.2/world.c b/a5.2/world.c deleted file mode 100644 index a45c109..0000000 --- a/a5.2/world.c +++ /dev/null @@ -1,198 +0,0 @@ -#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; - } - noecho(); // Nevypisuj vstup na obrazovku - cbreak(); // Zabudni starý vstup - nodelay(stdscr,TRUE); // Nečakaj na stlačenie - keypad(stdscr,TRUE); // Aktivuje šípky - curs_set(FALSE); // Neviditeľný kurzor - /* Get all the mouse events */ - mousemask(ALL_MOUSE_EVENTS, NULL); - MEVENT mouse_event; - 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; - event.key = getch(); - // No key was pressed - if (event.key == ERR){ - event.type = EVENT_TIMEOUT; - last_timeout = clock(); - next_timeout = last_timeout + TIMEOUT; - } - // Mouse event - else if (event.key == KEY_MOUSE ){ - event.type = EVENT_MOUSE; - if(getmouse(&mouse_event) == OK){ - event.mouse_x = mouse_event.x; - event.mouse_y = mouse_event.y; - if(mouse_event.bstate & BUTTON1_PRESSED){ - event.mouse_left = 1; - } - if(mouse_event.bstate & BUTTON2_PRESSED){ - event.mouse_middle = 1; - } - if(mouse_event.bstate & BUTTON3_PRESSED){ - event.mouse_right = 1; - } - } - } - else if (event.key == KEY_RESIZE) { - event.type = EVENT_RESIZE; - } - else{ - event.type = EVENT_KEY; - if (event.key == 27){ - int k = getch(); - if (k == -1){ - // Esc Was pressed - event.type = EVENT_ESC; - } - else { - // Alt was pressed - event.key = k; - event.alt_key = 1; - } - } - } - // 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/a5.2/world.h b/a5.2/world.h deleted file mode 100644 index 73be057..0000000 --- a/a5.2/world.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef _WORLD_H_ -#define _WORLD_H_ - -#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; -}; - -/** - * 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); - - -/** - * - * @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 diff --git a/a5.2/world.o b/a5.2/world.o deleted file mode 100644 index 64f9c8fe512418cad314968fcf84feb92fda15df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 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 diff --git a/a5/Makefile b/a5/Makefile index a55c26d..8c35442 100644 --- a/a5/Makefile +++ b/a5/Makefile @@ -6,9 +6,9 @@ all: game gcc $(CFLAGS) -c $< -o $@ clean: - rm -f *.o game + rm *.o + rm game game: main.o game.o world.o gcc main.o game.o world.o -lcurses -lm -o game -.PHONY: all clean diff --git a/a5/game.c b/a5/game.c index a21706b..d43ebe7 100644 --- a/a5/game.c +++ b/a5/game.c @@ -1,218 +1,138 @@ #include #include #include -#include #include "world.h" #include "game.h" -// Helper function to get a random position within bounds -// Returns 1 if position is valid, 0 if we can't find a distinct position -static int get_random_position(int* x, int* y, int width, int height, - int cat_x, int cat_y, - int* existing_x, int* existing_y, int existing_count) { - // Leave 1 cell for border - int min_x = 1; - int max_x = width - 2; - int min_y = 1; - int max_y = height - 2; +// Start is called one in the beginning +void* init_game(){ + // Allocate memory for the state + struct game* st = calloc(1,(sizeof(struct game))); + // Initialize cat + st->catx = 0; + st->caty = 0; + st->catx_position = 20; + st->caty_position = 10; + st->caught_count = 0; - int attempts = 0; - while (attempts < 100) { - *x = min_x + rand() % (max_x - min_x + 1); - *y = min_y + rand() % (max_y - min_y + 1); - - // Check if position is distinct from cat - if (*x == cat_x && *y == cat_y) { - attempts++; - continue; - } - - // Check if position is distinct from other entities - int distinct = 1; - for (int i = 0; i < existing_count; i++) { - if (*x == existing_x[i] && *y == existing_y[i]) { - distinct = 0; - break; - } - } - - if (distinct) { - return 1; - } - attempts++; + // Initialize 5 mice at random positions (within boundaries) + for(int i = 0; i < MOUSE_COUNT; i++){ + st->mousex[i] = 5 + rand() % 50; + st->mousey[i] = 5 + rand() % 15; + st->mouse_state[i] = 0; // alive } - return 0; + // Store pointer to the state to the world variable + return st; } -// Initialize the game state -void* init_game() { - // Allocate memory for the game state - struct game* state = calloc(1, sizeof(struct game)); +// Step is called in a loop once in interval. +// It should modify the state and draw it. +int game_event(struct event* event,void* game){ + // Get state pointer + struct game* state = game; - if (state == NULL) { - return NULL; + if ( event->type == EVENT_ESC){ + // Non zero means finish the loop and stop the game. + return 1; } - // Use current time for random seed (more random than time(NULL) alone) - srand((unsigned int)time(NULL) + rand()); - - // Initial state values - state->score = 0; - strcpy(state->message, ""); - - // Place cat at a random position (leaving room for border) - state->cat_x = 5 + rand() % 20; - state->cat_y = 2 + rand() % 15; - - // Place 5 mice at distinct random positions - for (int i = 0; i < MOUSE_COUNT; i++) { - int px, py; - get_random_position(&px, &py, 30, 20, state->cat_x, state->cat_y, - state->mouse_x, state->mouse_y, i); - state->mouse_x[i] = px; - state->mouse_y[i] = py; - state->mouse_alive[i] = 1; // All mice start alive - } - - return state; -} - -// Draw the game state on screen -static void draw_game(struct game* state, struct event* event) { - // Clear screen - clear_screen(); - - // Draw border around the playing field (using walls: '#' in cyan) - // Top and bottom borders - for (int x = 0; x < event->width; x++) { - set_color_cell('#', x, 0, COLOR_CYAN, COLOR_BLACK); - set_color_cell('#', x, event->height - 1, COLOR_CYAN, COLOR_BLACK); - } - - // Left and right borders - for (int y = 1; y < event->height - 1; y++) { - set_color_cell('#', 0, y, COLOR_CYAN, COLOR_BLACK); - set_color_cell('#', event->width - 1, y, COLOR_CYAN, COLOR_BLACK); - } - - // Draw cat in yellow - set_color_cell('c', state->cat_x, state->cat_y, COLOR_YELLOW, COLOR_BLACK); - - // Draw alive mice in green - for (int i = 0; i < MOUSE_COUNT; i++) { - if (state->mouse_alive[i]) { - set_color_cell('m', state->mouse_x[i], state->mouse_y[i], COLOR_GREEN, COLOR_BLACK); - } - } - - // Display score - char score_msg[50]; - snprintf(score_msg, sizeof(score_msg), "Score: %d/5", state->score); - set_message(score_msg, 2, event->height - 2); - - // Display end-game message if game is won - if (state->game_won) { - set_message(state->message, (event->width - 40) / 2, event->height / 2); - } -} - -// Handle game events -int game_event(struct event* event, void* game) { - struct game* state = (struct game*)game; - - // Handle ESC key to quit - if (event->type == EVENT_ESC) { - return 1; // Non-zero means end the game - } - - // Handle keyboard input (arrow keys to move cat) - if (event->type == EVENT_KEY) { - if (event->key == KEY_UP) { - int new_y = state->cat_y - 1; - // Clamp to walls (1 inside border, event->height-2 is last valid position) - if (new_y > 0) { - state->cat_y = new_y; - } - } else if (event->key == KEY_DOWN) { - int new_y = state->cat_y + 1; - if (new_y < event->height - 1) { - state->cat_y = new_y; - } - } else if (event->key == KEY_LEFT) { - int new_x = state->cat_x - 1; - if (new_x > 0) { - state->cat_x = new_x; - } - } else if (event->key == KEY_RIGHT) { - int new_x = state->cat_x + 1; - if (new_x < event->width - 1) { - state->cat_x = new_x; - } - } - } - - // Handle timer tick (move mice) - if (event->type == EVENT_TIMEOUT) { - for (int i = 0; i < MOUSE_COUNT; i++) { - if (state->mouse_alive[i]) { - // Random direction: 0=up, 1=down, 2=left, 3=right, 4=stay - int direction = rand() % 5; - - int new_x = state->mouse_x[i]; - int new_y = state->mouse_y[i]; - - if (direction == 0) { // Up - new_y = state->mouse_y[i] - 1; - } else if (direction == 1) { // Down - new_y = state->mouse_y[i] + 1; - } else if (direction == 2) { // Left - new_x = state->mouse_x[i] - 1; - } else if (direction == 3) { // Right - new_x = state->mouse_x[i] + 1; - } - // direction 4 means stay (no change to new_x, new_y) - - // Clamp mouse to walls - if (new_x > 0 && new_x < event->width - 1) { - state->mouse_x[i] = new_x; - } - if (new_y > 0 && new_y < event->height - 1) { - state->mouse_y[i] = new_y; - } - } - } - } - - // Check collision: cat catches mouse - for (int i = 0; i < MOUSE_COUNT; i++) { - if (state->mouse_alive[i] && - state->cat_x == state->mouse_x[i] && - state->cat_y == state->mouse_y[i]) { - state->mouse_alive[i] = 0; // Mark mouse as eaten - state->score++; - } - } - - // Check if all mice are caught (game won) - if (state->score == MOUSE_COUNT && !state->game_won) { - strcpy(state->message, "Zlapil si vsetky mysky! Lusty macko! :-D"); - state->game_won = 1; - state->win_tick = 0; - } - - // If game is won, display message and eventually exit - if (state->game_won) { - state->win_tick++; - draw_game(state, event); - // After 30 frames (~3 seconds at 10fps), exit - if (state->win_tick > 30) { - return 1; - } + // Check if all mice are caught + if(state->caught_count == MOUSE_COUNT){ + clear_screen(); + set_message("VSETKY MYSKY ZJEDENE! VITAZ!",10,12); return 0; } - // Draw the current game state - draw_game(state, event); + // Check each mouse if it's caught by cat + for(int i = 0; i < MOUSE_COUNT; i++){ + if(state->mouse_state[i] == 0){ // mouse is alive + if(state->mousex[i] == state->catx_position && state->mousey[i] == state->caty_position){ + state->mouse_state[i] = 1; // caught + state->caught_count++; + } + } + } - return 0; // Continue the game + if(event->type == EVENT_TIMEOUT) { + // Move cat + int cx = state->catx_position + state->catx; + int cy = state->caty_position + state->caty; + + // Check boundaries (leave room for borders) + if (cx > 1 && cx < event->width - 2 && cy > 2 && cy < event->height - 2){ + state->catx_position = cx; + state->caty_position = cy; + } + + // Move each alive mouse randomly + for(int i = 0; i < MOUSE_COUNT; i++){ + if(state->mouse_state[i] == 0){ // mouse is alive + int m = rand() % 4; + int mx = state->mousex[i]; + int my = state->mousey[i]; + + if (m == 0) my -= 1; + else if (m == 1) my += 1; + else if (m == 2) mx -= 1; + else if (m == 3) mx += 1; + + // Check boundaries (leave room for borders) + if (mx > 1 && mx < event->width - 2 && my > 2 && my < event->height - 2){ + state->mousex[i] = mx; + state->mousey[i] = my; + } + } + } + } + else if (event->type == EVENT_KEY){ + // Move cat according to keyboard + if ( event->key == KEY_UP){ + state->catx = 0; + state->caty = -1; + } + else if ( event->key == KEY_DOWN){ + state->catx = 0; + state->caty = 1; + } + else if ( event->key == KEY_LEFT){ + state->catx = -1; + state->caty = 0; + } + else if ( event->key == KEY_RIGHT){ + state->catx = +1; + state->caty = 0; + } + } + + // Draw world state + clear_screen(); + + // Draw borders + for(int x = 0; x < event->width; x++){ + set_cell('#', x, 1); + set_cell('#', x, event->height - 2); + } + for(int y = 1; y < event->height - 1; y++){ + set_cell('#', 0, y); + set_cell('#', event->width - 1, y); + } + + // Draw cat + set_cell('c', state->catx_position, state->caty_position); + + // Draw mice + for(int i = 0; i < MOUSE_COUNT; i++){ + if(state->mouse_state[i] == 0){ // only draw alive mice + set_cell('m', state->mousex[i], state->mousey[i]); + } + } + + // Draw caught count + char msg[100]; + sprintf(msg, "Chytene: %d/%d", state->caught_count, MOUSE_COUNT); + set_message(msg, 2, 0); + + return 0; } + + diff --git a/a5/game.h b/a5/game.h index a2212d3..845f9bc 100644 --- a/a5/game.h +++ b/a5/game.h @@ -4,23 +4,33 @@ #define MOUSE_COUNT 5 -// Game state structure +// Set of variables that expresses state of the game. +// struct game { - int cat_x; // Cat X position - int cat_y; // Cat Y position - int mouse_x[MOUSE_COUNT]; // 5 mouse X positions - int mouse_y[MOUSE_COUNT]; // 5 mouse Y positions - int mouse_alive[MOUSE_COUNT]; // 1 if alive, 0 if eaten - int score; // Score (0-5) - char message[100]; // End-game message - int game_won; // Flag to track if game is won - int win_tick; // Counter to display message for a few frames + // X speed of the cat + int catx; + // Y speed of the cat + int caty; + // X position of the cat + int catx_position; + // Y opsition of the cat + int caty_position;; + // X positions of the mice + int mousex[MOUSE_COUNT]; + // Y positions of the mice + int mousey[MOUSE_COUNT]; + // State of each mouse (0 = alive, 1 = caught) + int mouse_state[MOUSE_COUNT]; + // Count of caught mice + int caught_count; + // Funky message + char message[100]; }; -// Returns pointer to newly allocated game state +// Returns pointer to newly allocated state void* init_game(); -// Handles game events and updates state -int game_event(struct event* event, void* game); +// Changes world according to the game state (pressed key, screen size or other event) +int game_event(struct event* event,void* game); #endif diff --git a/a5/main.c b/a5/main.c index db1f35d..0446027 100644 --- a/a5/main.c +++ b/a5/main.c @@ -2,7 +2,8 @@ #include "world.h" #include -int main(int argc, char** argv) { - start_world(init_game, game_event, free); + +int main(int argc, char** argv){ + start_world(init_game,game_event,free); return 0; } diff --git a/du4/snake0.c b/du4/snake0.c deleted file mode 100644 index f735694..0000000 --- a/du4/snake0.c +++ /dev/null @@ -1,104 +0,0 @@ -#include -#include "snake.h" - -struct snake* add_snake(struct snake* snake, int x, int y) { - struct snake* new_part = (struct snake*)malloc(sizeof(struct snake)); - if (new_part == NULL) { - return snake; - } - new_part->x = x; - new_part->y = y; - new_part->next = snake; - - return new_part; -} - -struct snake* remove_snake(struct snake* snake) { - if (snake == NULL) { - return NULL; - } - if (snake->next == NULL) { - free(snake); - return NULL; - } - - struct snake* current = snake; - while (current->next->next != NULL) { - current = current->next; - } - - free(current->next); - current->next = NULL; - - return snake; -} - -int is_snake(struct snake* snake, int x, int y) { - struct snake* current = snake; - while (current != NULL) { - if (current->x == x && current->y == y) { - return 1; - } - current = current->next; - } - return 0; -} - -void free_snake(struct snake* sn) { - while (sn != NULL) { - struct snake* temp = sn; - sn = sn->next; - free(temp); - } -} - -int step_state(struct state* state) { - if (state == NULL || state->snake == NULL) { - return END_USER; - } - - int new_x = state->snake->x + state->sx; - int new_y = state->snake->y + state->sy; - - if (new_x < 0 || new_x >= state->width || new_y < 0 || new_y >= state->height) { - return END_WALL; - } - - int food_index = -1; - int items_left = 0; - - for (int i = 0; i < FOOD_COUNT; i++) { - if (state->foodx[i] == new_x && state->foody[i] == new_y) { - food_index = i; - } else if (state->foodx[i] >= 0 && state->foody[i] >= 0) { - items_left++; - } - } - - if (food_index >= 0) { - state->foodx[food_index] = -1; - state->foody[food_index] = -1; - - if (is_snake(state->snake, new_x, new_y)) { - state->snake = add_snake(state->snake, new_x, new_y); - return END_SNAKE; - } - - state->snake = add_snake(state->snake, new_x, new_y); - - if (items_left == 0) { - return END_FOOD; - } - return END_CONTINUE; - } else { - state->snake = remove_snake(state->snake); - - if (is_snake(state->snake, new_x, new_y)) { - state->snake = add_snake(state->snake, new_x, new_y); - return END_SNAKE; - } - - state->snake = add_snake(state->snake, new_x, new_y); - return END_CONTINUE; - } -} \ No newline at end of file diff --git a/du4/snake0.h b/du4/snake0.h deleted file mode 100644 index c0ab1ad..0000000 --- a/du4/snake0.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef snake_h_INCLUDED -#define snake_h_INCLUDED - -// Number of food items on the plane -#define FOOD_COUNT 5 - -/** - * One part of the snake; - * - * The snake is a linked list; - */ - -struct snake { - // x position of the snake part - int x; - // y position of the snake part - int y; - // Pointer to the next snake part. - // The last part of the snake has NULL pointer to the next part. - struct snake* next; -}; - -// End game reason constants, return value of step_state -enum endgame { - // Continue the game - END_CONTINUE = 0, - // Snake hit a wall - END_WALL, - // Snake hit itself - END_SNAKE, - // No food left - END_FOOD, - // Other reason to end - END_USER -}; - -/** - * State of the game. - * - * The state consists of the snake, its speed and food on the plane. - * - * The snake is a linked list of snake parts. - * - * Speed vector is a vector added to the last head position to create a new head. - * - * Food are points on the plane. Food with negative coordinates meads food is already eaten. - */ - -struct state { - // Snake as a linked list - struct snake* snake; - // X of the food positions - int foodx[FOOD_COUNT]; - // Y of the food positions - int foody[FOOD_COUNT]; - int sx; - int sy; - int width; - int height; -}; - -/** - * Add a new snake part with given position. The new snake part becomes the new head. - * - * @param head of the snake. - * @param x coordinate of the new head; - * @param y coordinate of the new head. - * @return new head of the snake. - */ -struct snake* add_snake(struct snake* snake,int x,int y); - -/** - * Remove the last snake part. - * The last snake part should always have NULL next pointer. - * - * @param head of the snake. - * @return new head of the snake. - */ -struct snake* remove_snake(struct snake* snake); - -/** - * Finds out if given coordinates are part of the snake. - * @param snake - * @param x coordinate to search in snake - * @param y coordinate to search in snake - * @return True, if there is a snake part with coordinates x,y. False otherwise - * - */ -int is_snake(struct snake* snake,int x, int y); -/** - * Remove and free each snake part; - * @param head of the snake. - */ -void free_snake(struct snake* sn); -/** - * Change game state. - * - * The function shoud calculate new posision of the snake head - * from the current position and speed vector. - * Then it should modify snake parst or food coordinates according to the rules: - * - * - If the new position is on the snake, end the game, return END_SNAKE. - * - If the new position is on the food, mark food as eaten - * (set its coordinates to -1) and add new snake part on the position of the food. If there is no food left, return END_FOOD. else return END_CONTINUE. - * - If the new position is on the plane, add new snake part on the new position and remove the last part of the snake, return END_CONTINUE. - * - * @param current state of the game - * @return reason to end the game according to enum endgame. - */ -int step_state(struct state* state); - -#endif // snake_h_INCLUDED diff --git a/du4/test_snake b/du4/test_snake deleted file mode 100755 index 42bafc26ef31c6630649f9887e3d803dedc8b50f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16344 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 ZZ_F}omw8%tm$P4@A2yT?0fPW5{s(8y8D; -#include -#include "snake.h" - -int main() { - printf("=== Testing Snake Game Library ===\n\n"); - - // Test 1: Add snake parts - printf("Test 1: Adding snake parts\n"); - struct snake* snake = NULL; - snake = add_snake(snake, 5, 5); - snake = add_snake(snake, 5, 6); - snake = add_snake(snake, 5, 7); - printf("Added 3 snake parts\n"); - - // Test 2: Check if coordinates are part of snake - printf("\nTest 2: Checking if coordinates are part of snake\n"); - printf("Is (5,5) part of snake? %d (expected: 1)\n", is_snake(snake, 5, 5)); - printf("Is (5,6) part of snake? %d (expected: 1)\n", is_snake(snake, 5, 6)); - printf("Is (10,10) part of snake? %d (expected: 0)\n", is_snake(snake, 10, 10)); - - // Test 3: Count snake parts - printf("\nTest 3: Counting snake parts\n"); - int count = 0; - struct snake* curr = snake; - while (curr != NULL) { - count++; - curr = curr->next; - } - printf("Snake has %d parts (expected: 3)\n", count); - - // Test 4: Remove snake tail - printf("\nTest 4: Removing snake tail\n"); - snake = remove_snake(snake); - count = 0; - curr = snake; - while (curr != NULL) { - count++; - curr = curr->next; - } - printf("After removal, snake has %d parts (expected: 2)\n", count); - - // Test 5: Test game state step - printf("\nTest 5: Testing game state\n"); - struct state state; - state.snake = snake; - state.width = 20; - state.height = 20; - state.sx = 1; // Move right - state.sy = 0; - - // Initialize food - for (int i = 0; i < FOOD_COUNT; i++) { - state.foodx[i] = 10 + i; - state.foody[i] = 10; - } - - int result = step_state(&state); - printf("Step result: %d (0=CONTINUE, 1=WALL, 2=SNAKE, 3=FOOD, 4=USER)\n", result); - - // Test 6: Test wall collision - printf("\nTest 6: Testing wall collision\n"); - state.sx = 20; // Move far to the right (should hit wall) - state.sy = 0; - result = step_state(&state); - printf("After moving right 20, result: %d (expected: 1=WALL)\n", result); - - // Cleanup - free_snake(state.snake); - - printf("\n=== All tests completed ===\n"); - return 0; -} diff --git a/du5/program b/du5/program deleted file mode 100755 index 1cfc2c4582e2e7a0f84da172d461ebbbb2e50539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16424 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 Utc%mFl>N0Ul*SyNfsYk`2i;zsTmS$7 diff --git a/du6/a_station.h b/du6/a_station.h deleted file mode 100644 index 15e37ac..0000000 --- a/du6/a_station.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef STATION_H -#define STATION_H - -// Pocet trati k dispozicii -#define STATION_SIZE 10 -// Maximalny pocet znakov pre ulozenie nazvu cielovej stanice -#define TARGET_SIZE 36 - -/** - * Jeden zaznam o kapacite do cielovej stanice - */ -struct car { - // Cielova stanica / nazov - char value[TARGET_SIZE]; - // Pocet cestujuchich - int capacity; - // Smernik na dalsi zaznam - struct car* next; -}; - -/** - * Cela databaza zaznamov - */ -struct station { - // Dynamicke pole smernikov na zaznamy - // jeden zaznam ma typ struct car* - struct car** tracks; - // Velkost pola tracks - int track_count; -}; - -/** - * Vytvori prazdnu stanicu. - * Alokuje pole smernikov tracks na pociatocnu kapacitu STATION_SIZE - * nastavi velkost capacity na STATION_SIZE - * @return smernik na prazdnu stanicu - */ -struct station* create_station(); - -/** - * Uvolni pamat - * @param smernik na databazu - */ -void destroy_station(struct station* station); - -/** - * Vyberie poziciu v poli station->tracks pre ulozenie zaznamu target - * - * Proces vyberu by mal splnat kriteria pre hash funkciu: - * - rovnaky retazec by mal vzdy mat rovnaky vysledok - * - pre rozne retazce by mali byt vysledky co najviac rozne - * - * @param smernik na databazu - * @param nazov cielovej stanice - * @return cislo v intervale 0 az N-1, kde N je station->track_count - */ -int select_track(struct station* station, const char* target); - -/** - * Zvysi zaznam o pocte cestujucich do danej cielovej stanice. - * - * Najprv sa vyberie cielova trat pomocou select_track(). Ak zaznam neexistuje, - * vytvori sa novy. Ak zaznam na danej trati (spojkovom zozname) existuje, cislo sa pripocita. - * V databaze nesmu byt dva zaznamy s rovnakou cielovou stanicou. - * - * @param smernik na databazu - * @param nazov cielovej stanice - */ -void add_target_capacity(struct station* station, const char* target, int capacity); - -/** - * Ziska zaznam o cielovej stanici. - * @param smernik na databazu - * @param nazov cielovej stanice - * - * @return kapacitu do cielovej stanice. Ak sa zaznam nenachedza, vrati nula. - */ -int get_target_capacity(struct station* station, const char* target); - -/** - * Spocita pocet cielovych stanic - * @param smernik na databazu - */ -int count_targets(struct station* station); - -/** - * Spocita kapacitu vo vsetkych zaznamoch - * @param smernik na databazu - */ -int count_capacity(struct station* station); - -#endif diff --git a/du6/station.o b/du6/station.o deleted file mode 100644 index 04e88d145ae51fb1f35096218e192b285ba0563a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3448 zcmbtWU1%It6uz@bn$)K5TK|d_S!s|c&5$-l+NxzSj2T2r5LOVZ>0~l(LbJQ+?5s2; zX_ZZcaUKlngMx_o^_VbbkRaR-<^9Wv(t^g2kzf@ ze(yQw&h9zwsV5SO!Xzo|Fxxmul(7T1Z0s|9n_=5oH~S@d-|t!7{Yfv^Q%fmgtbwV! zT0<|-Hdv|iW1MS47rSU#f)OEbS@%fBP4UHJ`h2BydjKtSi9jz2XgSjbMQlI&B;v4N zcV}0~%?fkQENgWVVKtqkR&J)YS{?Ga)&xY~vaRdgp{Z@9pDkwawRPT9%?_`XH6JhwacPBjSF9s`hy}68 zgJ460gNM?++0jzoDW&%gr~_($-@_$-+;?{0ezkx9g966&+iBpl)InqDNR}lSs{m`G z0lFhtm~!SBrkqYGySh8O7U*@{OE?DT6ejJ~)GLX>?OPJ#BoXi)1y1xPrjYN2{O5ra zy@4s@zZ&vqfD;YigDd%M4=E6U?{~l?dLNVIC*BVAF90VxhbiR081h$v6U}1^`7@jk zs1+fUcJ}j)R=ly&rA?KPMW9=bo_F1YQ?7&pBbN=orpK zA+MUuv@OH2Mg+ie#^hvy&|o=kTNWF$ijG~F4n>OAq-8oIj%}DHnK3pt;u!V`%Na3^ zDZ`v_rpdT%=BBXZ&8cYyUR=a1&_fYukp-tvA9o1|Zvx}`jerIsINpxLvk`nt1i!oq z?r(x$-vs|r)D5xFGYkFRE$RRqe+Fbc!x20he=&liN2PpH)F*EL@dzHZpC(-p%n6hH zoZ<5ZF8lLX443`+QVf^<`Cbf{{Z@(LvfrvPT=pANi_j?J!;AU< zlqM4>HF_vY8F4s;0!2u)MTqR89YiuAA~t9mqO?#zEwL3a+X*Jo12lk(vIFAuQOvKz zoO47ev4-r%DqjKN{WJ~{lKGR+ zC~e?BuFrpH32#V2vBvd}65gtQ>8*jn2SN|^gRaz<^=s*y#7Wcm+QcDEX|uFRn?iGO5+}H>OfOC@Swnu@#0FY^w(GmKee`^1 z?)Flvlz#*gL`W@Ai3nApjY{MGC4gv^RH$-91y)I`Gd9(=xL^wH^4`pQ zdwW}(0zyJUH`e;i`}y9?yqVdX+1{G;LY8r7@IAg*M76V7)ZBu={uJ z=@j5*6lD}fQFTc1><@LzNRRfd6YZ~_yYTTV=HL3vHxK03KYjmC&yJuC)*CTsg9-id z5J4XEi{U~W6_3wBPRWp-v!3fiI#*f(ic4ovuAD=TWz1&(S&(aR`4iS_Hv85&FxonH8!; z?vdko=Tz{>p+asddgK?mQXytMa-0vGzDsia8Nji~=|PX2=P2rqd*pO0mykz1ay8GC zr%{iberlxR=N>u70u^UHa{7r;jw=5v5vW9<5`jttDiNqepb~-qQ3U=}cjcS<&{VCS zuQ|V72>r;YUFDqBhn}u|O4i8P{235CYZCCkZdF*IeJ^SzUUD3#dqncM(3*I@#N&c* z;>i+^3$BTulz3eDO&lxnxbT{|zr^E$YvNv)ch>BI(!1+cZ5Oh9XU!|2a{jkI{skZZ zoR2^4;~)3&C(8H@e{9R0`?Q{WNgujUZ10F{7~Sv-eYoY9P)n!&%V0X)9jaS(7+474 zaLc10(T8h(g5-u7yB-m;zfGIrsw&N6H5Y5vy zR{$UQ6ky%*5kGMUC^6FsI2a5X)PCw>^m3-~5P*T5w?whu0rnBBf8pcMsd_FlqYvFR zBkB(S3i=%E-XK^OVfn~RK3tnS4e~dYTtR!4&-anfHnKe#!XoeU9fF?Rs6ufhboG&SUBo)*7&gp!lD4o}Noj?CK#{tESk?HLFCYM8-O$j|y z_yH&$!CTy<1yaOJE`ZD;3C0et_PWV~HOMH4g#@xRq|_j;S*XklH!I7_h;7AUpcL_o zr#y2pcnWv!1q*F?wq+McyUCr8<4*GwZYv9`rNNV`sGuZyyyaw>nHKyl9zH>^CKCeIV65N{30uMDRPHLcpXouIz z`e7b=u@eeI*JuIGiXwY{C^8j5KX6O9Au@IFA@YgV*DC8V%wG=q$-s!GPPw}ZdM-Pz zpNSM}>Y>I%cNK(vDZmTh>d5Hb3qUe1I4HM(VjQb7xfXJ8FCDMZa~PMR9+2UwJ0a>$ zjA8?1-6Atss~M0U9?d=rS@fz$ar_idV(az4{8`VP({n%nl(%0nOtMJDE7 zV+8RSm?NWghyR9PtXkdSB4+cQ<5I1r<`rU`uy)uLSc>WTYh3206ofw$%Cds6lw4or%bUEYPa`$F|P z+}qwIRM%sjJ)v3y&4ExYL~%a6dQ!%$JT}kzCmYo6Ok^5DLPHFGK)HfExY}V1qQPVn z>GGY$clKLwC^9VvRe6CELy;niae&S!PDGrXiC_ zmdKoDr8Hu){(N!glmkx$|ZjIW;e9T#Rr=;-OTiA-PvSR z4(@0wnUM{T4yu~L*pJ?>b*IwWwWZN@t@LXqV{$BHdgWm4vb2oZXF&{ZiR>49_6iBj zXnm#~?F9e~a8+niv$h>ZZ8|mRoiG##o;NtI!NNat7U8_ynn-9i=rdY0)z_b}aDIVY z1TL?>5ue4uZd=5r90%WZUjX_v&}pDAqWq7Ja~SCER~-k}w&!1SoMo_4`S9zG(+Kpp zKs$hb_D_yu1O5KA<9r3^jyD|VVW7_d{WVbhb^%l1&V3><5DZ+tctPz5$?+SVF(~gE zG}yiXH>_ecT#ayzPCCvZpkhgI$C4EvuDj@t+C$=|l{dV9)9R~GjD9}}*9yQ(APOO& z+=eR%@_rOh!m{pz>t<-zefV54vLyKVs%;m~uO6y~D#`DK9s=>tijITdD7gBnUQ|o{ zuRy#6;_#I+ecshif&5<3f4NNm1y{cq+WiLTHvx71SHC~NDBH{h!e_8@V9v@h=&LDWr<+oD18s7cAY{zNLIMs!^Gdzy+^U)EEUZ1An{!9QL^K2 z2D$tzNzQigdPKGlmu9GfcaD-Dr}n|qc-BiKEFUF*n)L7lUGm%xa{pf={C&6IVFUGd zm}ooE+lclPJw$YbsNc`K@wH)Pv2)wDW^HX}S2k&9wGEp>n?eoiwqzx{@$QX{p@zom zNc_(|;`p5>UUU3b*iQk_$hAA)8wLZ31G2I}cf21p%R35Q`*TI)}Vr4*7PF zYh@l3^NN(iT`F9zyiNKEiYmH+$vqL6B&EFE7P))K{;PC@k$XIlf05+t=*A)UW*|QX z@}RiP?RWHn=?7&0IV$&v5(|9Mdui1rg72#&7LQAN=1TP39P$ew$8!DceQgf=d2mD2 zN^afUQjlK)!QuJI3JvAhV+4Y?<}$4Z`E32z3i2R~{}o{}B=QGYpP+l*NABT4w^RBF zireUhdW`HpL4J51v9}(wUr2@X{7#U3{&Hn0_uP;@2y$$f-_KEyYwXlRkCC5mksrA? z2mOyhewD|Lv%f_9s>Rso^0Ysiwl{=Q@NK=>6*p|NM}Qz>XS=&YQBnF1-?00PD1M2b z0n1p*=t-oy%!CoMQ|XLhW(S1(C??b}y9FK$h#O`)Z4MgnU@eWO3E+8=5zF@V4Fbf& z8DMFbnd0Lf{O%tgQbD~;Pu?(g?Ay9KVnp_AH{eXb_FMLB-QBhg9Kw+iBchX5-@Z>6 zJ9q7E-MY)zyJN@xNQcp}wRKm-kY^ggd>BEVK=2=IaJ6t$flflWqIWy85KX}^2ZU8U zQN_a)Wl;5Wms=yuSd459dTTE^1M|tX^OavVU9@Mc3I)~xY zmmjMzVwsfD3y=5k$VJ;;0K%hYBb%{eboQehZ6#v@o)^Ef;zm~{L#4{|A@oeoZLMLz z=??BUJoYi`S&odAfJe=Sd`J$x>OEpoUJo2JLWDAdeYV*J)J`kf%Q-lQVx{{<2p+3j zp`K(m)SpiETWNdHBkIb=;fzx}Mxw2)ZR>DONOO2x-z!3~!6X!+sGU}t16DeNPyMAC zF$U<;R>DL8<@yu02+3-OARFpQ0gIW86%`@d8UR*yYbc$PeIBxUX z!Fedk?2Cgl1&8>H5KPQI&x7pp+5c~IxQ>QfB&-EgT0sjyro4_OwY23t(yQUZwJYPB z2+ydK3Q+ungBdUOeBInQClE)Q|rd$o~v$U#>sz514ZK zyg%^Q-vm7F4H!R0?PuDA!G(l%#4O`^9Uli7LKx5c5vI7l@+NZUig0~^YkS7?dY&oo zi@5%5$MkN%<6ePz-Y+oa{`1$LD=-Whj49)J|H5>X47q%N`@c^3RdlOxVBsdq}^FyiX)IvaXy*`fa$pc#UvO522AKk=iZh0nmBz-z5X4Y|k#3XL{U+ zKTZm!{R||^IHr&K@EYwGn7+aR^WoX;DIcEKg-m%L&i4NK^9B7(d4IdY);54T<{8|BVm7mL@FI`_Q>3`NAPy1|58$DCZ!W@xF)8)B5e1XZjjo z>O6RU{xGr*y_LqR;z~T@-vR}WT@DlPbNGBTpM%Evhlz3A|33m5Hj(lC{Nd<&v=(AO z5%)jina&5W7catO+Mp -#include -#include "a_station.h" - -int main() { - printf("=== Testing Train Station Library ===\n\n"); - - // Test 1: Create station - printf("Test 1: Creating station\n"); - struct station* st = create_station(); - if (st != NULL) { - printf("Station created successfully\n"); - printf("Station has %d tracks\n", st->track_count); - } else { - printf("ERROR: Could not create station\n"); - return 1; - } - - // Test 2: Add targets - printf("\nTest 2: Adding destinations\n"); - add_target_capacity(st, "Bratislava", 100); - add_target_capacity(st, "Kosice", 150); - add_target_capacity(st, "Zilina", 80); - add_target_capacity(st, "Presov", 120); - printf("Added 4 destinations\n"); - - // Test 3: Count targets - printf("\nTest 3: Counting targets\n"); - int target_count = count_targets(st); - printf("Number of targets: %d (expected: 4)\n", target_count); - - // Test 4: Get target capacity - printf("\nTest 4: Getting target capacities\n"); - printf("Bratislava capacity: %d (expected: 100)\n", get_target_capacity(st, "Bratislava")); - printf("Kosice capacity: %d (expected: 150)\n", get_target_capacity(st, "Kosice")); - printf("Zilina capacity: %d (expected: 80)\n", get_target_capacity(st, "Zilina")); - printf("Presov capacity: %d (expected: 120)\n", get_target_capacity(st, "Presov")); - printf("NonExistent capacity: %d (expected: 0)\n", get_target_capacity(st, "NonExistent")); - - // Test 5: Add to existing target - printf("\nTest 5: Adding more capacity to existing target\n"); - add_target_capacity(st, "Bratislava", 50); - printf("Bratislava new capacity: %d (expected: 150)\n", get_target_capacity(st, "Bratislava")); - - // Test 6: Total capacity count - printf("\nTest 6: Total capacity\n"); - int total_capacity = count_capacity(st); - printf("Total capacity: %d (expected: 500)\n", total_capacity); - - // Test 7: Hash function consistency - printf("\nTest 7: Hash function consistency\n"); - int track1 = select_track(st, "Bratislava"); - int track2 = select_track(st, "Bratislava"); - printf("Track for 'Bratislava': %d and %d (should be same)\n", track1, track2); - printf("Tracks match: %s\n", track1 == track2 ? "YES" : "NO"); - - // Test 8: Clean up - printf("\nTest 8: Destroying station\n"); - destroy_station(st); - printf("Station destroyed successfully\n"); - - printf("\n=== All tests completed ===\n"); - return 0; -} diff --git a/master.zip b/master.zip deleted file mode 100644 index 431ecccaedae7da5630ff813281e7627033f6926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7522 zcmZ{pWmFv5)`lAr+}+&?5E^Nm;K98~aCZsr9s)s{V2uO|5`qSIcTI2!jR$wv03S1R zzneSUxo53YRe#R2cAZsw*LmNqs_^6~D&UXdLia)a&xe0qFaRh3k2lVCX6*LHF0SUz z&%v4q0611UPb1ZTtwH{C&DuM65@I+2pz2`~Jzm3MY3*ul>F~zc{NJlZVqT~`0it(b z_(sUGIZ8HsDio5Iuz7|}fvo{mn6vfn7g)v8YZYsv&V9vgHEMZOzS^5KKT&`;soW>uWf0XO^DU4C)%5!3#7eFZ-& zVba*H_da$;?>aZ$_TF%gDKB zEn4651SKI=O}_Qj$%7um6g@9Sw-Sg((aOhN*-CX^avXSu^O63UVii$2alS9w91SL2 zK*@-%ac>N?eT&T>?(e(0wed@h>Ind_jQ{}PKi*YEIZ0_{4e5VxDOB^D1B@TL<%9)M zgcpq$=B@(EunMn1?#q@}ck9PK@5&bScj@qE4YEtx za5`ks`P+t4)By=c0n%+hW|yvinytsgNwcM0;kkIc)-~D=*0$rjPKp}u%xy=z>Q}S3 zBaP^;PgTUn8-5;fFvoAyxohxI{S?%NuXc$t!cLizxir(Xbu7oh`4HfGK>=G<* z1vzvxZt5d96t487klnMn9{~4>kd(D$jTBbZN6T{MhTcV5qqxp+m;21XsaZv0N^d&W z7Gj1^%E~(oi;%a{`GMRGu#XKcYRdKaL1~d&kgtJ! z1R_m-O;~T3LRJ+yMlPF1p75rW#?At7@wN0P-+U%b`tKQ!nO(@^J;`NUbSXIO=^+6g#&_cH%S z-U^x423sKxj(IOZV@K@@E9ek!FPhdem93Xg0!&Zw90XE$j^c|^Rky5mUQe=UaCDN9 z+joqs>|_{!@b}Czw{I&9c&Kq@50l_=W+@rlnp;@g{jOH_kaE;cPIRe_&1Vj>pV<3+ z6rW%Oxo=HnRjNg?%m8QDZ*OP6&q}K>Z7C0)i7ry&ZCnWU^9N`4_>|GHPB=2Y&K8%3 zh@-eEKfN`!&ZDb)&&{9RiXC2SF+TA*Fg^m(*r)|DGDwZE*F1#um!1_O-suN5`>NN} z^JLx4bo&22^o$>9;OvK@P=X8q5IzoFU0Pg9Nt(mn>~~oJE4=v$!WK~Sa8loJHEBqp$t(i+q2 zCD3TkXfl>v4pVB+Z0}NM%x1o6~II^%|2|uJC!<0!d|dg8h)0pX4rC zlZVxzC+qTAY_C#Txwe)%MT&^D^8SwRh_G2A$GYJp%j7#cy^gHbV8+s^&nNWhsYZjdIrg0f+u8ojNsuuv(?_juTssYIn{=K#T1 zKgqpnlQ>isPGl!>EL(Bkez7uXWr@o(ipzzX6eb31pYG5fH9y1GJ3&}KJN?^9s#o3HJa;=aP>UQQ@(@Yr?MJJ|qrZm!q@?);daw^FV5hbac<&A=l zu(cp>IdDhtsI#A~G;f}%oCIv!Mel2~iZUYal@piN^#qHg9wC3iB!3 zC7XL3WBtxa9mnhNX$Cu+Uz22E z*L#5C!b%oaA;_7oSoNQYtT zrSTzQQfji+1Jalp98o2j%sleM@;1mYZdJhPg$9oevGm`h!1f!br}aw%w$BVfJOjJ87Uw+ePiH2|xdME=D56B?8%DD4KR$Q+ zUPx2P=%mM#wf3aQyG2rDF@NVP<{3XMea4SCr^!442Kks#=DN8>aCvy!2r6ySa@49` ze-f#w=P=!o%w-2CR>P?N+KS#zb{8>P0VSVDch9fJ%qhb;YB))aa4ZuO#Lf+zNc5~)3+46`>dWmjnn$vZ|wu_vhI44hz`z$ghhvz z8%~h4F7;XwBlu*UY?G$JZni16+ov`24A+z>ULD=^xpFJQSeZUG@!gda$P1~XlUBl4 zxO(~!(WFQx$CfAcmM{0us33ko%;41PWvfH1Xs?rfo{8k}xe(i>G19Ne(^IUqP4?SI z98(6Z{_A%8M#7B&k1`#vYuHKVK`-UO|F2B9`gf*7VwK)>aH5AEToDlJ0ceaiG8lVA zbM3>F;z3Fp3A_$uYH_SiK@PJ4hH>gkoFm?Hd&2(q8+%2H3PXX5dZKKX?5#d&i>-R> z{5vv)RiMBO~+Y;>4N%=*o$#983aE`U@z5FY^GsRpmd0-2E{}Y zC`%BynC&E(z_*ZG4qFBBR+5BK{OfH*)4MT=8IB`=V5%SeE>pO_FwLZv&|(`} z76KQ5l+XN0HXDR$u~qjpqy!R2x2TMR1ws!kX=}n3yy%fm63;CtSKkswb|c(Zq^P1) zcx}Rsn4}|xq3q|?$WDx<+s11{T2ZFKyb7e;9s1CoFVeHe1BdEzs-^%fH~f30g?}{& z=lXE|OMaODRcY;wtsVZO(t?%5|2P3Q-Vo$97c(Tx3!Ouk7z|8hxgF=vInOV6MbPu! z#)QP^u+WsomZw;))9{Ym#oc}uxRb8!Hc9M_*#}T}J2J8)vC4i~;-nvIDYe*H2t*>J z;|<`T5CIy#(PJ1UBXUtO-|wj`vMVBNiarc_{`Y8AKxsJ*hyVZ+!9QrhKPCEqgxmdk z-T?-}ZyDA|Ymj{gv)Ohfda|7>ndq&n+RI^L**!~u$Ucf=ugxVpP@cMubB*m6DAM6R zzT50BD^JJ(yCOkU6f;T{Ze0}Epo8|Z9d~qnQLT^i+B`sjruY6BgTo1St|w}$m zO3T9ra)547DMN7~jQ-?e@2Sojpf8O9tXjwf9%`2RV}&)dr&h!k4x(ir5K_ohI?;;E zG|^p^>9!oG^xst`26cAYixG{F?>n!$nhnHPC=1J7F}6*OgT0e?SkamZ!+?B*F1F0s zGUYxX&x=91R;d4dxu5H=JRP>|&n>*vubw6oMR}5cM%@~SF$(m~YT#Xk`UyF{GZG8= zL7+U@q3V@}(<6?DC*wCKa&Veu(HPdS)_@{#r=A^Sdb&WFo+dD$KDixf=bJ=4#QG|g zA>rMqRVoTMJ`euswgIEtJg<_A-# z9qCu2Oes|wII)wwF^XPh>kFd|p97)^=kq+bHr2(!}e2oUgbUBua1?u7~ z&B<^{av@U0aBfe8tMDUCaP((P5K6rL&1-2pzqM=HaTXA(vy+H7=U$GR?4WZgb;yK| z<9wm*%Wg$~E!*zZRit$w0yuyHTQM$tu~5)GIPy>78_5W`yCde8;*gV#CxWl9g3{*Q zqXZN8cZ+$_$XIpT_ywMfwGPXs*TCiV=6f$u* zi$2i!IYy&@?1w)9(W~BvsV@#^}{PVA~}vlO-OK!0l`A>WW2sK z>e%PeAH`}-O=c=vn#}91XRqt-3^{m9zVCdSj*x&lls3Xo`Io~S+pB6R6nL9g3GbSd z4X6ZKZumUz9vPt45KcybO;#5Xnn5E z*3J1!4UaCGqR$;-NBmSv5GF;hPF=viP)u2rUr#d=ZICS<+~V@b!tiE1#%3aldEdx@1UDRAn_M6U7cMeDRVJ5vq4qS)l{ zw4*xMD3TsQ>@Wge6}^3m*6Na`|Dox=R9J-!+?5yg8MSkAs3nxse6}rv$>M^Q;3dCH zYYlz0>sj6%=9Rmpzu70VX8ZOUC5_n3Lx6hF!L@FW9$Dd4B)RGLF;*H+3+tfk3mwuB z8pnvYmdt3}g~qIwV6JEEbh*nTzYOg(^tNQESuntYo3EK00V!-e5^2YmDDeia9tmQ6 zxjM&q%|rr`LYSo+J0wxiI3L+ngDUBwFnQHgdrwkd11)%=u=J-)e6`hzKXhu}{X~1s zJFZZYt-iswrONRvq7ZiV@nlQn^4!0mw)+l2aqX_r;MZWpaZQr4ki{VNt|!%vM`Tzz zRTC*kg_E0b*@V=~PXTy)uO!`?qYSRwvan`+uaj-o>*2UF=&jeNp(Z<0?&LX&hV^LL z_QeRK7{ELhV!2d#GK&%Rm=`WO^5DJ^cmt~qS*WA9RBg9xErY19A)BM&b$+Qe!;6y) z1{JZKa5k>8Wyspf&hn4H%Ay}0qCtfG57p6c}vrXI*ZDQS|_#6ds8Zqh!=+65)a#LKU?wL zW8qS4rE4OBBw8vi3!d7s7n+<3O>ua|`msNkXRC|~r?1WeRZ2OA5i9KXTtCpK#_U!^jGa%@4q-pv!+&8N~Gd<%T43UCkV<$w2%9*))z1N*Pr z|Li3FKjWW!Nq;PUkVy}N=VAVt_5a_E`iIWa?}+}QJ?^3W!TF08@o@Va?QuutG3v2t z{2R6U^bzX6EabV0q)p66q(@roG3l}L`Atg1dPMqj-~K}fJw`qLpZrEe68 -#include -#include -#include "world.h" -#include "game.h" - -// Start is called one in the beginning -void* init_game(){ - // Allocate memory for the state - struct game* st = calloc(1,(sizeof(struct game))); - // Initialize state - st->mousex = 5; - st->mousey = 5; - st->catx = 0; - st->caty = 0; - st->catx_position = 15; - st->caty_position = 15; - // Store pointer to the state to the world variable - return st; -} - -// Step is called in a loop once in interval. -// It should modify the state and draw it. -int game_event(struct event* event,void* game){ - // Get state pointer - struct game* state = game; - char msg[200]; - sprintf(msg,"%d",event->type); - set_message(msg,10,0); - if ( event->type == EVENT_ESC){ - // Non zero means finish the loop and stop the game. - return 1; - } - // Read game variable and update the eventstate - - // Is mouse caught ? - if ((state->caty_position == state->mousey) && (state->catx_position == state->mousex)){ - clear_screen(); - set_message("HAM",12,13); - return 0; - } - else if(event->type == EVENT_TIMEOUT) { - // Move cat - //state->catx_position += state->catx; - //state->caty_position += state->caty; - int cx = state->catx_position + state->catx; - int cy = state->caty_position + state->caty; - if (cx < 0 || cy < 0 || cx > event->width || cy > event->height){ - - } - else { - state->catx_position = cx; - state->caty_position = cy; - } - - //state->catx_position += state->catx; - //state->caty_position += state->caty; - //state->caty_position += state->caty; - // random mouse movement - int m = rand() % 6; - if (m == 0){ - state->mousey -= 1; - } - else if (m == 1){ - state->mousey += 1; - } - else if (m == 2){ - state->mousex -= 1; - } - else if (m == 3){ - state->mousex += 1; - } - // Je myska mimo plochy - } - else if (event->type == EVENT_KEY){ - // Move cat according to keyboard - if ( event->key == KEY_UP){ - state->catx = 0; - state->caty = -1; - } - else if ( event->key == KEY_DOWN){ - state->catx = 0; - state->caty = 1; - } - else if ( event->key == KEY_LEFT){ - state->catx = -1; - state->caty = 0; - } - else if ( event->key == KEY_RIGHT){ - state->catx = +1; - state->caty = 0; - } - } - // Draw world state - // - // Draw cat - clear_screen(); - set_color_cell('c',state->catx_position,state->caty_position,COLOR_YELLOW,COLOR_RED); - set_color_cell('-',state->catx_position-1,state->caty_position,COLOR_YELLOW,COLOR_GREEN); - //set_cell('c',state->catx_position,state->caty_position); - // Draw mouse - set_cell('m',state->mousex,state->mousey); - set_message( state->message,1,0); - return 0; -} - diff --git a/world-master/game.h b/world-master/game.h deleted file mode 100644 index 29b14fb..0000000 --- a/world-master/game.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _GAME_H_INCLUDE_ -#define _GAME_H_INCLUDE_ -#include "world.h" - -// Set of variables that expresses state of the game. -// -struct game { - // X speed of the cat - int catx; - // Y speed of the cat - int caty; - // X position of the cat - int catx_position; - // Y opsition of the cat - int caty_position;; - // X position of the mouse - int mousex; - // Y position of the mouse - int mousey; - // Funky message - char message[100]; -}; - -// Returns pointer to newly allocated state -void* init_game(); - -// Changes world according to the game state (pressed key, screen size or other event) -int game_event(struct event* event,void* game); - -#endif diff --git a/world-master/main.c b/world-master/main.c deleted file mode 100644 index 0446027..0000000 --- a/world-master/main.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "game.h" -#include "world.h" -#include - - -int main(int argc, char** argv){ - start_world(init_game,game_event,free); - return 0; -} diff --git a/world-master/world.c b/world-master/world.c deleted file mode 100644 index a45c109..0000000 --- a/world-master/world.c +++ /dev/null @@ -1,198 +0,0 @@ -#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; - } - noecho(); // Nevypisuj vstup na obrazovku - cbreak(); // Zabudni starý vstup - nodelay(stdscr,TRUE); // Nečakaj na stlačenie - keypad(stdscr,TRUE); // Aktivuje šípky - curs_set(FALSE); // Neviditeľný kurzor - /* Get all the mouse events */ - mousemask(ALL_MOUSE_EVENTS, NULL); - MEVENT mouse_event; - 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; - event.key = getch(); - // No key was pressed - if (event.key == ERR){ - event.type = EVENT_TIMEOUT; - last_timeout = clock(); - next_timeout = last_timeout + TIMEOUT; - } - // Mouse event - else if (event.key == KEY_MOUSE ){ - event.type = EVENT_MOUSE; - if(getmouse(&mouse_event) == OK){ - event.mouse_x = mouse_event.x; - event.mouse_y = mouse_event.y; - if(mouse_event.bstate & BUTTON1_PRESSED){ - event.mouse_left = 1; - } - if(mouse_event.bstate & BUTTON2_PRESSED){ - event.mouse_middle = 1; - } - if(mouse_event.bstate & BUTTON3_PRESSED){ - event.mouse_right = 1; - } - } - } - else if (event.key == KEY_RESIZE) { - event.type = EVENT_RESIZE; - } - else{ - event.type = EVENT_KEY; - if (event.key == 27){ - int k = getch(); - if (k == -1){ - // Esc Was pressed - event.type = EVENT_ESC; - } - else { - // Alt was pressed - event.key = k; - event.alt_key = 1; - } - } - } - // 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/world-master/world.h b/world-master/world.h deleted file mode 100644 index 73be057..0000000 --- a/world-master/world.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef _WORLD_H_ -#define _WORLD_H_ - -#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; -}; - -/** - * 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); - - -/** - * - * @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