From 6a35a3cffd976f6fa9d96759e2f2bb0f784b92ac Mon Sep 17 00:00:00 2001 From: Robby Zambito Date: Thu, 30 Dec 2021 00:02:22 -0500 Subject: Pulled lots of things out of game loop --- src/move.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/move.c (limited to 'src/move.c') diff --git a/src/move.c b/src/move.c new file mode 100644 index 0000000..a22cb59 --- /dev/null +++ b/src/move.c @@ -0,0 +1,95 @@ +/* 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 "othello.h" +#include "othello_move.h" + +#define STREQ(a, b) (strcmp(a, b) == 0) + +static void print_help() { + puts("To enter a move, enter the two row and column seperated by spaces.\n" + "For example `0 0` will select the top left corner.\n\n" + "p - Print the board again\n" + "g - Drop into a guile repl\n" + "\n" + "In the guile repl you can define an AI to use for the current" + "player.\n" + "After you define an AI for that player, it will be used for the rest " + "of the game instead of prompting for input for that user.\n"); +} + +static char *prompt_player(enum player_color current_player) { + switch (current_player) { + case WHITE: + return "Player 1 [h for help] > "; + case BLACK: + return "Player 2 [h for help] > "; + default: + perror("There is no current player"); + exit(EXIT_FAILURE); + } +} + +static void inner_main(void *closure, int argc, char **argv) { + (void)closure; + scm_shell(argc, argv); +} + +struct move prompt_get_move(enum player_color current_player) { + // Initialize move to an invalid move. + struct move move = {-1, -1}; + + char *prompt = prompt_player(current_player); + do { + char *input = readline(prompt); + + if (input != NULL) { + add_history(input); + if (STREQ(input, "h")) { + print_help(); + } else if (STREQ(input, "p")) { + print_board(); + } else if (STREQ(input, "g")) { + int argc = 1; + char **argv = calloc(1, sizeof(char *)); + argv[0] = "othello"; + /*scm_with_guile(void *(*func)(void *), void *data)*/ + scm_boot_guile(argc, argv, inner_main, NULL); + free(argv); + } else { + sscanf(input, "%d %d", &move.row, &move.col); + } + } else { + // If input was NULL, we have reached an EOF and would like to exit. + free(input); + exit(0); + } + + free(input); + } while (!is_valid_move(current_player, move)); + + return move; +} -- cgit v1.2.3