Ho allegato un archivio zip con del codice (lo trovi in fondo alla pagina).
Non sono riuscito a scrivere tutto in un solo file (ho utilizzato diverse classi) quindi per comodità ho inserito tutto in un archivio zip.
Istruzioni:
Estrarre l'archivio;
Aprire un terminale;
Spostarsi all'interno dell'archivio;
Compilare ed eseguire con i seguenti comandi:
Codice: Seleziona tutto
g++ Cavallo.cpp ListaPezzi.cpp ListaSpostamenti.cpp main.cpp Pezzo.cpp Random.cpp Scacchiera.cpp Spostamento.cpp
./a.out
Inizio con il dire che sono un po' arrugginito con il C++ (da un po' uso solo Java) quindi qualche cosa non è implementata al massmo (costruttori e funzioni virtuali sono molto da migliorare).
Non ho usato allocazione dinamica per liste perché mi scocciavo.
Non ho risolto il problema degli scacchi in maniera totale, ma bisognerebbe pensare ad una struttura diversa a causa della complessità degli scacchi (pedoni si muovono in diagonale per mangiare e diritti se non devono mangiare, alfieri, torri e regina non possono attraversare pezzi spostandosi, re e torre possono arroccare, se in una casella c'è un pezzo di un altro colore è possibile mangiare mentre se il pezzo è dello stesso colore non è possibile andare in nessun caso in quella casella... e altre diavolerie degli scacchi).
Tutto sommato possono considerare risolto in pieno il tuo esercizio.
La struttura è stata pensata molto ad oggetti, ne esistono un bel po'.
La
scacchiera contiene diversi
pezzi.
Un
pezzo è la base di una gerarchia per i
cavalli ma anche per gli altri pezzi. Con questa struttura riesci a far muovere un altro pezzo (ad es. alfiere) sulla scacchiera senza grandi difficoltà (lo crei in un paio di minuti).
Ogni pezzo può effettuare dei particolare
spostamenti.
E così via.
Leggendo la tua ultima spiegazione ho visto del teorema di Eulero. Non lo conoscevo... è interessante ma non lo risolverai sicuramente così.
Mi viene il dubbio se c'è una sola sequenza che sposta il cavallo nelle 64 caselle oppure tutte le sequenze che non portano il cavallo due volte sullo stesso punto sono una soluzione al teorema.
Nel primo caso non risolverai mai il problema se lo non lo studi più a fondo.
Nel secondo caso puoi provare a modificare la riga di codice nel main (se ricordo bene) che invece di spostare un cavallo in una posizione ne aggiunge un altro senza rimuovore il precedente. Non è complicato. Così il cavallo non potrà mai tornare indietro e occupare una casella in cui ci è già stato.
Ci sono un bel cose da controllare, poiché ho ampliato il problema pensando anche a pezzi futuri e spostamenti su scacchiere con più pezzi ma mai utilizzato quei metodi, potrebbero esserci dei bug oppure metodi inimplementati.
Per quanto riguarda il tuo codice ho notato un errore, utilizzi un array di 64 elementi in cui memorizzi le mosse da effettuare (se non erro si chiama mossaCasuale) e ci accedi anziché in maniera sequenziale (infatti dovresti memorizzare la prima, la seconda, la terza, ..., l'ennesima mossa) ci accedi in maniera casuale. Ossia scegli una mossa a caso, la quinta e la metti in posizione cinque. Ti fermi alla mossa sei perché dopo le prime sei mosse casuali hai riempito i primi sei elementi e tutte le mosse a caso già le hai usate (ma non c'è nessun vincolo che non puoi usare due volte la stessa mossa per spostare il cavallo).
Spero di essere stato chiaro nella spiegazione o che almeno il codice sia abbastanza intuitivo.
Se nel codice che ho inserito non capisci qualcosa chiedi pure.
Ciao e buono studio.
OFF TOPICS
Immagino quella di programmare sia una passione. Se sei giovane e stai studiando come farlo per lavoro, sei ancora in tempo per cambiare idea e fare il calciatore... la vita del programmatore fa schifo! (Scherzo!

ma mica tanto :P).
Ma se sei proprio cocciuto e vuoi fare il programmatore ti consiglio di darci dentro con il C++, capire bene le classi, ereditarietà, polimorfismo (forse perdere un po' meno tempo su puntatori) e poi passare, non avere fretta però, al Java e dare uno sguardo anche al mondo del web (html e css).
Non c'è nulla di più richiesto dalle aziende.
Ah dimenticavo, non usare guide su internet come C++ in dieci minuti o cose del genere (sono tutte fregature).
Se puoi fai una spesa una volta per tutte compra un manuale di quelli con almeno 1000 pagine su un linguaggio e studialo bene. Sicuramente non sono soldi buttati.
Ciao.