pvjc25/a4/game.c

92 lines
2.9 KiB
C

#include <curses.h>
#include <stdlib.h>
#include <string.h>
#include "world.h"
#include "game.h"
#define NUM_MICE 5
// Start is called once at the beginning
void* init_game() {
struct game* st = calloc(1, sizeof(struct game));
// Initialize mice at random positions
for (int i = 0; i < NUM_MICE; i++) {
st->mousex[i] = rand() % 20 + 1;
st->mousey[i] = rand() % 10 + 1;
}
st->catx = 0;
st->caty = 0;
st->catx_position = 15;
st->caty_position = 15;
return st;
}
// Step is called in a loop once per interval
int game_event(struct event* event, void* game) {
struct game* state = game;
int width = event->width;
int height = event->height;
if (event->type == EVENT_ESC) {
return 1;
}
// Handle keyboard input
if (event->type == EVENT_KEY) {
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; }
}
if (event->type == EVENT_TIMEOUT) {
int cx = state->catx_position + state->catx;
int cy = state->caty_position + state->caty;
// Keep cat inside bounds
if (cx >= 1 && cx < width - 1) state->catx_position = cx;
if (cy >= 1 && cy < height - 1) state->caty_position = cy;
// Move mice randomly
for (int i = 0; i < NUM_MICE; i++) {
int m = rand() % 4;
int mx = state->mousex[i];
int my = state->mousey[i];
if (m == 0 && my > 1) state->mousey[i]--;
else if (m == 1 && my < height - 2) state->mousey[i]++;
else if (m == 2 && mx > 1) state->mousex[i]--;
else if (m == 3 && mx < width - 2) state->mousex[i]++;
}
}
// Check if cat caught any mouse
for (int i = 0; i < NUM_MICE; i++) {
if (state->catx_position == state->mousex[i] && state->caty_position == state->mousey[i]) {
state->mousex[i] = -1; // remove mouse from play
state->mousey[i] = -1;
}
}
// Draw world
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);
int mice_left = 0;
for (int i = 0; i < NUM_MICE; i++) {
if (state->mousex[i] >= 0) {
set_cell('m', state->mousex[i], state->mousey[i]);
mice_left++;
}
}
sprintf(state->message, "Mysky zive: %d", mice_left);
set_message(state->message, 1, 0);
// If all mice are gone, show win message
if (mice_left == 0) {
set_message("Vsetky mysky chytene! Gratulujem!", width / 2 - 10, height / 2);
}
return 0;
}