AlgoRechercheMinMax.java 3.97 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package tictactoecodingame;

import java.util.ArrayList;

/**
 *
 * @author Théo
 */
public class AlgoRechercheMinMax extends AlgoRecherche{
    
    /*La profondeur de recherche demandée doit être supérieure à 1 et inférieure
17 18
    à 98 (On commence à 0 et l'emplacement 99 est utilisée par le générateur), 
    en pratique la croissance est factorielle en mémoire donc en ne dépassera pas 10*/
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    private int depth;
    private Plateau plateau;
    private Joueur target;
    private Joueur opponent;
    private int d_gen;
    
    public AlgoRechercheMinMax(int depth, int d_gen, Joueur joueur1, Joueur joueur2){
        this.depth = depth;
        this.d_gen = d_gen;
        //Cet algo ne marche qu'avec des jeux à deux joueurs
        target = joueur1;
        opponent = joueur2;
    }
    
    public void setRandGenDepth(int d_gen){
        this.d_gen = d_gen;
    }
    
    public void setDepth(int depth){
        this.depth = depth;
    }
    
    public void setPlayers(Joueur joueur1, Joueur joueur2){
        target = joueur1;
        opponent = joueur2;
    }
    
    public int getRandGenDepth(int d_gen){
        return d_gen;
    }
    
    public int getDepth(int depth){
        return depth;
    }
    
    public Joueur[] getPlayers(Joueur joueur1, Joueur joueur2){
        Joueur[] players = {target, opponent};
        return players;
    }
    
    public Coup meilleurCoup( Plateau _plateau , Joueur _joueur , boolean _ponder ){
60
        //On part du principe que la partie n'est pas terminée donc qu'il reste au moins un coup
61 62 63 64 65 66 67 68
        plateau = _plateau;
        plateau.sauvegardePosition(0);
        if(target != _joueur){
        opponent = target;
        target = _joueur;
        }
        ArbreMinMax explore = new ArbreMinMax();
        builder(explore, target, 0);
69 70 71 72 73 74 75 76 77 78
        explore.MinMax(0);
        int m = Integer.MIN_VALUE;
        Coup c = null;
        for(int i = 0; i < explore.getfils().size() ; i++){
            int n = explore.getfils().get(i).getvalue();
            if(n > m){
                m = n;
                c = explore.getfils().get(i).getcoup();
            }
        }
79
        plateau.restaurePosition(0);
80
        return c;
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
    }
    
    //Fonction auxiliaire récursive de création de l'arbre des coups possibles
    private void builder(ArbreMinMax t,Joueur currentJoueur, int currentDepth){
        //On commence par mettre le plateau à jour en fonction du coup théorique joué
        if(currentDepth == 0){
            plateau.restaurePosition(0);
        }
        else{
            plateau.restaurePosition(currentDepth-1);
            plateau.joueCoup(t.getcoup());
            plateau.sauvegardePosition(currentDepth);
        }
        //On crée les nouveau noeuds à partir des coups disponible du point de vue du joueur à ce niveau de l'arbre
        ArrayList<Coup> coups = plateau.getListeCoups(currentJoueur);
96
        if(plateau.partieTerminee()){
97
            Joueur winner = plateau.vainqueur();
98 99
            if(winner == target){
                t.setvalue(1);
100
            }
101 102 103 104 105 106 107 108 109 110
            else if(winner == opponent){
                t.setvalue(-1);
            }
            else {
                t.setvalue(0);
            }
        }
        else if (currentDepth == depth){
            int c = Generator.random_tests(plateau, d_gen, target);
            t.setvalue(c);
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
        }
        else{
            ArrayList<ArbreMinMax> fils = new ArrayList<ArbreMinMax>();
            for(int i=0; i<coups.size();i++){
                ArbreMinMax a = new ArbreMinMax(coups.get(i));
                if(currentJoueur == target){
                    builder(a, opponent,currentDepth + 1);
                }
                else {
                    builder(a, target,currentDepth + 1);
                }
                fils.add(a);
            }
            t.setfils(fils);
        }
    }
}