[Edit]Faut croire que des dizaines de tests étaient pas suffisants, le bug est réapparu même sans ça. J'ai aucune idée de ce qui le cause donc pour l'instant, autant enterrer ce thread.
Bonjour à tous,
J'ai un petit souci de code avec l'utilisation de vector (j'ai déjà lu la FAQ, mon problème n'a pas l'air d'y apparaître).
Je programme un jeu de plateau avec une IA. J'ai une fonction qui détermine la liste des coups légaux et les stocke dans un vector<string> . Ensuite les fonctions d'IA bouclent sur ce vector pour tester les différents coups.
La fonction permettant de déterminer si un coup est légal ou non marche, et la liste est valide (j'ai fait de nombreux tests pour m'assurer de ça), donc ça vient de mon utilisation du vecteur.
Puisque, et c'est là que je suis perdu, si je reprends le code de création du vecteur et que je le colle à l'intérieur des fonctions d'IA... le bug disparait.
Voici la fonction qui me permet de remplir le vecteur :
Vraiment pas compliquée. Il y a trois boucles parce qu'en plus de vérifier chaque case du plateau, il faut vérifier quatre "directions" dans laquelle jouer. C'est une particularité du jeu sur lequel je travaille et je doute que ça ait la moindre importance dans l'exécution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 void coupsLegaux(vector<string> &liste, Plateau plateau) { string coup = "Y0e "; //Initialise la chaîne à la bonne taille for (int i = 0; i < T; i++) { for (int j = 0; j < T; j++) { for (int k = 0; k < 4; k++) { coup = creerCoup(i, j, k); if (coupLegal(coup, plateau)) { liste.push_back(coup); } } } } }
Voici ensuite le code de la fonction d'IA :
Donc ce code plante, enfin pas tout le temps. J'ai du mal à cerner le bug exact, mais en gros y'a un ou plusieurs pions qui disparaissent au bout d'un certain nombre d'itérations.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 vector<string> liste; coupsLegaux(liste, plateau); for (unsigned int i = 0; i < liste.size(); i++) { jouerCoup(liste[i], plateau, depth, joueur); temp = -(negamax(plateau, depth+1)); defaireCoup(liste[i], plateau, depth); /*Reste de l'algorithme IA, qui n'intéragit plus avec le plateau*/ }
Et donc, si au lieu de boucler sur la liste de coups légaux (qui, je le répète, sont bien tous corrects au moment de la création de la liste) je mets ma triple boucle à l'intérieur de la fonction d'IA et qu'au lieu de faire une liste je fais juste "coup = creerCoup(i, j, k)" et travaille sur la variable coup, ça marche.
Donc techniquement ça va, le bug n'est pas trop gênant... sauf qu'il alourdit quand même le code et le rend assez moche à lire.
Voilà, merci d'avance pour votre aide et j'espère avoir inclus assez d'informations.
P.S. Je suis pas un très bon programmeur C++ donc vous excuserez les éventuelles fautes de standardisation ou autres. ^^
Partager