X-Git-Url: https://git.piment-noir.org/?p=TD_C.git;a=blobdiff_plain;f=TP_13%2Fexo2%2Fsrc%2Fmain.c;h=8978ef2eee6ed33ce70c14b70a4f956e428769c7;hp=390bc40005122a294846808868852871354b1235;hb=811d4abe716c4d14629cee5beda1e1f3cff979bc;hpb=ee5eaefbd7a82c48cda43b24f518ba8b681e0472 diff --git a/TP_13/exo2/src/main.c b/TP_13/exo2/src/main.c index 390bc40..8978ef2 100644 --- a/TP_13/exo2/src/main.c +++ b/TP_13/exo2/src/main.c @@ -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); }