+ for (unsigned i = 0; i <= round; i++) {
+ /* check if they are all the same */
+ if ((coordinates_array + i)->y == line_number && (coordinates_array + i)->type == 0) {
+ nb_o_align++;
+ }
+ if ((coordinates_array + i)->y == line_number && (coordinates_array + i)->type == 1) {
+ nb_x_align++;
+ }
+ }
+ if (nb_o_align == 3 || nb_x_align == 3) {
+ return true;
+ }
+ return false;
+}
+
+static bool chk_column(coordinates_t* coordinates_array, int column_number, unsigned round) {
+ unsigned nb_o_align = 0;
+ unsigned nb_x_align = 0;
+
+ for (unsigned i = 0; i <= round; i++) {
+ /* check if they are all the same */
+ if ((coordinates_array + i)->x == column_number && (coordinates_array + i)->type == 0) {
+ nb_o_align++;
+ }
+ if ((coordinates_array + i)->x == column_number && (coordinates_array + i)->type == 1) {
+ nb_x_align++;
+ }
+ }
+ /* one column must be full of the same type */
+ if (nb_o_align == 3 || nb_x_align == 3) {
+ return true;
+ }
+ return false;
+}
+
+static bool chk_diagonals(coordinates_t* coordinates_array, unsigned round) {
+ unsigned nb_o_diag_one = 0, nb_o_diag_two = 0;
+ unsigned nb_x_diag_one = 0, nb_x_diag_two = 0;
+
+ for (unsigned i = 0; i <= round; i++) {
+ /* dumb count of each elements type in the two diagonals */
+ for (int y_x_diag = 1; y_x_diag < 4; y_x_diag++) {
+ if ((coordinates_array + i)->y == y_x_diag && (coordinates_array + i)->x == y_x_diag && (coordinates_array + i)->type == 0) {
+ nb_o_diag_one++;
+ }
+ if ((coordinates_array + i)->y == y_x_diag && (coordinates_array + i)->x == (4 - y_x_diag) && (coordinates_array + i)->type == 0) {
+ nb_o_diag_two++;
+ }
+ if ((coordinates_array + i)->y == y_x_diag && (coordinates_array + i)->x == y_x_diag && (coordinates_array + i)->type == 1) {
+ nb_x_diag_one++;
+ }
+ if ((coordinates_array + i)->y == y_x_diag && (coordinates_array + i)->x == (4 - y_x_diag) && (coordinates_array + i)->type == 1) {
+ nb_x_diag_two++;
+ }
+ }
+ if (nb_o_diag_one == 3 || nb_o_diag_two == 3 || nb_x_diag_one == 3 || nb_x_diag_two == 3) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool chk_win_conditions(coordinates_t* coordinates_array, unsigned round) {
+
+ /* winning conditions begin at round = 4 */
+ if (round > 3) {
+ if (chk_diagonals(coordinates_array, round)) {
+ return true;
+ }
+ for (unsigned i = 1; i < 4; i++) {
+ if (chk_line(coordinates_array, i, round) || \
+ chk_column(coordinates_array, i, round)) {
+ return true;
+ }
+ }