/* 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 #include "othello.h" #include "othello_board.h" int main(int argc, char **argv) { int exit_status = EXIT_SUCCESS; static const struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"player-one", required_argument, NULL, '1'}, {"player-two", required_argument, NULL, '2'}, {"scm-final-board", no_argument, NULL, 's'}, {0, 0, 0, 0}}; const char *usage = " -h --help show help output\n" " -1 --player-one specify a file to use for player one strategy\n" " -2 --player-two specify a file to use for player two strategy\n" " -s --scm-final-board print the final board as a Scheme object\n"; char *player_one_strategy_path = NULL; char *player_two_strategy_path = NULL; bool should_print_as_scm = false; int c; while (1) { int option_index = 0; c = getopt_long(argc, argv, "h1:2:s", long_options, &option_index); if (c == -1) { break; } errno = 0; switch (c) { case 'h': printf("%s", usage); exit(EXIT_SUCCESS); case '1': player_one_strategy_path = strdup(optarg); if (access(player_one_strategy_path, F_OK) == -1) { fprintf(stderr, "Could not access player 1 strategy\n"); exit_status = EXIT_FAILURE; } break; case '2': player_two_strategy_path = strdup(optarg); if (access(player_two_strategy_path, F_OK) == -1) { fprintf(stderr, "Could not access player 2 strategy\n"); exit_status = EXIT_FAILURE; } break; case 's': should_print_as_scm = true; break; } } // Couldn't open one or more of the player strategies, bail out. if (exit_status == EXIT_FAILURE) { exit(EXIT_FAILURE); } int white_score, black_score; enum player_color winner = game_loop(player_one_strategy_path, player_two_strategy_path, &white_score, &black_score); free(player_one_strategy_path); free(player_two_strategy_path); if (should_print_as_scm) { // Make sure guile has been initialized. // It probably has, since it is unlikely that the user would want to // print the final board as a Scheme object if they have no Scheme // players... but it is possible. scm_init_guile(); scm_c_eval_string("(use-modules (ice-9 pretty-print))" "(pretty-print (get-board))"); printf("%d\n", white_score); printf("%d\n", black_score); } else { switch (winner) { case WHITE: puts("Congratulations for winning player 1!"); break; case BLACK: puts("Congratulations for winning player 2!"); break; default: puts("The game ended with no winner."); } puts("Here was the final board:"); print_board(get_board(), NULL, 0); printf("Final white score: %d\n", white_score); printf("Final black score: %d\n", black_score); } return EXIT_SUCCESS; }