Liarina | Bonjour, je suis étudiante en maths-informatique et on nous a donné comme premier projet le jeu d'othello.
Cependant il semble que l'alphabeta soit mal programmé (il me semble qu'il gère mal les scores dans le cas où un joueur doit passer son tour mais je me trompe peut être).
Etant un peu à court d'idée j'espère que vous pourrez m'aider et me dire ce qui ne va pas dans ce code :
Code :
- #include <stdio.h>
- #include <stdlib.h>
- #include "structures.h"
- #include "main.h"
- int game_over(partie battle, int couleur){
- if((possibilite(&battle, battle.plateau, couleur)==-1) || (battle.nb_coupsjoues>MAX_COUPS))//si il n'y a plus de coups possible ou si on ajoue 60 coups, la partie est terminee
- return -1;
- else
- return 1;
- }
- int alphabeta(int profondeur, int alpha, int beta, partie* b){
- partie battle=(*b);
- coup coups;
- int i=11, couleur, legal, score, avant, dir;
- int pass=0;//nous servira a avoir les bons scores pour les cas ou un joueur doit sauter son tour
- coup meilleur_coup;
- if (battle.nb_coupsjoues==0){//si aucun coup n'a ete joue (l'ordi commence), la couleur est initialisee a noir
- couleur=NOIR;
- }
- else if(battle.coups[battle.nb_coupsjoues-1].couleur==NOIR)//sinon on regarde la couleur du cop precedent pour savoir quel couleur prendre
- couleur=BLANC;
- else
- couleur=NOIR;
- if(possibilite(&battle, battle.plateau,couleur)==0){
- couleur=(couleur+1)%2;
- pass=1;
- }
- if(game_over(battle, couleur)!=1){//si la partie est termine on regarde si le joueur actuel a gagne
- if (battle.plateau->materiel[couleur]>battle.plateau->materiel[(couleur+1)%2])//si oui, on renvoit un grand nombre
- {
- return +1000000;
- }
- else if(battle.plateau->materiel[(couleur+1)%2]>battle.plateau->materiel[couleur])//sinon un tres petit nombre
- {
- return -1000000;
- }
- else
- {
- return 0;//pour l'egalite, on renvoit 0
- }
- }
- else if(profondeur<=0){//si on a atteint la profondeur souhaite, on lance la fonction d'evaluation
- return evaluation(battle, couleur);
- }
- else{//sinon on parcourts le damier afin de tester les coups legaux
- while(i<=88){
- for (dir=0;dir<DIRECTIONS;dir++)
- coups.retournement[dir]=0;
- coups.position=i;
- coups.couleur=couleur;
- legal=coup_legal(battle.plateau, coups);
- if(legal==-1)
- i++;
- else{
- battle.plateau->damier[coups.position]=coups.couleur; // on "pose le pion sur le plateau" = on attribu a la case de l'othellier la valeur de la couleur
- coups=new_plateau(battle.plateau, coups); // on retourne les pions adverses
- battle.coups[battle.nb_coupsjoues]=coups; // on enregistre le coup joue
- couleur=(couleur+1)%2;//on change couleur
- battle.nb_coupsjoues++;
- if (battle.nb_coupsjoues>battle.longueur)
- battle.longueur++;
- if(pass==1){//si pass egal a 1, on ne change pas alphabeta a par la profondeur (pas d'alternance minmax)
- score=alphabeta(profondeur-1, alpha, beta, &battle);
- }
- else{//sinon on fait l'alternance minmax, (un joueur cherche a minimiser et l'autre a maximiser)
- score=-alphabeta(profondeur-1, -beta, -alpha, &battle);
- }
- avant=couleur;
- battle=annuler(battle.plateau, battle, (coups.couleur+1)%2);
- couleur=battle.coups[battle.nb_coupsjoues].couleur; //permet de passer au joueur precedant
- if(score>=alpha){//si score >= alpha, ce dernier coup est le meilleur
- alpha=score;//on change alpha
- meilleur_coup=coups;//on sauvegarde ce coup
- (*b).coups[battle.nb_coupsjoues]=coups;//on le sauvegarde egalement ici pour pouvoir le faire passer dans le jeu principal
- if(alpha>=beta){//si alpha >= beta, c'est inutile de continuer plus loins dans cette branche
- break;
- }
- }
- i++;
- }
- }
- }
- return alpha;
- }
|
<config>Windows 7 / Firefox 3.6.17</config> Message édité par Liarina le 03-05-2011 à 13:57:10
|