pvjc25/du8/game.c
2025-06-11 12:22:15 +02:00

118 lines
3.4 KiB
C

#include <stdio.h>
#include "game.h"
#include "world.h" // *
int select_game_mode() {
world_clear(); // *
world_print("Zvol si herny rezim:\n1. PvP\n2. PvE\n3. AI vs Human\n"); // *
char c = world_read_key(); // *
return c - '0';
}
void init_game(GameState *game, int mode) {
game->mode = mode;
game->current_player = 0;
game->moves_made = 0;
char default_symbols[MAX_PLAYERS] = {'X', 'O', 'A', 'B'};
for (int i = 0; i < MAX_PLAYERS; i++) {
game->symbols[i] = default_symbols[i];
}
if (mode == 1) {
game->board_size = 4;
game->num_players = 3;
} else if (mode == 2) {
game->board_size = 2; // začne s 2x2, rastie do 4x4
game->num_players = 2;
} else {
game->board_size = 3;
game->num_players = 2;
}
for (int y = 0; y < MAX_BOARD_SIZE; y++) {
for (int x = 0; x < MAX_BOARD_SIZE; x++) {
game->board[y][x] = ' ';
}
}
}
void draw_game(GameState *game) {
for (int y = 0; y < game->board_size; y++) {
for (int x = 0; x < game->board_size; x++) {
world_set_cursor(x * 4 + 1, y * 2 + 1); // *
world_print("%c", game->board[y][x]); // *
}
}
world_set_cursor(0, game->board_size * 2 + 2); // *
world_print("Na rade je hrac: %c\n", game->symbols[game->current_player]); // *
}
void handle_input(GameState *game) {
int x = 0, y = 0;
while (1) {
world_set_cursor(x * 4 + 1, y * 2 + 1); // *
char key = world_read_key(); // *
if (key == 'w' && y > 0) y--;
else if (key == 's' && y < game->board_size - 1) y++;
else if (key == 'a' && x > 0) x--;
else if (key == 'd' && x < game->board_size - 1) x++;
else if (key == ' ') {
if (game->board[y][x] == ' ') {
game->board[y][x] = game->symbols[game->current_player];
game->moves_made++;
break;
}
}
}
}
void computer_move(GameState *game) {
for (int y = 0; y < game->board_size; y++) {
for (int x = 0; x < game->board_size; x++) {
if (game->board[y][x] == ' ') {
game->board[y][x] = game->symbols[game->current_player];
game->moves_made++;
return;
}
}
}
}
int check_winner(GameState *game) {
int max_line = 0;
int size = game->board_size;
for (int p = 0; p < game->num_players; p++) {
char sym = game->symbols[p];
int longest = 0;
// Kontrola horizontálne, vertikálne a diagonálne
for (int y = 0; y < size; y++) {
int row = 0, col = 0;
for (int x = 0; x < size; x++) {
row = (game->board[y][x] == sym) ? row + 1 : 0;
col = (game->board[x][y] == sym) ? col + 1 : 0;
if (row > longest) longest = row;
if (col > longest) longest = col;
}
}
int diag1 = 0, diag2 = 0;
for (int i = 0; i < size; i++) {
diag1 = (game->board[i][i] == sym) ? diag1 + 1 : 0;
diag2 = (game->board[i][size - 1 - i] == sym) ? diag2 + 1 : 0;
if (diag1 > longest) longest = diag1;
if (diag2 > longest) longest = diag2;
}
if (longest >= 3) {
game->current_player = p;
return 1;
}
if (longest > max_line) {
max_line = longest;
}
}
return 0;
}