#include #include #include #include"schema15.hpp" using namespace std; // costruttore di default. Inizializza il gioco con la configurazione finale // 1 2 3 4 5 6 ... 13 14 15 // schema15::schema15() { inizializza(); } // secondo costruttore: Inizializza il gioco con una configurazione casuale. // nel caso (estremamente raro) che il metodo genera() non riesca a estrarre // una configurazione risolvibile, riparte dalla configurazione iniziale. // schema15::schema15(int seed) { if(!genera(seed)) inizializza(); } // crea la configurazione inziale // bool schema15::inizializza() { for (int i=1;i<=16;i++) pad[i-1]=i; num_mosse=0; vX=vY=4; return true; } // inizializza lo schema di gioco utilizzando i valori forniti con l'array conf[]. // Verifica se la sequenza è lecita (contiene tutti i numeri da 1 a 16) e se la // configurazione risulta valida. Restituisce true se tutto va bene. // bool schema15::inizializza(int *conf) { bool check[16]={false}; int vpos,numcount=0; num_mosse=0; for(int i=0;i<16;i++) { pad[i]=conf[i]; if(!check[i]) { check[i]=true; numcount++; } if(pad[i]==16) vpos=i; } if (numcount!=16) return false; vX=vpos/4; vY=vpos%4; return valido(); } bool schema15::inizializza(int *conf,int m) { bool v; v=inizializza(conf); num_mosse=m; return v; } // genera una permutazione della configurazione iniziale e verifica che sia // risolvibile e restituisce true. In caso di esito negativo, ripete il tentativo // per al piu' maxiter tentativi (evento piuttosto raro). Se tutto va male, // restituisce false. Il programma gestisce. // bool schema15::genera(int seed) { bool v=false; int tentativi=0; inizializza(); do { mischia(seed); v=valido(); tentativi++; } while (!v&&tentativi