TP_13 exo2: Finish the implementation of a basic tic-tac-toe game.
[TD_C.git] / TP_13 / exo2 / src / main.c
index 390bc40005122a294846808868852871354b1235..8978ef2eee6ed33ce70c14b70a4f956e428769c7 100644 (file)
@@ -8,9 +8,13 @@
 
 int main() {
     int row, col, errno = 0, round = 0, player = 0, key_pressed;
+    bool winning_condition = false;
+    bool loop_exit_condition = false;
     const int str_max_length = 255;
+    /* FIXME: make a strings handling library */
     char* top_msg = malloc(str_max_length * sizeof(char));
     char* back_msg = malloc(str_max_length * sizeof(char));
+    char* exit_msg = malloc(str_max_length * sizeof(char));
 
     initscr();
     getmaxyx(stdscr, row, col);
@@ -43,69 +47,95 @@ int main() {
 
         print_coordinates(coordinates_array, base_y, base_x);
 
-        /* getch() is blocking */
-        key_pressed = getch();
-        switch (key_pressed) {
-            case 'a':
-                new_coordinates = set_coordinates(1, 1, player);
-                break;
-            case 'z':
-                new_coordinates = set_coordinates(1, 2, player);
-                break;
-            case 'e':
-                new_coordinates = set_coordinates(1, 3, player);
-                break;
-            case 'q':
-                new_coordinates = set_coordinates(2, 1, player);
-                break;
-            case 's':
-                new_coordinates = set_coordinates(2, 2, player);
-                break;
-            case 'd':
-                new_coordinates = set_coordinates(2, 3, player);
-                break;
-            case 'w':
-                new_coordinates = set_coordinates(3, 1, player);
-                break;
-            case 'x':
-                new_coordinates = set_coordinates(3, 2, player);
-                break;
-            case 'c':
-                new_coordinates = set_coordinates(3, 3, player);
-                break;
-            default:
-                /* set invalid coordinates */
-                new_coordinates = set_coordinates(0, 0, player);
-                break;
+        /* FIXME: group the winning case code blocks */
+        if (!winning_condition) {
+            /* getch() is blocking */
+            key_pressed = getch();
+            switch (key_pressed) {
+                case 'a':
+                    new_coordinates = set_coordinates(1, 1, player);
+                    break;
+                case 'z':
+                    new_coordinates = set_coordinates(1, 2, player);
+                    break;
+                case 'e':
+                    new_coordinates = set_coordinates(1, 3, player);
+                    break;
+                case 'q':
+                    new_coordinates = set_coordinates(2, 1, player);
+                    break;
+                case 's':
+                    new_coordinates = set_coordinates(2, 2, player);
+                    break;
+                case 'd':
+                    new_coordinates = set_coordinates(2, 3, player);
+                    break;
+                case 'w':
+                    new_coordinates = set_coordinates(3, 1, player);
+                    break;
+                case 'x':
+                    new_coordinates = set_coordinates(3, 2, player);
+                    break;
+                case 'c':
+                    new_coordinates = set_coordinates(3, 3, player);
+                    break;
+                default:
+                    /* set invalid coordinates */
+                    new_coordinates = set_coordinates(0, 0, player);
+                    break;
+            }
+            errno = add_coordinates(new_coordinates, coordinates_array, round);
+            winning_condition = chk_win_conditions(coordinates_array, round);
         }
 
-        errno = add_coordinates(new_coordinates, coordinates_array, round);
-
-        if (errno == 2) {
-            back_msg = "Choisir une case vide";
-        } else if (errno == 3) {
-            back_msg = "Coordonnees invalides";
-        } 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 = "";
+        if (winning_condition) {
+            if (player == 0) {
+                back_msg = "Joureur 1 gagne !";
+            } else {
+                back_msg = "Joureur 2 gagne !";
+            }
+        }
+
+        if (!winning_condition) {
+            if (errno == 2) {
+                back_msg = "Choisir une case vide";
+            } else if (errno == 3) {
+                back_msg = "Coordonnees invalides";
+            } 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 = "";
+            }
         }
 
         mvprintw(base_y + 10, (base_x + 7 - strlen(back_msg)/2), back_msg);
 
+        if (winning_condition || errno == 1) {
+            /* print the updated coordinates before exiting */
+            print_coordinates(coordinates_array, base_y, base_x);
+            exit_msg = "Pressez une touche pour sortir";
+            mvprintw(base_y + 12, (base_x + 7 - strlen(exit_msg)/2), exit_msg);
+            loop_exit_condition = true;
+        }
+
         refresh();
 
-    } while (errno != 1);
+    } while (!loop_exit_condition);
+
+    /* getch() is blocking */
+    getch();
+
+    endwin();
 
     if (!top_msg)
         free(top_msg);
     if (!back_msg)
         free(back_msg);
-
-    endwin();
+    if (!exit_msg)
+        free(exit_msg);
 
     exit(EXIT_SUCCESS);
 }