TP 13 exo2: Implement the missing bits to do a full game.
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 19 Mar 2017 16:38:11 +0000 (17:38 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 19 Mar 2017 16:38:11 +0000 (17:38 +0100)
Still missing the win condition check.

Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
TP_13/exo1/lib/io.c
TP_13/exo1/lib/io.h
TP_13/exo1/lib/utils.c
TP_13/exo1/lib/utils.h
TP_13/exo2/lib/coordinates.c
TP_13/exo2/lib/coordinates.h
TP_13/exo2/src/main.c

index e5a300070d24305638d8f140b866b480950a93d6..69b13d768f2b68e4cd0a01e01f2e23ab30a8368a 100644 (file)
@@ -1,9 +1,9 @@
+#include <stdlib.h>
 #include <stdio.h>
 #include <stdbool.h>
 
 #include "io.h"
 #include "array.h"
-#include "utils.h"
 
 int prompt_value(const char* msg, int* result) {
     puts(msg);
@@ -108,6 +108,14 @@ void do_resize(int array[], unsigned* old_size) {
     *old_size = new_size;
 }
 
+void handle_prompt_error(int errno) {
+    if (errno != 0) {
+        printf("\nMerci de saisir un nombre entier, exiting\n");
+        /* it's somewhat violent but better than looping forever */
+        exit(EXIT_FAILURE);
+    }
+}
+
 void display_array(int array[], unsigned size) {
     if (array != NULL) {
         printf("\n--array begin--\n");
index 24de1b1613de17b5f65833080932824dc423de4f..6dfc77aa392459b2016b0cf7ab87bc5af6c5dadc 100644 (file)
@@ -3,6 +3,7 @@
 
 int prompt_value(const char* msg, int* result);
 int* prompt_array(int array[], unsigned* size);
+void handle_prompt_error(int errno);
 
 void display_choice_menu();
 
index 5139bae1bccf69facf4748275a45c3da141732dd..1f0b1401057d1664e667a9f5a2e3d08e94ddcaef 100644 (file)
@@ -13,11 +13,3 @@ void swap_ptr(void* v1, void* v2) {
     v1 = v2;
     v2 = tmp;
 }
-
-void handle_prompt_error(int errno) {
-    if (errno != 0) {
-        printf("\nMerci de saisir un nombre entier, exiting\n");
-        /* it's somewhat violent but better than looping forever */
-        exit(EXIT_FAILURE);
-    }
-}
index fe3fa080a9ed89e0b16ff99a81148b5742426425..03f1226cd677d034a7285dff4cfe3cc0081ff150 100644 (file)
@@ -6,6 +6,4 @@
 void swap_int(int* v1, int* v2);
 void swap_ptr(void* v1, void* v2);
 
-void handle_prompt_error(int errno);
-
 #endif /* UTILS_H */
index f9123e95f7b25a2902efdb68cb2e587bc59dc9dd..a9d8159a3584af3fc321d4857d4f73d558d80267 100644 (file)
@@ -33,11 +33,16 @@ coordinates_t set_coordinates(int y, int x, unsigned type) {
     return new_coordinates;
 }
 
-unsigned add_coordinates(coordinates_t new_coordinates, coordinates_t* coordinates_array) {
+/* the function do a lot of sanity checks before adding new board elements,
+ * hence the loop. moving the checks in the main loop is also possible */
+unsigned add_coordinates(coordinates_t new_coordinates, coordinates_t* coordinates_array, unsigned round) {
     /* valid coordinates are in the [1-3] range */
     if (new_coordinates.y < 1 || new_coordinates.y > 3 || new_coordinates.x < 1 || new_coordinates.x > 3) {
         return 3; /* error value for invalid coordinates */
+    } else if (round == MAX_COORDINATES + 1) {
+        return 1; /* error value for full array */
     }
+
     for (unsigned i = 0; i < MAX_COORDINATES; i++) {
         /* check if already entered */
         if (new_coordinates.y == (coordinates_array + i)->y && new_coordinates.x == (coordinates_array + i)->x) {
@@ -47,5 +52,12 @@ unsigned add_coordinates(coordinates_t new_coordinates, coordinates_t* coordinat
             return 0; /* error value when everything if fine */
         }
     }
-    return 1; /* error value for full array */
+    return 4; /* error value for unknown error case - should never happen - */
+}
+
+bool chk_win_conditions(coordinates_t* coordinates_array) {
+    for (unsigned i = 0; i < MAX_COORDINATES; i++) {
+
+    }
+    return false;
 }
index 873d404735e9325853fff3703a8c636df4798520..3a17ade5a608a152f621d6a7fefa15b3915f9e61 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef COORDINATES_H
 #define COORDINATES_H
 
+#include <stdbool.h>
+
 /* we only have nine elements in the grid */
 #define MAX_COORDINATES 9
 
@@ -30,6 +32,7 @@ typedef struct coordinates_s {
 
 void init_coordinates(coordinates_t* coordinates_array);
 coordinates_t set_coordinates(int y, int x, unsigned type);
-unsigned add_coordinates(coordinates_t new_coordinates, coordinates_t* coordinates_array);
+unsigned add_coordinates(coordinates_t new_coordinates, coordinates_t* coordinates_array, unsigned round);
+bool chk_win_conditions(coordinates_t* coordinates_array);
 
 #endif /* COORDINATES_H */
index 0606beba47b507e5f49dbf755df029a907a27075..390bc40005122a294846808868852871354b1235 100644 (file)
@@ -8,8 +8,9 @@
 
 int main() {
     int row, col, errno = 0, round = 0, player = 0, key_pressed;
-    char* top_msg = "";
-    char* back_msg = "";
+    const int str_max_length = 255;
+    char* top_msg = malloc(str_max_length * sizeof(char));
+    char* back_msg = malloc(str_max_length * sizeof(char));
 
     initscr();
     getmaxyx(stdscr, row, col);
@@ -28,19 +29,21 @@ int main() {
     print_board(base_y, base_x);
 
     do {
-        if (round % 2 == 0 || round == 0) {
-            player = 0;
-            top_msg = "Joueur 1 joue";
-        } else {
+        if (errno == 0) round++;
+
+        if (round % 2 == 0) {
             player = 1;
             top_msg = "Joueur 2 joue";
+        } else {
+            player = 0;
+            top_msg = "Joueur 1 joue";
         }
 
         mvprintw(base_y - 2, (base_x + 7 - strlen(top_msg)/2), top_msg);
-        mvprintw(base_y + 10, (base_x + 7 - strlen(back_msg)/2), back_msg);
 
         print_coordinates(coordinates_array, base_y, base_x);
 
+        /* getch() is blocking */
         key_pressed = getch();
         switch (key_pressed) {
             case 'a':
@@ -71,25 +74,36 @@ int main() {
                 new_coordinates = set_coordinates(3, 3, player);
                 break;
             default:
-                continue;
+                /* set invalid coordinates */
+                new_coordinates = set_coordinates(0, 0, player);
                 break;
         }
 
-        errno = add_coordinates(new_coordinates, coordinates_array);
+        errno = add_coordinates(new_coordinates, coordinates_array, round);
 
         if (errno == 2) {
             back_msg = "Choisir une case vide";
-            continue;
         } else if (errno == 3) {
             back_msg = "Coordonnees invalides";
-            continue;
+        } else if (errno == 1) {
+            back_msg = "Tableau rempli sans gagnant: egalite";
+        } else if (errno == 4) {
+            back_msg = "Erreur inconnue";
         } else if (errno == 0) {
+            /* FIXME: properly zero the string */
             back_msg = "";
         }
 
-        round++;
+        mvprintw(base_y + 10, (base_x + 7 - strlen(back_msg)/2), back_msg);
+
+        refresh();
+
+    } while (errno != 1);
 
-    } while (errno == 0 || errno == 2);
+    if (!top_msg)
+        free(top_msg);
+    if (!back_msg)
+        free(back_msg);
 
     endwin();