Sophie

Sophie

distrib > Mandriva > 10.0-com > i586 > by-pkgid > 9347541fe87a5ea3f3b8dbc50f660e8e > files > 44

libQGLViewer-devel-1.3.6-1mdk.i586.rpm

// =================================================================== //
// Time-stamp: <01 Jul 03 16:27:25 Jean-Guillaume.Dumas@imag.fr> 
// =================================================================== //
#ifndef __Agora_Plateau__ 
#define __Agora_Plateau__

#include <iostream>
#include <vector>
#include "givtimer.h"

#define SHORTCOULEURMASK 32768

#define WHITE false
#define BLACK true

#define ADVANCEDRULES 
      
#include "agora_class.h"
#include "agora_io.h"
#include "agora_types.h"
#include "agora_coup.h"
#include "agora_container.h"

 
template<class Ints>
class Agora : public std::vector<Ints> {
public:
    typedef Agora< Ints > Self_t;
    typedef Ints Pile_t;
    typedef std::vector<Pile_t> Plateau_t;
    typedef std::vector< std::vector< Case_t > >  Voisin_t;

    typedef AgoraCoup Coup;
    typedef AgoraContainer<256, Coup> Possible_t;
    typedef std::vector< Possible_t > Table_Possible_t;
    typedef std::vector<Eval_t> Table_Eval_t;

private:
    Case_t _row, _size;
    Possible_t TopPM;
    Table_Possible_t _PM;
    Hauteur_t _bits;
    Size_t _bsize;
    Table_t _hauteurs, _uns, _pris, _altitude;
    Table_Eval_t _eval;
    Plateau_t _enleve, _ajoute_noir, _ajoute_blanc, _ajoute_prison;
    Voisin_t _voisins;

public:

    Agora(int n = 6) ;
    void reinit() ;

        // Tabulées
    bool couleur(const Pile_t p) const ;    
    Hauteur_t taille( const Pile_t i ) const;
    Hauteur_t uns( const Pile_t i ) const;
    Hauteur_t pris( const Pile_t i ) const;
    Eval_t eval( const Pile_t i ) const;

	// Calculée
    bool ArriveeRevolution( const Coup& c) const;
    bool DepartRevolution( const Coup& c) const;
    

        // Tabulées
    Pile_t enleve( const Pile_t p ) const;
    Pile_t ajoute_noir( const Pile_t p ) const ;
    Pile_t ajoute_blanc( const Pile_t p ) const ;
    Pile_t ajoute_prison( const Pile_t p) const ;

        // Initialisation
    Pile_t init( const Case_t i, const Pile_t p ) ;
    
        // Jouer
    bool jouer( const Coup& c ) ;
    bool jouer( const Case_t depart, const Case_t arrivee, const bool dessus );
    bool jouer( const Case_t depart, Pile_t& ancien_d, const Case_t arrivee, Pile_t& ancien_a, const bool dessus );
    bool jouer_dessus( const Case_t depart, Pile_t& ancien_d, const Case_t arrivee, Pile_t& ancien_a ) ;
    bool jouer_dessous( const Case_t depart, Pile_t& ancien_d, const Case_t arrivee, Pile_t& ancien_a );
    void jouer( const Case_t depart, Pile_t& ancien_d, Pile_t& new_d, const Case_t arrivee, Pile_t& ancien_a, Pile_t& new_a, const bool dessus );
    void jouer_dessus( const Case_t depart, Pile_t& ancien_d, Pile_t& new_d, const Case_t arrivee, Pile_t& ancien_a, Pile_t& new_a ) ;
    void jouer_dessous( const Case_t depart, Pile_t& ancien_d, Pile_t& new_d, const Case_t arrivee, Pile_t& ancien_a, Pile_t& new_a );
    void remettre( const Case_t depart, const Pile_t ancien_d, const Case_t arrivee, const Pile_t ancien_a ) ;


        // Fonction d'évaluation
    double& eval(double& e, const Pile_t p) const;
    double& uneval(double& e, const Pile_t p) const;
    double& eval(double& e, const Pile_t dep, const Pile_t ndep, const Pile_t arr, const Pile_t narr)  const ;
    double eval() const ;


        // Meilleur coup
        // Default : temps limité, mais si depth > 0 --> profondeur fixée
    Coup& Suggest(Coup& bp, bool ordi_color, double temps_max, int depth = 0);

	// Coups possibles
    bool gameIsOver() ;
    bool gameIsOver(bool color) ;
    
    Possible_t& CoupsVoisinsBlancs(Possible_t& Liste, const Case_t i) const ;
    Possible_t& CoupsVoisinsNoirs(Possible_t& Liste, const Case_t i) const ;
    Possible_t& CoupsVoisins(Possible_t& Liste, const Case_t i) const ;
    Possible_t& CoupsPossibles(Possible_t& Liste, const bool c) const ;
    
private:
#ifdef __ERRORS__
    unsigned long long _count;
#endif
    
        // Construction
    void voisin_g(const Case_t j, typename Voisin_t::value_type & loc) const ;
    void voisin_d(const Case_t j, typename Voisin_t::value_type & loc) const ;
    void voisin(const Case_t j, typename Voisin_t::value_type & loc) const  ;

        // Calculs initiaux pour tabulation    
    Pile_t& calcule_enleve(Pile_t & r, const Hauteur_t t, const Hauteur_t u, const Pile_t p) const ;
    Pile_t& calcule_prison(Pile_t& a, const Hauteur_t t, const Hauteur_t u, const Pile_t p) const ;
    Pile_t& calcule_ajoute(Pile_t & r_noir, Pile_t& r_blanc, const Hauteur_t t, const Hauteur_t u, const Pile_t p) const ;
    Hauteur_t& calcule_hauteur(Hauteur_t& h, Hauteur_t& u, Hauteur_t& pris, const Pile_t p) const ;
    Pile_t& calcule_revol(Pile_t& r, const Hauteur_t t, const Pile_t p) const ;
    Eval_t& calcule_eval(Eval_t& ev, const Hauteur_t t, const Hauteur_t u, const Pile_t p) const ;

        // Optimisations Branch and Cut
    double ami_ab(int depth, double alpha, double beta, bool ordi_color);
    double ennemi_ab(int depth, double alpha, double beta, bool ordi_color) ;
    double ami_ab(int depth, double alpha, double beta, bool ordi_color, double currev, const Pile_t ad, const Pile_t nd, const Pile_t aa, const Pile_t na);
    double ennemi_ab(int depth, double alpha, double beta, bool ordi_color, double currev, const Pile_t ad, const Pile_t nd, const Pile_t aa, const Pile_t na) ;
        // Meilleur coup en temps limité
    Coup& Iteratif(Coup& bp, bool ordi_color, double temps_max, int StartProf) ;
        // Meilleur coup à profondeur fixée
    double BestPlay(Coup& bp, bool ordi_color, int depth);

    inline double MTDFdouble(int depth, double f, bool ordi_color) ;
    double OnebyOneBP(Coup& bp, bool ordi_color, int depth, double temps_max, Timer& global) ;
    
        // Possiblité de coup
        // Pour l'instant isolé interdit
    bool calcule_poss_dessus_noir(const bool c, const Hauteur_t t) const ;
    bool calcule_poss_dessous_noir(const bool c, const Hauteur_t t)  const ;
    bool calcule_poss_dessus_blanc(const bool c, const Hauteur_t t)  const ;
    bool calcule_poss_dessous_blanc(const bool c, const Hauteur_t t)  const ;
    Hauteur_t calcule_poss_blancs(Possible_t& Liste, const Case_t depart, const Hauteur_t hdepalt, const Case_t arrivee)  const ;
    Hauteur_t calcule_poss_noirs(Possible_t& Liste, const Case_t depart, const Hauteur_t hdepalt, const Case_t arrivee)  const ;

	// Entrées/Sorties
    friend std::ostream& operator<< <>(std::ostream& out, const Agora& p) ;
    friend std::ostream& affiche <>(std::ostream& out, const Agora& p) ;
    friend std::ostream& details <>(std::ostream& out, const Agora& p) ;
    friend std::istream& operator>> <>(std::istream& in, Agora& p) ;
    
};

#include "agora_init.inl"
#include "agora_io.inl"
#include "agora_jouer.inl"
#include "agora_evaluation.inl"
#include "agora_alphabeta.inl"
#include "agora_coupspossibles.inl"
#endif