Přidat du8/game.c

This commit is contained in:
Mykola Syniavskyi 2025-06-14 02:57:12 +00:00
parent f210f255f4
commit d43d643858

90
du8/game.c Normal file
View File

@ -0,0 +1,90 @@
#include "game.h"
#include "world.h"
#include <stdio.h>
void init_game(GameState* game) {
for (int y = 0; y < 3; y++)
for (int x = 0; x < 3; x++)
game->board[y][x] = EMPTY;
game->current_player = 0;
game->game_over = 0;
game->winner = 0;
}
void draw_game(GameState *game) {
set_message("TicTakToe / Piškvorky", 15, 2);
for (int y = 0; y < 3; y++) {
char line[20];
int index = 0;
for (int x = 0; x < 3; x++) {
char cell = game->board[y][x];
if (cell == EMPTY) {
cell = '1' + y * 3 + x;
}
line[index++] = ' ';
line[index++] = cell;
if (x < 2) {
line[index++] = ' ';
line[index++] = '|';
}
}
line[index] = '\0';
set_message(line, 17, 4 + y * 2);
if (y < 2) {
set_message("-----------", 17, 5 + y * 2);
}
}
if (game->game_over) {
if (game->winner == 1)
set_message("Game over! Player X won.", 12, 11);
else if (game->winner == 2)
set_message("Game over! Player O won.", 12, 11);
else
set_message("Game over! It's a draw.", 12, 11);
set_message("Press ENTER to restart or Q to quit", 15, 13);
} else {
char msg[32];
sprintf(msg, "Turn of player %c", (game->current_player == 0) ? 'X' : 'O');
set_message(msg, 17, 11);
set_message("Press ENTER to confirm/Q to quit", 17, 13);
}
}
void handle_input(GameState* game, int key) {
if (key >= '1' && key <= '9') {
int pos = key - '1';
int x = pos % 3;
int y = pos / 3;
if (game->board[y][x] == EMPTY) {
game->board[y][x] = (game->current_player == 0) ? PLAYER_X : PLAYER_O;
game->current_player = 1 - game->current_player;
}
}
}
int check_winner(GameState* state) {
Cell (*b)[3] = state->board;
const int win_lines[8][3][2] = {
{{0,0},{0,1},{0,2}}, {{1,0},{1,1},{1,2}}, {{2,0},{2,1},{2,2}},
{{0,0},{1,0},{2,0}}, {{0,1},{1,1},{2,1}}, {{0,2},{1,2},{2,2}},
{{0,0},{1,1},{2,2}}, {{0,2},{1,1},{2,0}}
};
for (int i = 0; i < 8; i++) {
int y0 = win_lines[i][0][0], x0 = win_lines[i][0][1];
int y1 = win_lines[i][1][0], x1 = win_lines[i][1][1];
int y2 = win_lines[i][2][0], x2 = win_lines[i][2][1];
if (b[y0][x0] != EMPTY && b[y0][x0] == b[y1][x1] && b[y1][x1] == b[y2][x2]) {
return (b[y0][x0] == PLAYER_X) ? 1 : 2;
}
}
return 0;
}