void move_ants(t_colony *colony) { int i; i = -1; while (++i < colony->number_of_ants) { if (colony->ants[i]->is_at_end) continue ; if (!move_is_possible(colony, i)) break ; move(colony, i); ++colony->moves; } }
/*Fonction qui renvoit un tableau contenant toutes les commandes possibles*/ p_move* possible_movements(board *b, player couleur, int *length){ int i, j,k; int coupsPossibles[6][2] = {{0,1},{1,1},{1,0},{0,-1},{-1,-1},{-1,0}}; int lignesPossible[3][2] = {{1,0},{0,1},{-1,0}}; /*Les variations de position que l'on va utiliser pour selectionner les billes adjacentes en ligne*/ int l; int tabLen = 0; p_move *tab = malloc(sizeof(p_move) * tabLen);/*Contiendra les mouvement possibles*/ /*DEPLACEMENT D'UNE CASE */ for(i='A'; i <= 'I'; i++){ for(j=1; j <= 9; j++){ if(b->tab[c_to_key(i)][i_to_key(j)] == couleur){/*On selectionne les cases du joueur*/ for(k=0; k<6; k++){ char **tabMouvement = malloc(2 * sizeof(char*)); char *caseDepart = malloc(3*sizeof(char)); char * caseArrivee = malloc(3*sizeof(char)); p_move commande; /*Construction de la case de depart*/ caseDepart[0] = i; caseDepart[1] = j + '0'; caseDepart[2] = '\0'; tabMouvement[0] = caseDepart; /*Construction du coup a tester*/ caseArrivee[0] = i + coupsPossibles[k][0]; caseArrivee[1] = j + '0' + coupsPossibles[k][1]; caseArrivee[2] = '\0'; tabMouvement[1] = caseArrivee; /*Construction du mouvement correspondant*/ commande.squares = tabMouvement; commande.length = 2; commande.color = couleur; /*On ajoute le coup au tableau s'il est possible*/ if(move_is_possible(b, &commande) >0){ tabLen++; tab = realloc(tab, sizeof(p_move) * tabLen); tab[tabLen-1] = commande; } else { free(caseDepart); free(caseArrivee); free(tabMouvement); } } } } } /*DEPLACEMENT DE DEUX CASES */ for(i='A'; i <= 'I'; i++){ for(j=1; j <= 9; j++){ for(l = 0; l <= 2; l++){ int i2 = i+lignesPossible[l][0], j2 = j+lignesPossible[l][1]; int keyi2 = c_to_key(i)+lignesPossible[l][0], keyj2 = i_to_key(j)+lignesPossible[l][1]; if(keyi2 < 9 && keyj2 < 9 && b->tab[c_to_key(i)][i_to_key(j)] == couleur && b->tab[keyi2][keyj2] == couleur){/*On selectionne les cases du joueur*/ for(k=0; k<6; k++){ char **tabMouvement = malloc(4 * sizeof(char*)); char *caseDepart1 = malloc(3*sizeof(char)); char *caseDepart2 = malloc(3*sizeof(char)); char * caseArrivee1 = malloc(3*sizeof(char)); char * caseArrivee2 = malloc(3*sizeof(char)); p_move commande; /*Construction des cases de depart*/ caseDepart1[0] = i; caseDepart1[1] = j + '0'; caseDepart1[2] = '\0'; tabMouvement[0] = caseDepart1; caseDepart2[0] = i2; caseDepart2[1] = j2 + '0'; caseDepart2[2] = '\0'; tabMouvement[1] = caseDepart2; /*Construction du coup a tester*/ caseArrivee1[0] = i + coupsPossibles[k][0]; caseArrivee1[1] = j + '0' + coupsPossibles[k][1]; caseArrivee1[2] = '\0'; tabMouvement[2] = caseArrivee1; caseArrivee2[0] = i2 + coupsPossibles[k][0]; caseArrivee2[1] = j2 + '0' + coupsPossibles[k][1]; caseArrivee2[2] = '\0'; tabMouvement[3] = caseArrivee2; /*Construction du mouvement correspondant*/ commande.squares = tabMouvement; commande.length = 4; commande.color = couleur; /*On ajoute le coup au tableau s'il est possible*/ if(move_is_possible(b, &commande) >0){ tabLen++; tab = realloc(tab, sizeof(p_move) * tabLen); tab[tabLen-1] = commande; /*printf("Depart : %s %s, Arrivee : %s %s\n", tabMouvement[0], tabMouvement[1], tabMouvement[2], tabMouvement[3]);*/ } else{ free(caseDepart1); free(caseDepart2); free(caseArrivee1); free(caseArrivee2); free(tabMouvement); } } } } } } /*DEPLACEMENT DE TROIS CASES */ for(i='A'; i <= 'I'; i++){ for(j=1; j <= 9; j++){ for(l = 0; l <= 2; l++){ int i2 = i+lignesPossible[l][0], j2 = j+lignesPossible[l][1]; int keyi2 = c_to_key(i)+lignesPossible[l][0], keyj2 = i_to_key(j)+lignesPossible[l][1]; int i3 = i2+lignesPossible[l][0], j3 = j2+lignesPossible[l][1]; int keyi3 = c_to_key(i2)+lignesPossible[l][0], keyj3 = i_to_key(j2)+lignesPossible[l][1]; if(keyi3 < 9 && keyj3 < 9 && b->tab[c_to_key(i)][i_to_key(j)] == couleur && b->tab[keyi2][keyj2] == couleur && b->tab[keyi3][keyj3] == couleur){/*On selectionne les cases du joueur*/ for(k=0; k<6; k++){ char **tabMouvement = malloc(6 * sizeof(char*)); char *caseDepart1 = malloc(3*sizeof(char)); char *caseDepart2 = malloc(3*sizeof(char)); char *caseDepart3 = malloc(3*sizeof(char)); char * caseArrivee1 = malloc(3*sizeof(char)); char * caseArrivee2 = malloc(3*sizeof(char)); char * caseArrivee3 = malloc(3*sizeof(char)); p_move commande; /*Construction des cases de depart*/ caseDepart1[0] = i; caseDepart1[1] = j + '0'; caseDepart1[2] = '\0'; tabMouvement[0] = caseDepart1; caseDepart2[0] = i2; caseDepart2[1] = j2 + '0'; caseDepart2[2] = '\0'; tabMouvement[1] = caseDepart2; caseDepart3[0] = i3; caseDepart3[1] = j3 + '0'; caseDepart3[2] = '\0'; tabMouvement[2] = caseDepart3; /*Construction du coup a tester*/ caseArrivee1[0] = i + coupsPossibles[k][0]; caseArrivee1[1] = j + '0' + coupsPossibles[k][1]; caseArrivee1[2] = '\0'; tabMouvement[3] = caseArrivee1; caseArrivee2[0] = i2 + coupsPossibles[k][0]; caseArrivee2[1] = j2 + '0' + coupsPossibles[k][1]; caseArrivee2[2] = '\0'; tabMouvement[4] = caseArrivee2; caseArrivee3[0] = i3 + coupsPossibles[k][0]; caseArrivee3[1] = j3 + '0' + coupsPossibles[k][1]; caseArrivee3[2] = '\0'; tabMouvement[5] = caseArrivee3; /*Construction du mouvement correspondant*/ commande.squares = tabMouvement; commande.length = 6; commande.color = couleur; /*On ajoute le coup au tableau s'il est possible*/ if(move_is_possible(b, &commande) >0){ tabLen++; tab = realloc(tab, sizeof(p_move) * tabLen); tab[tabLen-1] = commande; } else{ free(caseDepart1); free(caseDepart2); free(caseDepart3); free(caseArrivee1); free(caseArrivee2); free(caseArrivee3); free(tabMouvement); } } } } } } *length = tabLen; return tab; }