pvjc25/a4/a3/game.c
2025-05-03 11:41:49 +02:00

109 lines
3.2 KiB
C

#include <curses.h>
#include <stdlib.h>
#include <string.h>
#include "world.h"
#include "game.h"
// Funkcia sa zavolá na začiatku hry
void* init_game() {
// Vytvoríme stav hry
struct game* stav = calloc(1, sizeof(struct game));
// Nastavíme počiatočné pozície
stav->myska_x = 5;
stav->myska_y = 5;
stav->macka_smer_x = 0;
stav->macka_smer_y = 0;
stav->macka_x = 15;
stav->macka_y = 15;
stav->skore = 0;
stav->koniec_hry = 0;
strcpy(stav->sprava, "Chyt myšku! Používaj šípky.");
return stav;
}
// Hlavná herná slučka - volá sa stále dokola
int game_event(struct event* event, void* game) {
struct game* stav = game;
// Ak stlačil ESC, koniec hry
if (event->type == EVENT_ESC) {
return 1;
}
// Ak je koniec hry, nič nerob
if (stav->koniec_hry) {
return 0;
}
// Kontrola, či mačka chytila myšku
if (stav->macka_x == stav->myska_x && stav->macka_y == stav->myska_y) {
stav->skore++;
sprintf(stav->sprava, "Skóre: %d", stav->skore);
// Nastav novú náhodnú pozíciu myšky
stav->myska_x = rand() % event->width;
stav->myska_y = rand() % event->height;
}
// Pohyb mačky podľa klávesnice
if (event->type == EVENT_KEY) {
if (event->key == KEY_UP) {
stav->macka_smer_x = 0;
stav->macka_smer_y = -1;
}
else if (event->key == KEY_DOWN) {
stav->macka_smer_x = 0;
stav->macka_smer_y = 1;
}
else if (event->key == KEY_LEFT) {
stav->macka_smer_x = -1;
stav->macka_smer_y = 0;
}
else if (event->key == KEY_RIGHT) {
stav->macka_smer_x = 1;
stav->macka_smer_y = 0;
}
}
// Automatický pohyb mačky (každý časový interval)
if (event->type == EVENT_TIMEOUT) {
// Pohyb mačky
int nova_x = stav->macka_x + stav->macka_smer_x;
int nova_y = stav->macka_y + stav->macka_smer_y;
// Kontrola, či je pohyb v rámci obrazovky
if (nova_x >= 0 && nova_x < event->width && nova_y >= 0 && nova_y < event->height) {
stav->macka_x = nova_x;
stav->macka_y = nova_y;
}
// Náhodný pohyb myšky (1 ku 4 šanca, že sa pohne)
if (rand() % 4 == 0) {
int smer = rand() % 4;
switch (smer) {
case 0: if (stav->myska_y > 0) stav->myska_y--; break;
case 1: if (stav->myska_y < event->height-1) stav->myska_y++; break;
case 2: if (stav->myska_x > 0) stav->myska_x--; break;
case 3: if (stav->myska_x < event->width-1) stav->myska_x++; break;
}
}
}
// Vykreslenie hry
clear_screen();
// Vykreslenie mačky (žltá na červenom)
set_color_cell('M', stav->macka_x, stav->macka_y, COLOR_YELLOW, COLOR_RED);
// Vykreslenie myšky (biela na modrom)
set_color_cell('m', stav->myska_x, stav->myska_y, COLOR_WHITE, COLOR_BLUE);
// Vykreslenie správy
set_message(stav->sprava, 1, 0);
return 0;
}