Finalize the implementation of the playable shots list displaying playable_shots
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 23 Aug 2017 19:02:24 +0000 (21:02 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 23 Aug 2017 19:02:24 +0000 (21:02 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
Makefile
lib/constants.h
lib/list.h
lib/othello.c
lib/othello.h
lib/ui.c
lib/ui.h
src/main.c

index 16a35a11a537ea3c5be2f7ea99cd4f56912c97e7..1019d5edd553ce3fac0930866eb21bd660ec4e93 100644 (file)
--- 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
index e7f1e5ca2ce2d3a31698ab6a731ebab3f0c2c5ae..88c466e0462d6dd8430145956ede7c5674720f59 100644 (file)
@@ -42,4 +42,3 @@ extern const unsigned int west;
 extern const unsigned int north_west;
 
 #endif /* CONSTANTS_H */
-
index 98b5b259de0c4db8f0acb96446ccd5c9a0bff5e1..b9d8cba65aba6127f8af6f3b80427c91adbcf1bb 100644 (file)
@@ -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) \
index a66a121f2e57aa56aa8ff4c9204593abd19c60ff..1bc32e2fe1969b082424ab00bfa8af89845b10c6 100644 (file)
@@ -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);
+            */
+            }
+        }
     }
 }
index 9800676693bd58f59919d56269428f3ed00c30ad..7146617a7a4136d3e2684cc0b6ece662597beea4 100644 (file)
@@ -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 */
index 4242ac079946b19404748af24f7540a24cd6c7e3..02eecce54232aaa14b73110735f440dd76e1036c 100644 (file)
--- a/lib/ui.c
+++ b/lib/ui.c
@@ -19,8 +19,8 @@
 #include <string.h>
 
 #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') {
index c93a091f681cec305b33cd1e3f0f7aee9cbf3781..67ec2d6f0718540ff55e9cd0d037a60990742f73 100644 (file)
--- 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 <ncurses.h>
 
 #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 */
 
index 03b75cb50175613fa98cde36f8a1c7b6b61b7ed2..a86a7efd94f125123d6aca435bfb62fdde7599b8 100644 (file)
@@ -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;