11 int min_y
= 26 + 6, min_x
= 42 + 14 + 15 + 4;
13 unsigned int round
= 0;
14 unsigned int player
= player_one
; /* first player is black */
15 bool exit_condition
= false;
16 unsigned int nb_white
= 0, nb_black
= 0;
18 const char* title_msg
= "Jeu Othello";
19 const char* score_msg
= "Pions %s: %d";
20 const char* invalid_move_msg
= "Coup invalide";
21 const char* player_msg
= "Joueur %d (%s) joue !";
22 const char* winner_msg
= "Joueur %d (%s) gagne !";
23 const char* draw_msg
= "Egalite !";
24 const char* exit_msg
= "Pressez une touche pour sortir ou \'r\' pour rejouer";
26 /* linked list of playable shots */
27 struct shots_list_s playable_shots
;
28 INIT_LIST_HEAD(&playable_shots
.list
);
30 unsigned int pawns
[board_size
][board_size
] = {
37 if (has_colors() == false) {
39 printf("Votre terminal ne supporte pas les couleurs.\n");
43 getmaxyx(stdscr
, row
, col
);
44 if (row
< min_y
|| col
< min_x
) {
46 printf("Votre terminal est trop petit pour afficher ce jeu.\n");
47 printf("Merci d'agrandir la fenetre de votre terminal.\n");
56 /* base coordinates to center the board */
57 int board_center_y
= center_y
- 26/2;
58 int board_center_x
= center_x
- 42/2;
61 print_board(board_center_y
, board_center_x
);
62 print_pawns(board_center_y
, board_center_x
, pawns
);
64 mvprintw(center_y
- 26/2 - 4, (center_x
- strlen(title_msg
)/2), title_msg
);
66 player
= current_player(round
);
68 if (player
== player_one
) {
69 mvprintw(center_y
- 26/2 - 2, center_x
- snprintf(NULL
, 0, player_msg
, player
, "noir")/2, player_msg
, player
, "noir");
71 mvprintw(center_y
- 26/2 - 2, center_x
- snprintf(NULL
, 0, player_msg
, player
, "blanc")/2, player_msg
, player
, "blanc");
74 nb_white
= count_pawns_type(pawns
, white
);
75 nb_black
= count_pawns_type(pawns
, black
);
77 mvprintw(center_y
, center_x
- 42/2 - snprintf(NULL
, 0, score_msg
, "noirs", nb_black
) - 2, score_msg
, "noirs", nb_black
);
78 mvprintw(center_y
, center_x
+ 42/2 + 2, score_msg
, "blancs", nb_white
);
80 build_playable_shots_list(player
, &playable_shots
, pawns
);
81 print_shots_list(board_center_y
, board_center_x
, &playable_shots
);
83 display_array(1, 1, pawns
);
87 bool input_ok
= false;
88 unsigned int nb_pawns_reversed
= 0;
92 const char* prompt_msg
= "Prochain pion ? (ligne colonne - chiffre lettre):";
93 int prmt_rt
= prompt_values(stdscr
, center_y
+ 26/2 + 1, (center_x
- strlen(prompt_msg
)/2), prompt_msg
, &y
, &x_char
);
94 int x
= map_col_letter_to_index(x_char
);
95 /* TODO: a comparaison to the linked list of playable shots is better */
96 if (is_legal_shot(y
, x
, player
, pawns
) && prmt_rt
== 1) {
97 nb_pawns_reversed
= valid_shot(y
, x
, player
, pawns
);
101 mvprintw(center_y
+ 26/2 + 4, (center_x
- strlen(invalid_move_msg
)/2), invalid_move_msg
);
105 free_shots_list(&playable_shots
);
107 round
++; /* increment the round count */
109 /* here are all the end of the game conditions */
110 if (is_board_full(pawns
)) {
111 print_board(board_center_y
, board_center_x
);
112 /* print the updated pawns before exiting */
113 print_pawns(board_center_y
, board_center_x
, pawns
);
114 unsigned int winner
= eval_winner(nb_white
, nb_black
);
116 if (winner
== player_one
) {
117 mvprintw(center_y
- 26/2 - 2, center_x
- snprintf(NULL
, 0, winner_msg
, winner
, "noir")/2, winner_msg
, winner
, "noir");
119 mvprintw(center_y
- 26/2 - 2, center_x
- snprintf(NULL
, 0, winner_msg
, winner
, "blanc")/2, winner_msg
, winner
, "blanc");
122 mvprintw(center_y
- 26/2 - 2, (center_x
- strlen(draw_msg
)/2), draw_msg
);
124 mvprintw(center_y
+ 26/2 + 1, (center_x
- strlen(exit_msg
)/2), exit_msg
);
125 exit_condition
= true;
126 /* getch() is blocking */
127 int key_exit
= getch();
128 if (key_exit
== 'r') {
131 nb_white
= nb_black
= 0;
132 /* FIXME: do not seem properly reset the pawns 2D array */
134 exit_condition
= false;
141 } while (!exit_condition
);