TP 13 exo2: Implement the missing bits to do a full game.
[TD_C.git] / TP_13 / exo2 / src / main.c
index fcd3bcc04279d7d61d6f5b838e00794d10f6f7ad..390bc40005122a294846808868852871354b1235 100644 (file)
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 #include <ncurses.h>
 
 #include "display.h"
+#include "coordinates.h"
 
 int main() {
-    int row, col;
+    int row, col, errno = 0, round = 0, player = 0, key_pressed;
+    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);
+    getmaxyx(stdscr, row, col);
     noecho();
     curs_set(0);
 
+    /* array of the active coordinates in the entered order */
+    coordinates_t coordinates_array[MAX_COORDINATES];
+    init_coordinates(coordinates_array);
+    coordinates_t new_coordinates = {0, 0, 0};
+
     /* center base coordinates for the board */
-    const int base_y = row/2 - 4;
-    const int base_x = col/2 - 7;
+    int base_y = row/2 - 4;
+    int base_x = col/2 - 7;
 
     print_board(base_y, base_x);
 
-    print_x(base_y, base_x + 1);
-    print_o(base_y, base_x + 6);
-    print_o(base_y, base_x + 11);
-    print_o(base_y + 3, base_x + 1);
-    print_o(base_y + 6, base_x + 1);
-    print_o(base_y + 3, base_x + 6);
-    print_x(base_y + 3, base_x + 11);
-    print_x(base_y + 6, base_x + 6);
-    print_x(base_y + 6, base_x + 11);
-    
-    refresh();
-
-    while (getch() != 'q');
+    do {
+        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);
+
+        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;
+        }
+
+        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 = "";
+        }
+
+        mvprintw(base_y + 10, (base_x + 7 - strlen(back_msg)/2), back_msg);
+
+        refresh();
+
+    } while (errno != 1);
+
+    if (!top_msg)
+        free(top_msg);
+    if (!back_msg)
+        free(back_msg);
 
     endwin();