Ecco il sorgente. Ovviamente dato che ci stavo lavorando proprio questa notte potrebbero esserci dei controlli inutili o ripetitivi.. non fateci caso
Può funzionare? Ho sbagliato qualcosa? Grazie in anticipo
codice:
package cavallo;
public class Cavallo {
public static int[][] scacchiera = new int[8][8];
public static int[][] movimento = new int [8][2];
public static boolean FINE = false;
public static int NCO, NCV; //Le nuove coordinate, ottenute sommando il "movimento" alle coordinate attuali
public static void main(String[] args) {
//Azzero la scacchiera
for (int a = 0; a < 8; a++)
for (int b = 0; b < 8; b++) {
scacchiera[a][b] = 0;
}
//Scrivo i movimenti che può fare il cavallo nell'arrat "movimento"
movimento[0][0] = 2;
movimento[0][1] = 1;
movimento[1][0] = 1;
movimento[1][1] = 2;
movimento[2][0] = 2;
movimento[2][1] = -1;
movimento[3][0] = 1;
movimento[3][1] = -2;
movimento[4][0] = -2;
movimento[4][1] = 1;
movimento[5][0] = -1;
movimento[5][1] = 2;
movimento[6][0] = -2;
movimento[6][1] = -1;
movimento[7][0] = -1;
movimento[7][1] = -2;
//Richiamo l'algoritmo, facendo partire il cavallo verso il passo 2
scacchiera[0][0] = 1;
Muovi(0, 0, 2);
//Stampo le Coordinate della scacchiera e il numero del passo che contengono per
//verificare la riuscita dell'algoritmo
for (int a = 0; a < 8; a++)
for (int b = 0; b < 8; b++) {
System.out.println("A: " + a + " | B: " + b + " = " + scacchiera[a][b]);
}
}
public static void Muovi(int CO, int CV, int Npasso) {
//Ciclo for che richiama le 8 mosse possibili del cavallo
for (int i = 0; i < 8; i++) {
if (FINE == true) { //Controllo che termina i vari cicli for se siamo arrivati alla fine
break;
} else {
//Se il cavallo si trova in un vicolo cieco ed è costretto a tornare al passo precedente,
//questa funzione toglie il passo Npasso dalla scacchiera.
ControllaPasso(Npasso);
//Se la prossima mossa è consentita, si procede con l'algoritmo
if (ControllaMossa(CO, CV, i) == 1) {
NCO = CO + movimento[i][0];
NCV = CV + movimento[i][1];
scacchiera[NCO][NCV] = Npasso; //Scrivo il numero del passo nelle coordinate
//Stampa di controllo del processo. Mostra tutti i movimenti del cavallo. Da togliere.
System.out.println("CO: " + CO + "| CV: " + CV + " | NCO,NCV: " + NCO + ", "+ NCV + " || Passo: " + Npasso);
//Se il cavallo arriva all'ultima casella il ciclo finisce e l'algoritmo è completo.
if (Npasso == 64) {
FINE = true;
break;
}
Muovi(NCO, NCV, Npasso + 1);
}
}
}
}
public static int ControllaMossa(int X, int Y, int indice) {
X = X + movimento[indice][0];
Y = Y + movimento[indice][1];
//Se il cavallo non esce dai lati della scacchiera e la casella dove vuole muoversi è vuota,
//il movimento può essere fatto (return 1)
if ((((X < 8) && (X > -1)) && ((Y < 8) && (Y > -1))) && scacchiera[X][Y] == 0)
return 1;
else
return 0;
}
public static void ControllaPasso(int Npasso){
//Controlla se il passo attuale è già stato inserito nella scacchiera. In questo caso,
//il passo inserito viene rimosso e permette al nuovo ciclo di inserire il passo Npasso
for (int a = 0; a < 8; a++)
for (int b = 0; b < 8; b++) {
if (scacchiera[a][b] == Npasso) {
scacchiera[a][b] = 0;
a = 8;
break;
}
}
}
}