95 lines
3.0 KiB
C
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) { } |