donc en faite, e fait un rand sur la position nb_col et nb_lig, puis j'envoie les coordonnées a cette fonction qui va me palcer mon pion....
Oki!
Version imprimable
donc en faite, e fait un rand sur la position nb_col et nb_lig, puis j'envoie les coordonnées a cette fonction qui va me palcer mon pion....
Oki!
En effet c'est a ca que je pensais , tu l'utilise lorsque l'IA n'a pas besoin de casser un alignement ou d'en faire un :D
Et maintenant, comment faire pour casser un alignement ?
(Lorsque l'humain joue +1 dans ses cases, et qd l'AI joue, -1 et 0 dans les cases vides)
Et bien tu te créé une petite fonction qui pour chaque pion de l'humain détécté(en parcourant le tableau grâce a une boucle) vérifie la gauche (si il ya une gauche,donc il faut que tu mettes un switch au début pour gérer les éxcptions comme les pons tout a gauche),ensuite vérifie la droite(pareil , y -a t-il une droite ?) ensuite les diagonales le haut et le bas.
Pour le switch tu peux faire un truc du genre :
Comme ca tu détécte facilement les cases tout a gauche du tableau , tout a droite , toute en bas,etc..Code:
1
2
3
4
5
6
7
8
9 switch(positionDetecteur) case 1:/*donc quand c'est au bord en haut a gauche il n'y a pas de droite ni de haut ni de diagonales en haut gauche ni de diagonales en bas gauche ni de diagonales en haut droite donc tu met :*/ pionGauche=0;//pionGauche , y en a pas donc zéro pionHaut=0;//non plus donc zéro pionHautGauche=0;//y en pas non plus donc zéro pionBasGauche=0;//non plus donc zéro pionHautDroite=0;//non plus donc zéro /*voilà tu fait ca en réfléchissant pour chaque position spéciale du tableau*/
Ensuite tu fait des conditions pour que les pions qui sont tout a gauche du tableau n'est pas accés au détéction ,d'alignement gauche ,etc..
Bonne chance
Oulalala, courage Nicolas...
Si j'ai bien compris, toutes les cases qui sont des exceptions sont toutes celle qui se trouvent sur le bord de mon tableau 2D ?
Oui en partie(mais pas seulement au bord :aie: )
partout ou je met des x :
x x x x x x
x x
x x
x x
x x
x x
x x x x x x
A chacun de ses emplacements il y une exception par exemple celui en bas a droite n'a pas de pion en bas ni a droite , ni en diagonale Bas - Droite , ni en diagonale Bas - Gauche ni an diagonale Haut-Gauche.
Etc...
Je sais c'est décourageant mais vois le bon côté des choses , une fois que tu auras fait tu auras fait la plus grosse partie du détécteur d'alignement ;)
En faite, cela me permet jsute d'eviter ma fonction DetecterAlignement pour un rien selon la position du pion
je pourrais meme faire par exemple : execution de la focntion detection alignement si et seulement le pion est different de grille[][0], grille[][1], grille[0][] et grille[7][], non ?
En faite non
mais par contre, ma fonctione detection sera domposer de detection horizontale, verticale, diagonale ascendante, descendante, et selon la position du pion, toute la focntione ne va pas s'éxécuter, non?
Voilà c'est ca ;)
par exemple en imaginant que le pion soit a l'emplacement du x alors toute ce qui concerne le bas(aussi bien les diagonale que la verticale) ne sera pas éxécuté pour ne pas provoquer d'erreur de compilation ni de détéction fausse.
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . x . .
Voilà le tableau juste des endroits où des éxceptions seront a gérer(dans mon ancien poste les espaces s'étaient éffacé rapprochant alors la colone de droite juste a côté de celle de gauche):
xxxxxx
x......x
x......x
x......x
x......x
x......x
xxxxxx
voilà , chaque point ne corespond pas a une case ! :P
Donc en faite, il faudrait que j'envoi plus ou moins un code a la focntione recherche alignement pour voir ou peut se trouve l'aligneùent selon la position du x
Par contre, en ce qui concerne la recherche d'un alignement, je fais comment, par les "points" que formerton l'alignement, c'est à dire si la zone de 4case selectionner est égal a 3 alors, il faut casser l'alignement humai ( +1 humain, -1 ai, 0 vide)
non?
:? Si j'ai bie compris oui il faut casser l'alignement lorsque quatre case séléctionné posséde la valeur trois. Pour ca tu recherche un 4éme pion humain qui pourrait rejoindre les trois autres , sinon un endroit vide qui empêcherait la suite de l'alignement !
J'épspére avoir bien compris ton message et avoir été clair ;)
Oui, tu as bien compris ce que je pensait...
DetectionAlignement : recherche d'un alignement de 4 cases dont la valeurs vaut 3
CasseAlignement : recherche d'une case dont lalgienemtn 3humain + AI = 2 ou bien case a 0 ou l'humain si il joue sa donne 4 ?? ( meilleur solution? )
C'est exactement ca , tu fait une boucle : tant que.. alignement pas casser,alors si case dont lalignement 3humain + AI = 2 et si case a 0 ou l'humain si il joue sa donne 4(par exmple en isolant les cases a côtés et en vérifiant si les quatre cases avec celle là a valeur 1 donne 4)
Oki, il reste tout cela a voir comment coder
Par exemple, une boucle for (pour alignement verticale):
Mais je ne vois pas quoi mettre dans les isntructions, je voit plus ou moins comment l'expliquer mais pas comment le coderCode:
1
2
3
4 for(i=0, i<=4, i++){ instructions }
[QUOTE]
on verifie les 4cases (3case + pion jouer ) a gauche si vaut 3 alors on arrete de suite, sinon on continue, et on repette l'action 3fois ( donc 4 en total ) en faisai varier i
non ?
Et comment coder ?
Faire varier "i" est une bonne idée ;)
pour le reste tu créé une variable qui contient 0 tant que l'alignement n'est pas brisé , tu fait une boucle while qui répéte la détéction (avec le tableau, en isolant les cases 4 par 4 , comme ca par exemple :
)ensuite sauf dans ce cas :Code:
1
2
3
4
5
6
7 for(i;i<4;i++) { int caseIsolé[5]; caseIsolé[i]=1; } /*ainsi on isole les cases et on additione les 4 cases isolé , si leur valeur est égale a 3 on casse l'alignement a côté*/
xxx...xx
où la fonction cassera l'alignement tout de suite.
On passe a la fonction de cassage d'alignement un pointeur sur le tableau positionPion et aprés cette fonction parcours le tableau avec une boucle for en s'aidant peut être de variable donné contenant la position de l'alignement, on cherche une case vide et on le fait jouer là(le = IA)
Pourquoi avoir créé un tableau caseIsolé de 5 ? ^o), c'est un alignement de 4 que je teste...
Ah oui c'est vrai :P
Mais au cas où il est en général plus prudent d'augmenter la taille du tableau d'une ou deux cases par prudence ;)
Enfin c'est une de mes habitudes , aprés a toi de voir :P
Mais avec la boucle que tu m'as donné, on donne 1 a chaque case du tableau caseIsolé ? ( l'interet ?)
Oui , c'est vrai :oops: mais l'important c'est la boucle en elle même et non pas les instructions qu'il y a dedans.
C'est une mauvaise habitude de prévoir des cases supplémentaires. Ca apporte de la confusion au code, et c'est de plus inutile si les assertions d'allocation sont bien faites.
Par exemple, mettre le même nombre de cases mémoire partout est indispensable si on utilise fgets. Il est nénamoins possible de préciser à fgets une longueur de chaîne moindre que la mémoire allouée, mais c'est nuisible à la lisibilité du programme et à la cohérence. un octet en plus ou en moins n'est pas forcément nuisible avec un ordinateur actuel, mais pourquoi allouer une certaine quantité de mémoire si c'est pour ne pas vous en servir ? Un espace mémoire vide en plus ne sert strictement à rien au programme.
Comme le C autorise al gestion de la mémoire au plus près, il est inutile voir dangereux pour la correction du programme d'allouer des tailles différentes, car ça peut masquer les erreurs.
Normalement, 100 cases d'un tableau ce char c'est 100 octets tout juste, et il est inutile de prévoir plus de mémoire si vous utilisez 100 octets
Test horizontale
Qu'en pensez-vous ? avec num_lig et num_col la position du pion mis par l'humain et grille_point le tableau où il y a les points de chaque case en focntione du pion ( +1, -1, 0 )Code:
1
2
3
4
5
6
7
8
9
10
11
12 int verif_hor_ai(char grille_point[][7], int num_lig, int num_col){ int i=0; int num=0; for(i=num_col-3; i<=num_col; i++){ num=grille_point[num_lig][i] + grille_point[num_lig][i+1] + grille_point[num][i+2] + grille_point[num_lig][i+3]; if (num == 3) return 1; } return 0; }