pvjc25/du8/game.c
2025-06-08 12:11:19 +02:00

95 lines
3.0 KiB
C

#include "game.h"
#include "world.h"
void game_init(GameState *game) {
for (int y = 0; y < SIZE; ++y)
for (int x = 0; x < SIZE; ++x)
game->board[y][x] = EMPTY;
game->current_player = X;
game->cursor_x = 0;
game->cursor_y = 0;
game->game_over = 0;
game->winner = EMPTY;
}
void draw(void *state) {
GameState *game = (GameState *)state;
world_clear();
for (int y = 0; y < SIZE; ++y) {
for (int x = 0; x < SIZE; ++x) {
world_set_color((x == game->cursor_x && y == game->cursor_y) ? 2 : 1);
char *symbol = "[ ]";
if (game->board[y][x] == X) symbol = "[X]";
else if (game->board[y][x] == O) symbol = "[O]";
world_draw_string(x * 4, y * 2, symbol);
}
}
if (game->game_over) {
world_set_color(3);
world_draw_string(0, SIZE * 2 + 1, game->winner == EMPTY ? "Remiza!" :
(game->winner == X ? "Vyhral X!" : "Vyhral O!"));
}
}
void check_winner(GameState *game) {
for (int i = 0; i < SIZE; ++i) {
if (game->board[i][0] != EMPTY &&
game->board[i][0] == game->board[i][1] &&
game->board[i][1] == game->board[i][2]) {
game->winner = game->board[i][0];
game->game_over = 1;
return;
}
if (game->board[0][i] != EMPTY &&
game->board[0][i] == game->board[1][i] &&
game->board[1][i] == game->board[2][i]) {
game->winner = game->board[0][i];
game->game_over = 1;
return;
}
}
if (game->board[0][0] != EMPTY &&
game->board[0][0] == game->board[1][1] &&
game->board[1][1] == game->board[2][2]) {
game->winner = game->board[0][0];
game->game_over = 1;
return;
}
if (game->board[0][2] != EMPTY &&
game->board[0][2] == game->board[1][1] &&
game->board[1][1] == game->board[2][0]) {
game->winner = game->board[0][2];
game->game_over = 1;
return;
}
int full = 1;
for (int y = 0; y < SIZE; ++y)
for (int x = 0; x < SIZE; ++x)
if (game->board[y][x] == EMPTY)
full = 0;
if (full) {
game->game_over = 1;
game->winner = EMPTY;
}
}
void key_handler(int key, void *state) {
GameState *game = (GameState *)state;
if (game->game_over) return;
switch (key) {
case 'w': if (game->cursor_y > 0) game->cursor_y--; break;
case 's': if (game->cursor_y < SIZE - 1) game->cursor_y++; break;
case 'a': if (game->cursor_x > 0) game->cursor_x--; break;
case 'd': if (game->cursor_x < SIZE - 1) game->cursor_x++; break;
case ' ': {
if (game->board[game->cursor_y][game->cursor_x] == EMPTY) {
game->board[game->cursor_y][game->cursor_x] = game->current_player;
check_winner(game);
if (!game->game_over)
game->current_player = (game->current_player == X) ? O : X;
}
} break;
}
}
void update(void *state) { }