118 lines
3.4 KiB
C
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;
|
|
}
|
|
|