non so quale debugger usiparte che non ho capito come fare
cambia lo stato del processo! cioè i valori delle variabili e quello che ritorna rnd...non riesco a capire che cosa cambia al 6°-7°
non so quale debugger usiparte che non ho capito come fare
cambia lo stato del processo! cioè i valori delle variabili e quello che ritorna rnd...non riesco a capire che cosa cambia al 6°-7°

Codice: Seleziona tutto
#include "./random.h"
#include <iostream>
using namespace std;
class Cavallo{
public:
Cavallo();
void displayMessage(int count01);
void sposta();
void gesioneErrore(int errore);
int maxSpostamento(int tempPosColonna, int tempPosRiga);
int generaMovimento();
void dbgMossa(int mossa);
~Cavallo();
private:
// variabili di prova
int dbg01;
int dbg02;
//________________________
int maxRangeColonna;
int maxRangeRiga;
//int mossa;
int posRiga;
int posColonna;
int *arrayMosseCasuali;
int *arrayMemorizzaScelte;
int *arrayOrizontale;
int *arrayVerticale;
int **arrayMovimento;
};
int main(){
Cavallo ilMioCavallo;
ilMioCavallo.sposta();
ilMioCavallo.~Cavallo();
return 0;
}
Cavallo::~Cavallo(){
delete [] arrayMemorizzaScelte;
delete [] arrayMosseCasuali;
delete [] arrayOrizontale;
delete [] arrayVerticale;
for (int i1 = 0; i1 < maxRangeColonna; i1++){
delete []arrayMovimento[i1];
}
delete [] arrayMovimento;
}
Cavallo::Cavallo(){
// Variabili di prova
dbg01 = 0;
int numeroMosse = 64;
//_______________________
maxRangeColonna = 8;
maxRangeRiga = 8;
// possibile errore
int arraySize = 64;
//__________________
posRiga = 4;
posColonna = 3;
// crea lo spazio per la creazione degli array
arrayMosseCasuali = new int [numeroMosse];
arrayOrizontale = new int [arraySize];
arrayVerticale = new int [arraySize];
// NON EFFICIENTE
arrayMemorizzaScelte = new int [arraySize];
// azzera il contatore delle mosse già estratte
for ( int i1 = 0; i1 < numeroMosse; i1++)
arrayMosseCasuali[i1] = 0;
// crea arrayBidimensionale
arrayMovimento = new int *[maxRangeColonna];
for (int i1 = 0; i1 < maxRangeColonna; i1++){
arrayMovimento[i1] = new int [maxRangeRiga];
}
//inizializza arrayBidimensionale
for (int i1 = 0; i1 < maxRangeColonna; i1++){
for ( int i2 = 0; i2 < maxRangeRiga; i2++){
arrayMovimento[i1][i2] = 0;
}
}
// posizione il cursone nella tabella
arrayMovimento[posColonna][posRiga] = 0;
// poszioni possibili
arrayOrizontale[0] = 2;
arrayOrizontale[1] = 1;
arrayOrizontale[2] = -1;
arrayOrizontale[3] = -2;
arrayOrizontale[4] = -2;
arrayOrizontale[5] = -1;
arrayOrizontale[6] = 1;
arrayOrizontale[7] = 2;
arrayVerticale[0] = -1;
arrayVerticale[1] = -2;
arrayVerticale[2] = -2;
arrayVerticale[3] = -1;
arrayVerticale[4] = 1;
arrayVerticale[5] = 2;
arrayVerticale[6] = 2;
arrayVerticale[7] = 1;
}
void Cavallo::displayMessage(int count01){
// mette a video i movimenti
bool dbgSentinell01 = true;
cout << "Scelte fatte ";
for ( int i1 = 0; i1 < count01; i1++){
cout << arrayMemorizzaScelte[i1] << " ";
}
cout << "\nNumero mosse " << count01 << endl;
cout << endl;
// MOMENTANEAMENTE ABILITATO
if ( dbgSentinell01 == true ){
for(int i1 = 0;i1 < maxRangeColonna;i1++){
for(int i2 = 0;i2 < maxRangeRiga;i2++){
cout << arrayMovimento[i1][i2];
}
cout << endl;
}
}
}
void Cavallo::sposta(){
int tempPosColonna = 0;
int tempPosRiga = 0;
int mossa = 0;
int dbgVal01 = 0;
for (int count01 = 0; mossa != 19; count01++){
cout << "Inserisci un altra mossa ";
//cin >> mossa;
//dbgMossa();
if ( count01 <= 64)
mossa = generaMovimento();
else
mossa = 19;
// prepara il a muovere il cursore
tempPosColonna = posColonna;
tempPosRiga = posRiga;
tempPosColonna += arrayVerticale[mossa];
tempPosRiga += arrayOrizontale[mossa];
// se i movimenti sono corretti sposa il cursore
if ( count01 == 5 )
dbgVal01 = arrayMovimento[posColonna][posRiga];
if ( maxSpostamento( tempPosColonna, tempPosRiga ) == 0){
if (arrayMovimento[tempPosColonna][tempPosRiga] == 0 ){
posColonna += arrayVerticale[mossa];
posRiga += arrayOrizontale[mossa];
// memoria e conta il numero delle mosse
arrayMovimento[posColonna][posRiga] = count01;
// memorizza le scelte fatte
arrayMemorizzaScelte[count01] = mossa;
tempPosColonna = 0;
tempPosRiga = 0;
cout << endl;
displayMessage(count01);
}else{
count01--;
//mossa = generaMovimento();
}
}else{
count01--;
tempPosColonna = tempPosRiga = 0;
gesioneErrore(1);
//mossa = generaMovimento();
displayMessage(count01);
}
//displayMessage(count01);
}
}
int Cavallo::generaMovimento(){
int dbgSentinel001 = false;
int dbgTemp001 = 0;
int mossaCasuale = 0;
int uscita = 0;
mossaCasuale = rnd(0,7);
do{
if ( arrayMosseCasuali[mossaCasuale] == 0 ){
arrayMosseCasuali[mossaCasuale] = 1;
uscita = 1;
break;
}
if ( arrayMosseCasuali[mossaCasuale] == 1 ){
mossaCasuale = rnd(0,7);
uscita = 0;
}
}while ( uscita == 0 );
return mossaCasuale;
}
void Cavallo::gesioneErrore(int errore){
switch (errore){
case 1:
cout << "Movimento errato\n";
break;
case 2:
cout << "Non ci sono più mosse disponibili\n)";
break;
default:
cout << "Errore imprevisto " << errore << endl;
break;
}
}
int Cavallo::maxSpostamento( int tempPosColonna, int tempPosRiga ){
if ( tempPosColonna >= 0 and tempPosRiga >= 0
and tempPosColonna <= maxRangeColonna and tempPosRiga <= maxRangeRiga)
return 0;
else
return 1;
}
void Cavallo::dbgMossa(int mossa){
switch (dbg01){
case 0:
mossa = 5;
break;
case 1:
mossa = 1;
break;
case 2:
mossa = 1;
break;
case 3:
mossa = 7;
//dbg02 = 200;
break;
case 4:
mossa = 2;
break;
case 5:
mossa = 8;
break;
case 6:
mossa = 19;
break;
}
dbg01++;
}Codice: Seleziona tutto
#include <ctime>
using std::time;
#include <cstdlib>
using std::rand;
using std::srand;
int rnd(int inizio = 1, int fine = 5000){
int val1 = 0;
static bool s1 = true;
if (s1 == true){
srand(time(0));
s1 = false;
}
val1 = inizio + (rand()%(fine-inizio))
;
return val1;
}
Codice: Seleziona tutto
val1 = inizio + (rand()%(fine-inizio + 1));
codeblocks + gnu gcc compilernon so quale debugger usi.
Semplice, l'unico scopo di questa funzione è generare numeri a caso, è stato creata per non dover ogni volta inserire a mano dati come in questo caso:A parte la funzione rnd, che dovresti testare a parte e una volta verificata la correttezza chiudere la questione, ci spieghi qualcosa in più?
Devo simulare il movimento a L di un cavallo nel gioco degli scacchi. Il matematico Eulero a dimostrato (spero) che è possibile muovere un cavallo all'interno di una scacchiera toccando una sola volta ciascun dei 64 quadrati.Che significa il programma deve simulare il movimento del cavallo e fare quante più mosse possibili?
Si la scacchiera è vuota, attualmente il cavallo si trova nella posizione centrale. Più avanti la sposterò in un altra posizione..Hai una scacchiera vuota e il cavallo in una posizione iniziale?
In teoria se riuscissi a creare un algoritmo decente dovrei utilizzare SOLO 64 mosse, ma attualemte il mio programma si blocca al 6°-7° movimento quindi....... un disastro.In tal caso le mosse sono infinite, vuoi farne fare le prime N a caso?
Per ora ho creato solo un arraybidimensionale da 8 x 8 posizioni.Come hai implementato la scacchiera?
Attraverso questi array, ho ricreato tutte le possibili posizioniE come hai indicato i movimenti del cavallo?
Codice: Seleziona tutto
arrayOrizontale[0] = 2;
arrayOrizontale[1] = 1;
arrayOrizontale[2] = -1;
arrayOrizontale[3] = -2;
arrayOrizontale[4] = -2;
arrayOrizontale[5] = -1;
arrayOrizontale[6] = 1;
arrayOrizontale[7] = 2;
arrayVerticale[0] = -1;
arrayVerticale[1] = -2;
arrayVerticale[2] = -2;
arrayVerticale[3] = -1;
arrayVerticale[4] = 1;
arrayVerticale[5] = 2;
arrayVerticale[6] = 2;
arrayVerticale[7] = 1;
Codice: Seleziona tutto
posColonna += arrayVerticale[mossa];
posRiga += arrayOrizontale[mossa];
// memoria e conta il numero delle mosse
arrayMovimento[posColonna][posRiga] = count01;
Ho usato una classe solo per semplicità, se hai una idea migliore ben venga.Inoltre mi sembra strana la tua progettazione ad oggetti... in fondo la sola classe Cavallo non è una buona soluzione.
Veramente ero convinto di averlo fatto, ma vedo che non è cosiNon ho capito cosa deve fare il programma, ma in una progettazione a oggetti è bene suddivere il problema in diversi oggetti.
Vuoi che rimuova il file precedente e lo sostituisca con quello tuo nuovo?Posto nuovamente il codice.
Ogni modifica che fai ti consiglio di aggiornare il codice così non si perdono le modifiche.


Codice: Seleziona tutto
g++ Cavallo.cpp ListaPezzi.cpp ListaSpostamenti.cpp main.cpp Pezzo.cpp Random.cpp Scacchiera.cpp Spostamento.cpp
./a.out

Esattamente, amo i computer da ormai 11 anni, spazio da Windows a Linux e tra poco anche nella programmazione.Immagino quella di programmare sia una passione.
Si sono giovane ma non quanto pensi tu, diciamo che sono un po vecchio per iniziare a fare il calciatore... Ho 30 anni e fortunatamente ho un lavoro stabile che di questi tempi c'è da ritenersi un eletto del Signore, quindi non preoccuparti non voglio fare il programmatore di mestiere (b2b)Se sei giovane e stai studiando come farlo per lavoro, sei ancora in tempo per cambiare idea e fare il calciatore...
Sto facendo il possibile, ma tu che sei un programmatore sai quanto sia difficile e frustrante studiare il c++ completamente da solo, meno male che ci siete voi... altrimenti non saprei dove sbattere la testa.ti consiglio di darci dentro con il C++, capire bene le classi, ereditarietà, polimorfismo
Perché passare al Java? Onestamente mi sembra un sistema MOLTO pesante. L'Ide Eclipse per esempio è 100 volte più bello di Codeblock (IMHO) però è un macigno da 110mb solo per accenderlo.... per me è un po eccessivo..... Posso capire Java in un cellulare ma giusto li, puoi darmi una tua opinione??poi passare, non avere fretta però, al Java
Si ho già scoperto la poca utilità di quelle agghiaccianti guide da 10 min, ho optato per un doppio volume da 800 pagine "I Fondamenti del c++" dei fratelli Deitel una mazzata in testa ma mi sembra molto validoAh 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.

Inizio con il dire che sono un po' arrugginito con il C++

Non conosco Codeblock, ma eclipse è molto bello anche per programmare in C++.Perché passare al Java? Onestamente mi sembra un sistema MOLTO pesante. L'Ide Eclipse per esempio è 100 volte più bello di Codeblock (IMHO) però è un macigno da 110mb solo per accenderlo.... per me è un po eccessivo..... Posso capire Java in un cellulare ma giusto li, puoi darmi una tua opinione??

Forse è un po' vero.KubuntuChancellor ha scritto: Di la verità che ti sei fatto prendere la mano......
Codice: Seleziona tutto
#include "./random.h"
#include <iostream>
using namespace std;
class Cavallo{
public:
Cavallo();
void displayMessage(int count01);
void sposta();
void gesioneErrore(int errore);
int maxSpostamento(int tempPosColonna, int tempPosRiga);
int generaMovimento();
void dbgMossa(int mossa);
~Cavallo();
private:
// variabili di prova
int dbg01;
int dbg02;
//________________________
int maxRangeColonna;
int maxRangeRiga;
//int mossa;
int posRiga;
int posColonna;
int *arrayMosseCasuali;
int *arrayMemorizzaScelte;
int *arrayOrizontale;
int *arrayVerticale;
int **arrayMovimento;
};
int main(){
Cavallo ilMioCavallo;
ilMioCavallo.sposta();
ilMioCavallo.~Cavallo();
return 0;
}
Cavallo::~Cavallo(){
delete [] arrayMemorizzaScelte;
delete [] arrayMosseCasuali;
delete [] arrayOrizontale;
delete [] arrayVerticale;
for (int i1 = 0; i1 < maxRangeColonna; i1++){
delete []arrayMovimento[i1];
}
delete [] arrayMovimento;
}
Cavallo::Cavallo(){
// Variabili di prova
dbg01 = 0;
int numeroMosse = 64;
//_______________________
maxRangeColonna = 8;
maxRangeRiga = 8;
// possibile errore
int arraySize = 64;
//__________________
posRiga = 4;
posColonna = 3;
// crea lo spazio per la creazione degli array
arrayMosseCasuali = new int [numeroMosse];
arrayOrizontale = new int [arraySize];
arrayVerticale = new int [arraySize];
// NON EFFICIENTE
arrayMemorizzaScelte = new int [arraySize];
// azzera il contatore delle mosse già estratte
for ( int i1 = 0; i1 < numeroMosse; i1++)
arrayMosseCasuali[i1] = 0;
// crea arrayBidimensionale
arrayMovimento = new int *[maxRangeColonna];
for (int i1 = 0; i1 < maxRangeColonna; i1++){
arrayMovimento[i1] = new int [maxRangeRiga];
}
//inizializza arrayBidimensionale
for (int i1 = 0; i1 < maxRangeColonna; i1++){
for ( int i2 = 0; i2 < maxRangeRiga; i2++){
arrayMovimento[i1][i2] = 0;
}
}
// posizione il cursone nella tabella
arrayMovimento[posColonna][posRiga] = 0;
// poszioni possibili
arrayOrizontale[0] = 2;
arrayOrizontale[1] = 1;
arrayOrizontale[2] = -1;
arrayOrizontale[3] = -2;
arrayOrizontale[4] = -2;
arrayOrizontale[5] = -1;
arrayOrizontale[6] = 1;
arrayOrizontale[7] = 2;
arrayVerticale[0] = -1;
arrayVerticale[1] = -2;
arrayVerticale[2] = -2;
arrayVerticale[3] = -1;
arrayVerticale[4] = 1;
arrayVerticale[5] = 2;
arrayVerticale[6] = 2;
arrayVerticale[7] = 1;
}
void Cavallo::displayMessage(int count01){
// mette a video i movimenti
bool dbgSentinell01 = true;
cout << "Scelte fatte ";
for ( int i1 = 0; i1 < count01; i1++){
cout << arrayMemorizzaScelte[i1] << " ";
}
cout << "\nNumero mosse " << count01 << endl;
cout << endl;
// MOMENTANEAMENTE ABILITATO
if ( dbgSentinell01 == true ){
for(int i1 = 0;i1 < maxRangeColonna;i1++){
for(int i2 = 0;i2 < maxRangeRiga;i2++){
if (arrayMovimento[i1][i2]<10) {
cout << "0" << arrayMovimento[i1][i2] << " ";
} else {
cout << arrayMovimento[i1][i2] << " ";
}
}
cout << endl;
}
}
}
void Cavallo::sposta(){
int tempPosColonna = 0;
int tempPosRiga = 0;
int mossa = 0;
int dbgVal01 = 0;
for (int count01 = 0; mossa != 19; count01++){
cout << "Inserisci un altra mossa ";
//cin >> mossa;
//dbgMossa();
if ( count01 <= 64)
mossa = generaMovimento();
else
mossa = 19;
// prepara il a muovere il cursore
tempPosColonna = posColonna;
tempPosRiga = posRiga;
tempPosColonna += arrayVerticale[mossa];
tempPosRiga += arrayOrizontale[mossa];
// se i movimenti sono corretti sposta il cursore
if ( count01 == 5 )
dbgVal01 = arrayMovimento[posColonna][posRiga];
if ( maxSpostamento( tempPosColonna, tempPosRiga ) == 0){
if (arrayMovimento[tempPosColonna][tempPosRiga] == 0 ){
posColonna += arrayVerticale[mossa];
posRiga += arrayOrizontale[mossa];
// memoria e conta il numero delle mosse
arrayMovimento[posColonna][posRiga] = count01;
// memorizza le scelte fatte
arrayMemorizzaScelte[count01] = mossa;
tempPosColonna = 0;
tempPosRiga = 0;
cout << endl;
displayMessage(count01);
}else{
count01--;
//mossa = generaMovimento();
}
}else{
count01--;
tempPosColonna = tempPosRiga = 0;
gesioneErrore(1);
//mossa = generaMovimento();
displayMessage(count01);
}
//displayMessage(count01);
}
}
int Cavallo::generaMovimento(){
int dbgSentinel001 = false;
int dbgTemp001 = 0;
int mossaCasuale = 0;
int uscita = 0;
mossaCasuale = rnd(0,7);
/*perche' vai sempre sugli stessi indici? non devi riempire tutti e sessantaquattro elementi del vettore?
do{
if ( arrayMosseCasuali[mossaCasuale] == 0 ){
arrayMosseCasuali[mossaCasuale] = 1;
uscita = 1;
break;
}
if ( arrayMosseCasuali[mossaCasuale] == 1 ){
mossaCasuale = rnd(0,7);
uscita = 0;
}
}while ( uscita == 0 );*/
for (int i=0; i<64; i++) {
mossaCasuale = rnd(0,7);
arrayMosseCasuali[mossaCasuale] = 1;
}
return mossaCasuale;
}
void Cavallo::gesioneErrore(int errore){
switch (errore){
case 1:
cout << "Movimento errato\n";
break;
case 2:
cout << "Non ci sono più mosse disponibili\n)";
break;
default:
cout << "Errore imprevisto " << errore << endl;
break;
}
}
int Cavallo::maxSpostamento( int tempPosColonna, int tempPosRiga ){
if ( tempPosColonna >= 0 and tempPosRiga >= 0
and tempPosColonna <= maxRangeColonna and tempPosRiga <= maxRangeRiga)
return 0;
else
return 1;
}
void Cavallo::dbgMossa(int mossa){
switch (dbg01){
case 0:
mossa = 5;
break;
case 1:
mossa = 1;
break;
case 2:
mossa = 1;
break;
case 3:
mossa = 7;
//dbg02 = 200;
break;
case 4:
mossa = 2;
break;
case 5:
mossa = 8;
break;
case 6:
mossa = 19;
break;
}
dbg01++;
}Codice: Seleziona tutto
#include <ctime>
using std::time;
#include <cstdlib>
using std::rand;
using std::srand;
int rnd(int inizio = 1, int fine = 5000){
int val1 = 0;
static bool s1 = true;
if (s1 == true){
srand(time(0));
s1 = false;
}
val1 = inizio + (rand()%(fine-inizio+1));
return val1;
}Codice: Seleziona tutto
val1 = inizio + (rand()%(fine-inizio+1));
Modificato!NK ha scritto:
ripeto il codice per la rnd è:con il +, fate copia e incollaCodice: Seleziona tutto
val1 = inizio + (rand()%(fine-inizio+1));![]()
Sono pienamente d'accordo, un programma si progetta prima sulla carta e solo dopo si codifica.NK ha scritto: Ma ricordati sempre che la cosa fondamentale è progettare bene il programma, e poi codificarlo in modo giusto.
Come si dice? Chi ben comincia ... ;)

Tutto i resto lo conoscevo, ma cercavo proprio questa funzione :-)"Edit Breackpoint" puoi dire al debugger dopo quanti passaggi per quel punto si deve bloccare, oppure puoi mettere una condizione che dirà al debugger se fermarsi o no.
Cerco sempre prima far funzionare le logiche sulla carta e DOPO lo metto su computer.... Purtroppo non sempre tutto va per il verso giusto....Ma ricordati sempre che la cosa fondamentale è progettare bene il programma, e poi codificarlo in modo giusto.
Tutte quello che inizia con dbg* non fa parte del programma ma serve a me per fare delle prove....Il metodo void Cavallo::dbgMossa(int mossa) non l'ho capito. Cosa sono tutte quelle costanti?

Comunque ho provato a tentativo a correggere l'errore che ti ho indicato al post precedente....../*perche' vai sempre sugli stessi indici? non devi riempire tutti e sessantaquattro elementi del vettore?
Codice: Seleziona tutto
do{
if ( arrayMosseCasuali[mossaCasuale] == 0 ){
arrayMosseCasuali[mossaCasuale] = 1;
uscita = 1;
break;
}
if ( arrayMosseCasuali[mossaCasuale] == 1 ){
mossaCasuale = rnd(0,7);
uscita = 0;
}
}while ( uscita == 0 );*/
Codice: Seleziona tutto
for (int i=0; i<64; i++) {
mossaCasuale = rnd(0,7);
arrayMosseCasuali[mossaCasuale] = 1;
}
Codice: Seleziona tutto
#include "./random.h"
#include <iostream>
using namespace std;
const int DIM_SCACCHIERA = 8;
void inizializzaScacchiera(int scacchiera[DIM_SCACCHIERA][DIM_SCACCHIERA]) {
// DA IMPLEMENTARE
// inizializza la scacchiera con tutti 0
}
// restituisce uno spostamento possibile del cavallo sulla scacchiera
int getRandomMossa(const int scacchiera[DIM_SCACCHIERA][DIM_SCACCHIERA], int contatoreMosse) {
// DA IMPLEMENTARE
// l'algoritmo e':
// scegli un numero casuale X da 0 a 7 utilizzando la funzionie rnd
// controlla le coordinate della casella su cui dovra' andare il cavallo
// se c'e' uno zero
// restituisci il numero della mossa indicata
// altrimenti
// si incrementa X modulo 8 ( x = (x + 1) % 8 ) e si ricontrolla
// tutto questo per max 8 iterazioni. Se all'ottava iterazione ancora non è valida si restituisce -1;
}
// visualizza la scacchiera sulla console
void displayScacchiera(const int scacchiera[DIM_SCACCHIERA][DIM_SCACCHIERA]) {
// DA IMPLEMENTARE
// stampa tutti i valori dell'array bidimensionale
}
// trova il cavallo sulla scacchiera e restituisce le sue coordinate in un vettore
void getPosizioneCavallo(const int scacchiera[DIM_SCACCHIERA][DIM_SCACCHIERA], int contatoreMosse, int coordinateCavallo[2]) {
// DA IMPLEMENTARE
}
// data una mossa e la posizione iniziale di un cavallo restituisce la sua posizione dopo la mossa
// a seconda della mossa ritorna le ipotetiche coordinate successive
void getPosizioneSuccessiva(const int coordinateCavallo[2], int mossa, int coordinateSuccessive[2]) {
// DA IMPLEMENTARE
// Questi sono gli spostamenti relativi di un cavallo. Ti trovi?
// 0 corrisponde alla mossa x += 2; y += 1
// 1 corrisponde alla mossa x -= 2; y += 1
// 2 corrisponde alla mossa x += 2; y -= 1
// 3 corrisponde alla mossa x -= 2; y -= 1
// 4 corrisponde alla mossa x += 1; y += 2
// 5 corrisponde alla mossa x += 1; y -= 2
// 6 corrisponde alla mossa x -= 1; y += 2
// 7 corrisponde alla mossa x -= 1; y -= 2
}
// muove il cavallo sulla scacchiera
void muoviCavallo(int scacchiera[DIM_SCACCHIERA][DIM_SCACCHIERA], int mossaScelta, int contatoreMosse) {
// DA IMPLEMENTARE
// cerca gli indice in cui si trova il valore "contatoreMosse" nell'array bidimensionale
// (in pratica cerca la posizione in cui si trovata il cavallo).
// a seconda della "mossaScelta" calcola i nuovi indici in cui andra' il cavallo.
// inserisce nei nuovi indici "contatoreMosse+1" il cavallo.
}
// MAIN DEL PROGRAMMA TUTTO IMPLEMENTATO
int main() {
cout << "Cavallo in movimento su Scacchiera." << endl;
// definisce la scacchiera
// 0 vuol dire che la posizione e' vuota un numero maggiore di 0 vuol dire
// che il cavallo e' passato in quella posizione alla ennesima mossa
int scacchiera[8][8];
inizializzaScacchiera(scacchiera);
// variabile che conta le mosse del cavallo
int contatoreMosse = 1;
// mettiamo inizialmente il cavallo in una casella centrale
scacchiera[3][3] = contatoreMosse;
// mostra la scacchiera
displayScacchiera(scacchiera);
// ciclo infinito che muove il cavallo finche' possibile
while (true) {
// genera una mossa
int mossaScelta = getRandomMossa(scacchiera, contatoreMosse);
if (mossaScelta>=0) {
// muove il cavallo
muoviCavallo(scacchiera, mossaScelta, contatoreMosse++);
// mostra la scacchiera
displayScacchiera(scacchiera);
} else {
// esce dal ciclo infinito in quanto non ci sono piu' mosse possibili
break;
}
}
cout << "FINE." << endl;
}Codice: Seleziona tutto
#include <ctime>
using std::time;
#include <cstdlib>
using std::rand;
using std::srand;
int rnd(int inizio = 1, int fine = 5000){
int val1 = 0;
static bool s1 = true;
if (s1 == true){
srand(time(0));
s1 = false;
}
val1 = inizio + (rand()%(fine-inizio+1));
return val1;
}
Giustissimo, non ci avevo proprio pensato. Se la mossa non è buona invece di sceglierne un'altra a caso prende la successivaNK ha scritto: Buona strutturazione! un suggerimento per la funzione getRandomMossa, la si può implementare così:
Si estrae un numero a caso X tra 0 e 7 e poi si controlla se la mossa X è fattibile, se si si ritorna X, se non lo è si incrementa X modulo 8 ( x = (x + 1) % 8 ) e si ricontrolla, tutto questo per max 8 iterazioni. Se all'ottava iterazione ancora non è valida si restituisce -1;
Questo algoritmo è semplice ed esatto
Codice: Seleziona tutto
int getRandomMossa(int scacchiera[DIM_SCACCHIERA][DIM_SCACCHIERA]);Codice: Seleziona tutto
int getRandomMossa(int scacchiera[DIM_SCACCHIERA][DIM_SCACCHIERA], int contatoreMosse);Codice: Seleziona tutto
// trova il cavallo sulla scacchiera e restituisce le sue coordinate in un vettore
void getPosizioneCavallo(const int scacchiera[DIM_SCACCHIERA][DIM_SCACCHIERA], int contatoreMosse, int coordinateCavallo[2]);
// data una mossa e la posizione iniziale di un cavallo restituisce la sua posizione dopo la mossa
void getPosizioneSuccessiva(const int coordinateCavallo[2], int mossa, int coordinateSuccessive[2]);
Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti