/* This file is a part of othello-ai-guile-c * * Copyright (C) 2021 Robby Zambito * * othello-ai-guile-c is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * othello-ai-guile-c is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include "othello.h" #include "othello_move.h" #define STREQ(a, b) (strcmp(a, b) == 0) static enum player_color current_player; enum player_color get_current_player(void) { return current_player; } struct move (*player_one_get_move)(); struct move (*player_two_get_move)(); static struct move current_player_move(enum player_color current_player, char *player_one_strategy_path, char *player_two_strategy_path) { struct move move = {-1, -1}; if ((current_player == WHITE && player_one_strategy_path == NULL) || (current_player == BLACK && player_two_strategy_path == NULL)) { move = prompt_get_move(current_player); } else if (current_player == WHITE) { move = get_scm_move(player_one_strategy_path); } else if (current_player == BLACK) { move = get_scm_move(player_two_strategy_path); } return move; } enum player_color game_loop(char *player_one_strategy_path, char *player_two_strategy_path) { initialize_board(); if (player_one_strategy_path == NULL || player_two_strategy_path == NULL) { using_history(); } current_player = WHITE; #define other_player (current_player == WHITE ? BLACK : WHITE) while (has_valid_moves(current_player)) { struct move move = current_player_move(current_player, player_one_strategy_path, player_two_strategy_path); if (apply_move(get_board(), current_player, move)) { current_player = other_player; } } #undef other_player if (player_one_strategy_path == NULL || player_two_strategy_path == NULL) { rl_clear_history(); } return get_winner(); }