From 9240af1ae3159c7ba2f1ff1152089efd7fa5e38e Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Wed, 23 Aug 2017 21:02:24 +0200 Subject: [PATCH] Finalize the implementation of the playable shots list displaying MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- Makefile | 4 ++-- lib/constants.h | 1 - lib/list.h | 2 ++ lib/othello.c | 52 +++++++++++++++++++++++++++++-------------------- lib/othello.h | 3 +++ lib/ui.c | 12 ++++++++++-- lib/ui.h | 4 +++- src/main.c | 4 ++++ 8 files changed, 55 insertions(+), 27 deletions(-) diff --git a/Makefile b/Makefile index 16a35a1..1019d5e 100644 --- a/Makefile +++ b/Makefile @@ -22,8 +22,8 @@ SRC_PATH:=src LIBRARY_NAME:=lib$(BINARY_NAME) LIBRARY_PATH:=lib LDLIBS:=-l$(BINARY_NAME) -lncurses -ltinfo -#BUILD_TYPE:=debug -BUILD_TYPE:=release +BUILD_TYPE:=debug +#BUILD_TYPE:=release # ==================================== # DO NOT CHANGE STUFF BEYOND THIS LINE diff --git a/lib/constants.h b/lib/constants.h index e7f1e5c..88c466e 100644 --- a/lib/constants.h +++ b/lib/constants.h @@ -42,4 +42,3 @@ extern const unsigned int west; extern const unsigned int north_west; #endif /* CONSTANTS_H */ - diff --git a/lib/list.h b/lib/list.h index 98b5b25..b9d8cba 100644 --- a/lib/list.h +++ b/lib/list.h @@ -21,6 +21,8 @@ struct list_head { struct list_head *next, *prev; }; +#define typeof __typeof__ + #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ diff --git a/lib/othello.c b/lib/othello.c index a66a121..1bc32e2 100644 --- a/lib/othello.c +++ b/lib/othello.c @@ -82,7 +82,7 @@ void set_pawn(int y, int x, unsigned int type, unsigned int pawn_array[board_siz if (type > 0 && type < 3 && \ is_valid_coordinates(y, x)) { pawn_array[y-1][x-1] = type; - } + } //FIXME: else case should set invalid values to permit to catch errors } /* reverse the pawn at (y, x) coordinates if it exists */ @@ -232,6 +232,7 @@ static bool is_legal_shot(int y, int x, unsigned int current_player, unsigned in return true; } } + return false; } /* play the shot if legal and flip or reverse the necessary pawns */ @@ -247,40 +248,49 @@ unsigned int valid_shot(int y, int x, unsigned int current_player, unsigned int } if (nb_pawns_reversed == 0) { - return 0; + return nb_pawns_reversed; } set_pawn(y, x, current_player, pawn_array); return nb_pawns_reversed; } -struct shots_list_s build_playable_shots_list(int y, int x, unsigned int current_player, unsigned int pawn_array[board_size][board_size]) { - - for (unsigned int i = 0; i <= board_size; i++) { - for (unsigned int j = 0; j <= board_size; j++) { - if (is_legal_shot(y, x, current_player, pawn_array)) { - - } - } +static void add_shots_list_cell(int y, int x, unsigned int type, struct shots_list_s* shots_list) { + struct shots_list_s* list_cell = malloc(sizeof(struct shots_list_s)); + if (!list_cell) { + exit(EXIT_FAILURE); } -} - -void create_shots_list_cell(struct shots_list_s* shots_list_cell) { + if (type > 0 && type < 5 && is_valid_coordinates(y, x)) { + list_cell->y = y; + list_cell->x = x; + list_cell->type = type; + list_add_tail(&(list_cell->list), &(shots_list->list)); + } } -static void set_shots_list_coordinates(int y, int x, struct shots_list_s* shots_list) { +void free_shots_list(struct shots_list_s* shots_list) { + struct shots_list_s* list_counter; - if (is_valid_coordinates(y, x)) { - shots_list->y = y; - shots_list->x = x; + while (!list_empty(&shots_list->list)) { + list_counter = list_entry(shots_list->list.next, struct shots_list_s, list); + list_del(&list_counter->list); + free(list_counter); } + } -void set_shots_lists_cell(int y, int x, unsigned int type, struct shots_list_s* shots_list) { +void build_playable_shots_list(unsigned int current_player, struct shots_list_s* shots_list, unsigned int pawn_array[board_size][board_size]) { - if (type > 0 && type < 5) { - set_shots_list_coordinates(y, x, shots_list); - shots_list->type = type; + for (unsigned int i = 0; i <= board_size; i++) { + for (unsigned int j = 0; j <= board_size; j++) { + if (is_legal_shot(i, j, current_player, pawn_array)) { + add_shots_list_cell(i, j, hint_allowed, shots_list); + /* FIXME: a neighbourhood detection is needed + } else if (is_box_type(i, j, pawn_array, empty)){ + add_shots_list_cell(i, j, hint_forbidden, shots_list); + */ + } + } } } diff --git a/lib/othello.h b/lib/othello.h index 9800676..7146617 100644 --- a/lib/othello.h +++ b/lib/othello.h @@ -47,4 +47,7 @@ unsigned int count_pawns_type(unsigned int pawn_array[board_size][board_size], u unsigned int valid_shot(int y, int x, unsigned int current_player, unsigned int pawn_array[board_size][board_size]); +void build_playable_shots_list(unsigned int current_player, struct shots_list_s* shots_list, unsigned int pawn_array[board_size][board_size]); +void free_shots_list(struct shots_list_s* shots_list); + #endif /* OTHELLO_H */ diff --git a/lib/ui.c b/lib/ui.c index 4242ac0..02eecce 100644 --- a/lib/ui.c +++ b/lib/ui.c @@ -19,8 +19,8 @@ #include #include "ui.h" -#include "othello.h" #include "debug.h" +#include "list.h" /* in all print routine, y and x are the coordinates of the first character of the shape * which can be a space ' ' */ @@ -78,7 +78,7 @@ static void print_o(int y, int x, unsigned int type) { set_default_colors(); } -/* will be used for pawn placement hints */ +/* used for pawn placement hints */ static void print_x(int y, int x, unsigned int type) { if (type == hint_allowed) { @@ -129,6 +129,14 @@ void print_pawns(int base_y, int base_x, unsigned int pawn_array[board_size][boa } } +void print_shots_list(int base_y, int base_x, struct shots_list_s* shots_list) { + struct shots_list_s* list_counter; + + list_for_each_entry(list_counter, &shots_list->list, list) { + print_x(base_y + remap_y(list_counter->y), base_x + remap_x(list_counter->x), list_counter->type); + } +} + int map_col_letter_to_index(char c) { if (c == 'a' || c == 'A') { diff --git a/lib/ui.h b/lib/ui.h index c93a091..67ec2d6 100644 --- a/lib/ui.h +++ b/lib/ui.h @@ -3,7 +3,7 @@ * * Filename: ui.h * - * Description: Header for user interface routines + * Description: Header for user interface routines * * Version: 1.0 * Created: 15/03/2017 20:07:12 @@ -22,6 +22,7 @@ #include #include "constants.h" +#include "othello.h" int prompt_values(WINDOW* windows, int base_y, int base_x, const char* msg, int* y, char* x); @@ -31,6 +32,7 @@ char map_col_index_to_letter(int index); /* ncurses printing */ void print_board(int y, int x); void print_pawns(int base_y, int base_x, unsigned int pawn_array[board_size][board_size]); +void print_shots_list(int base_y, int base_x, struct shots_list_s* shots_list); /* non ncurses printing */ diff --git a/src/main.c b/src/main.c index 03b75cb..a86a7ef 100644 --- a/src/main.c +++ b/src/main.c @@ -77,6 +77,10 @@ int main() { mvprintw(center_y, center_x - 42/2 - snprintf(NULL, 0, score_msg, "noirs", nb_black) - 2, score_msg, "noirs", nb_black); mvprintw(center_y, center_x + 42/2 + 2, score_msg, "blancs", nb_white); + build_playable_shots_list(player, &playable_shots, pawns); + print_shots_list(board_center_y, board_center_x, &playable_shots); + free_shots_list(&playable_shots); + display_array(1, 1, pawns); int y; -- 2.34.1