// chemin.cpp // (c) 1997, Denis Dumoulin #include "DECOR.H" #include "FIFO.H" #include "ACTION.H" // Mémorise toutes les positions des blupi. void CDecor::CheminMemPos(int exRank) { int rank, index; m_cheminNbPos = 0; index = 0; for ( rank=0 ; rank 0 && m_cheminWork[last] < rebours ) { pos = last; rebours = m_cheminWork[pos]; if (rebours==1) return (dir>=4) ? dir-4 : dir+4; goto bis; // interrompt le for... } } } // ne devrait jamais arriver ! return -1; } } // troisième méthode de recherche // semblable à la précédente, // mais les points à explorer sont classés selon leur distance à la cible void CDecor::CheminFillTerrain(int rank) { long pos, last, dest, dist; int step, dir, cout, action, max, next, ampli; int dx, dy; int but = 1000; if ( m_blupi[rank].cel.x == m_blupi[rank].goalCel.x && m_blupi[rank].cel.y == m_blupi[rank].goalCel.y ) return; pos = m_blupi[rank].cel.y*MAXCELX + m_blupi[rank].cel.x; dest = m_blupi[rank].goalCel.y*MAXCELX + m_blupi[rank].goalCel.x; CPileTriee fifo(2*MAXCELX+2*MAXCELY); // les variantes possibles fifo.put(pos, 0); // position de départ m_cheminWork[pos] = 1; // première position // répète jusqu'à trouvé ou plus de possibilités max = 500; while ( max-- > 0 ) { // reprend une variante de chemin pos = fifo.get(); if ( pos < 0 ) break; step = m_cheminWork[pos]; // on est arrivé au but ? //? if ( pos == dest ) return; if ( pos == dest ) { but = step; // hélas trop lent ! max = 50; } // est-ce vraiment trop loin ? if ( step > 200 ) return; // marque les cases autour du point if ( step < but ) for ( dir=0 ; dir<8 ; dir++ ) { if ( CheminTestDirection(rank, pos, dir, next, ampli, cout, action) ) { last = pos + ampli*next; if ( last<0 || last>=MAXCELX*MAXCELY ) continue; if ( m_cheminWork[last] == 0 || m_cheminWork[last] > step+cout ) { // marque les cases sautées for (int i=1; i