Sophie

Sophie

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

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

// =================================================================== //
// Time-stamp: <01 Jul 03 16:41:35 Jean-Guillaume.Dumas@imag.fr> 
// =================================================================== //
#ifndef __Agora_CoupsPossibles__
#define __Agora_CoupsPossibles__
#include "agora.h"

template<class Ints>
inline bool Agora<Ints>::gameIsOver() {
    return (gameIsOver(true) || gameIsOver(false) );
}

template<class Ints>
inline bool Agora<Ints>::gameIsOver(bool color) {
    Possible_t Liste;
    CoupsPossibles( Liste, color );
    if (Liste.size())
        return false;
    else
        return true;
}
  
    



template<class Ints>
inline Hauteur_t Agora<Ints>::calcule_poss_blancs(Possible_t& Liste, const Case_t depart, const Hauteur_t hdepalt, const Case_t arrivee)  const {
    Pile_t arr = this->operator[](arrivee);
    bool carr = couleur(arr);
    Hauteur_t harr = taille(arr);
    if (harr) {
            // Il y a quelqu'un
        Hauteur_t charr = harr + _altitude[arrivee];            
        if ( (hdepalt >= charr) && calcule_poss_dessus_blanc(carr,harr) )
            Liste.push_back( Coup(depart, arrivee, 1) );
        if ( (hdepalt <= charr) && calcule_poss_dessous_blanc(carr,harr) )
            Liste.push_back( Coup(depart, arrivee, 0) );
    } else
            // Il n'y a personne
        Liste.push_back( Coup(depart, arrivee, 1) );
    return (carr?pris(arr):uns(arr));
}

template<class Ints>
inline Hauteur_t Agora<Ints>::calcule_poss_noirs(Possible_t& Liste, const Case_t depart, const Hauteur_t hdepalt, const Case_t arrivee)  const {
    Pile_t arr = this->operator[](arrivee);
    bool carr = couleur(arr);
    Hauteur_t harr = taille(arr);
    if (harr) {
            // Il y a quelqu'un
        Hauteur_t charr = harr + _altitude[arrivee];
            
        if ( (hdepalt >= charr) && calcule_poss_dessus_noir(carr,harr))
            Liste.push_back( Coup(depart, arrivee, 1) );
        if ( (hdepalt <= charr)  && calcule_poss_dessous_noir(carr,harr) )
            Liste.push_back( Coup(depart, arrivee, 0) );
    } else
            // Il n'y a personne
        Liste.push_back( Coup(depart, arrivee, 1) );
    return (carr?uns(arr):pris(arr));
}

    // Pour l'instant isolé interdit
template<class Ints>
inline bool Agora<Ints>::calcule_poss_dessus_noir(const bool c, const Hauteur_t t)  const { 
    return ( !c || !t );
}

template<class Ints>
inline bool Agora<Ints>::calcule_poss_dessous_noir(const bool c, const Hauteur_t t)  const {
//     return ( !c && t );
    return ( !c );
}
    
template<class Ints>
inline bool Agora<Ints>::calcule_poss_dessus_blanc(const bool c, const Hauteur_t t)  const {
    return ( c || !t );
}

template<class Ints>
inline bool Agora<Ints>::calcule_poss_dessous_blanc(const bool c, const Hauteur_t t)  const {
//     return ( c && t);
    return c;
}
        
template<class Ints>
inline typename Agora<Ints>::Possible_t& Agora<Ints>::CoupsVoisinsBlancs(Possible_t& Liste, const Case_t i)  const {
    Pile_t dep = this->operator[](i);
    bool cdep = couleur(dep);
#ifdef ADVANCEDRULES
    Hauteur_t voisinsblancs = 0;
#endif
    if (cdep == WHITE)
        if (Hauteur_t hdep = taille(dep) ) {
            Hauteur_t hdepalt = hdep + _altitude[i];
            for(Voisin_t::value_type::const_iterator n = _voisins[i].begin();
                n != _voisins[i].end(); ++n)
#ifdef ADVANCEDRULES
                voisinsblancs +=
#endif
                calcule_poss_blancs( Liste, i, hdepalt, *n);   

#ifdef ADVANCEDRULES
            if ((voisinsblancs == 1) && (uns(dep) == 1))
                for(Voisin_t::value_type::const_iterator n = _voisins[i].begin();
                    n != _voisins[i].end(); ++n)
                    if (! couleur(this->operator[](*n)) && taille(this->operator[](*n))) {
                        Liste.push_back( Coup( i, *n, 1) );
                        break;
                    }
#endif
        }
    return Liste;
}       

template<class Ints>
inline typename Agora<Ints>::Possible_t& Agora<Ints>::CoupsVoisinsNoirs(Possible_t& Liste, const Case_t i)  const {
    Pile_t dep = this->operator[](i);
    bool cdep = couleur(dep);
#ifdef ADVANCEDRULES
    Hauteur_t voisinsnoirs = 0;
#endif
    if (cdep == BLACK)
        if (Hauteur_t hdep = taille(dep) ) {
            Hauteur_t hdepalt = hdep + _altitude[i];
            for(Voisin_t::value_type::const_iterator n = _voisins[i].begin();
                n != _voisins[i].end(); ++n)
#ifdef ADVANCEDRULES
                voisinsnoirs +=
#endif
                calcule_poss_noirs( Liste, i, hdepalt, *n);   
#ifdef ADVANCEDRULES
            if ((voisinsnoirs == 1) && (uns(dep) == 1) )
                for(Voisin_t::value_type::const_iterator n = _voisins[i].begin();
                    n != _voisins[i].end(); ++n)
                    if (couleur(this->operator[](*n)) ) {
                        Liste.push_back( Coup( i, *n, 1) );
                        break;
                    }
#endif
        }
    return Liste;
}       

#include "container_stream.h"

template<class Ints>
inline typename Agora<Ints>::Possible_t& Agora<Ints>::CoupsVoisins(Possible_t& Liste, const Case_t i)  const {
    Liste.resize(0);
    if ( couleur( this->operator[](i) ) )
        return CoupsVoisinsNoirs( Liste, i);
    else
        return CoupsVoisinsBlancs( Liste, i);
//     if ( couleur( this->operator[](i) ) )
//         CoupsVoisinsNoirs( Liste, i);
//     else
//         CoupsVoisinsBlancs( Liste, i);
//     std::cerr << Liste << std::endl;
//     return Liste;
}       

template<class Ints>
inline typename Agora<Ints>::Possible_t& Agora<Ints>::CoupsPossibles(Possible_t& Liste, const bool c)  const {
    Liste.resize(0);
    if (c) {
    CoupsVoisinsNoirs(Liste, 26);
    CoupsVoisinsNoirs(Liste, 27);
    CoupsVoisinsNoirs(Liste, 9);
    CoupsVoisinsNoirs(Liste, 8);
    CoupsVoisinsNoirs(Liste, 13);
    CoupsVoisinsNoirs(Liste, 22);
    CoupsVoisinsNoirs(Liste, 19);
    CoupsVoisinsNoirs(Liste, 16);
    CoupsVoisinsNoirs(Liste, 20);
    CoupsVoisinsNoirs(Liste, 15);
    CoupsVoisinsNoirs(Liste, 21);
    CoupsVoisinsNoirs(Liste, 14);
    CoupsVoisinsNoirs(Liste, 28);
    CoupsVoisinsNoirs(Liste, 7);
    CoupsVoisinsNoirs(Liste, 10);
    CoupsVoisinsNoirs(Liste, 25);
    CoupsVoisinsNoirs(Liste, 32);
    CoupsVoisinsNoirs(Liste, 3);
    CoupsVoisinsNoirs(Liste, 33);
    CoupsVoisinsNoirs(Liste, 2);
    CoupsVoisinsNoirs(Liste, 12);
    CoupsVoisinsNoirs(Liste, 23);
    CoupsVoisinsNoirs(Liste, 18);
    CoupsVoisinsNoirs(Liste, 17);
    CoupsVoisinsNoirs(Liste, 6);
    CoupsVoisinsNoirs(Liste, 29);
    CoupsVoisinsNoirs(Liste, 24);
    CoupsVoisinsNoirs(Liste, 11);
    CoupsVoisinsNoirs(Liste, 34);
    CoupsVoisinsNoirs(Liste, 1);
    CoupsVoisinsNoirs(Liste, 31);
    CoupsVoisinsNoirs(Liste, 4);
    CoupsVoisinsNoirs(Liste, 5);
    CoupsVoisinsNoirs(Liste, 30);
    CoupsVoisinsNoirs(Liste, 35);
    CoupsVoisinsNoirs(Liste, 0);
    } else {
    CoupsVoisinsBlancs(Liste, 26);
    CoupsVoisinsBlancs(Liste, 27);
    CoupsVoisinsBlancs(Liste, 9);
    CoupsVoisinsBlancs(Liste, 8);
    CoupsVoisinsBlancs(Liste, 13);
    CoupsVoisinsBlancs(Liste, 22);
    CoupsVoisinsBlancs(Liste, 19);
    CoupsVoisinsBlancs(Liste, 16);
    CoupsVoisinsBlancs(Liste, 20);
    CoupsVoisinsBlancs(Liste, 15);
    CoupsVoisinsBlancs(Liste, 21);
    CoupsVoisinsBlancs(Liste, 14);
    CoupsVoisinsBlancs(Liste, 28);
    CoupsVoisinsBlancs(Liste, 7);
    CoupsVoisinsBlancs(Liste, 10);
    CoupsVoisinsBlancs(Liste, 25);
    CoupsVoisinsBlancs(Liste, 32);
    CoupsVoisinsBlancs(Liste, 3);
    CoupsVoisinsBlancs(Liste, 33);
    CoupsVoisinsBlancs(Liste, 2);
    CoupsVoisinsBlancs(Liste, 12);
    CoupsVoisinsBlancs(Liste, 23);
    CoupsVoisinsBlancs(Liste, 18);
    CoupsVoisinsBlancs(Liste, 17);
    CoupsVoisinsBlancs(Liste, 6);
    CoupsVoisinsBlancs(Liste, 29);
    CoupsVoisinsBlancs(Liste, 24);
    CoupsVoisinsBlancs(Liste, 11);
    CoupsVoisinsBlancs(Liste, 34);
    CoupsVoisinsBlancs(Liste, 1);
    CoupsVoisinsBlancs(Liste, 31);
    CoupsVoisinsBlancs(Liste, 4);
    CoupsVoisinsBlancs(Liste, 5);
    CoupsVoisinsBlancs(Liste, 30);
    CoupsVoisinsBlancs(Liste, 35);
    CoupsVoisinsBlancs(Liste, 0);        
        
    }
    
    
    return Liste;
}

#endif