TP 13 exo2: Implement the missing bits to do a full game.
[TD_C.git] / TP_13 / exo2 / src / main.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <ncurses.h>
5
6 #include "display.h"
7 #include "coordinates.h"
8
9 int main() {
10 int row, col, errno = 0, round = 0, player = 0, key_pressed;
11 const int str_max_length = 255;
12 char* top_msg = malloc(str_max_length * sizeof(char));
13 char* back_msg = malloc(str_max_length * sizeof(char));
14
15 initscr();
16 getmaxyx(stdscr, row, col);
17 noecho();
18 curs_set(0);
19
20 /* array of the active coordinates in the entered order */
21 coordinates_t coordinates_array[MAX_COORDINATES];
22 init_coordinates(coordinates_array);
23 coordinates_t new_coordinates = {0, 0, 0};
24
25 /* center base coordinates for the board */
26 int base_y = row/2 - 4;
27 int base_x = col/2 - 7;
28
29 print_board(base_y, base_x);
30
31 do {
32 if (errno == 0) round++;
33
34 if (round % 2 == 0) {
35 player = 1;
36 top_msg = "Joueur 2 joue";
37 } else {
38 player = 0;
39 top_msg = "Joueur 1 joue";
40 }
41
42 mvprintw(base_y - 2, (base_x + 7 - strlen(top_msg)/2), top_msg);
43
44 print_coordinates(coordinates_array, base_y, base_x);
45
46 /* getch() is blocking */
47 key_pressed = getch();
48 switch (key_pressed) {
49 case 'a':
50 new_coordinates = set_coordinates(1, 1, player);
51 break;
52 case 'z':
53 new_coordinates = set_coordinates(1, 2, player);
54 break;
55 case 'e':
56 new_coordinates = set_coordinates(1, 3, player);
57 break;
58 case 'q':
59 new_coordinates = set_coordinates(2, 1, player);
60 break;
61 case 's':
62 new_coordinates = set_coordinates(2, 2, player);
63 break;
64 case 'd':
65 new_coordinates = set_coordinates(2, 3, player);
66 break;
67 case 'w':
68 new_coordinates = set_coordinates(3, 1, player);
69 break;
70 case 'x':
71 new_coordinates = set_coordinates(3, 2, player);
72 break;
73 case 'c':
74 new_coordinates = set_coordinates(3, 3, player);
75 break;
76 default:
77 /* set invalid coordinates */
78 new_coordinates = set_coordinates(0, 0, player);
79 break;
80 }
81
82 errno = add_coordinates(new_coordinates, coordinates_array, round);
83
84 if (errno == 2) {
85 back_msg = "Choisir une case vide";
86 } else if (errno == 3) {
87 back_msg = "Coordonnees invalides";
88 } else if (errno == 1) {
89 back_msg = "Tableau rempli sans gagnant: egalite";
90 } else if (errno == 4) {
91 back_msg = "Erreur inconnue";
92 } else if (errno == 0) {
93 /* FIXME: properly zero the string */
94 back_msg = "";
95 }
96
97 mvprintw(base_y + 10, (base_x + 7 - strlen(back_msg)/2), back_msg);
98
99 refresh();
100
101 } while (errno != 1);
102
103 if (!top_msg)
104 free(top_msg);
105 if (!back_msg)
106 free(back_msg);
107
108 endwin();
109
110 exit(EXIT_SUCCESS);
111 }