Oppure

Loading
22/12/09 13:07
salve raga vi chiedo un aiutino...conoscerete di sicuro l'enigma della mossa del cavallo,
per chi non lo conoscesse io ho una scacchiera 8x8 nella quale devo far muovere il mio cavallo facendo attenzione che esso si fermi su ognuna delle 64 caselle una ed una sola volta...

questo è quello che ho implementato fino ad ora:

#include <iostream>

#include <ctime>

using namespace std;

const int N = 12;

void stampa(int [][N]);

void istruzioni();

void mossa();

int main()
{
   int riga = 4, colonna = 3;
   
   int verticale[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
   int orizzontale[8] = {2, 1, -1, -2, -2, -1, 1, 2};
   
   char decisione;
   
   int Board[N][N] = {0};
   
   cout << "\t\t\t***L'enigma della mossa del cavallo***\n\n";
   cout << "vuoi leggere le istruzioni? S/N";
   
   cin >> decisione;
   
   if (decisione == 's' || decisione == 'S')
       istruzioni();
   else
   cout << "\n\t\t\tOk ora comincia il gioco...\n\n";
   
   mossa();
   
   

   system("pause");
   return 0;
}

void stampa(int a[][N])
{
     for(int i = 2; i < N - 2; i++)
     {
         for(int j = 2; j < N - 2; j++)
             cout << "|" << a[i][j] << "|";
             
       cout << endl;
     }
}

void istruzioni()
{
     cout << "devi cercare di far posizionare il cavallo su tutte le caselle una ed una sola\n"
     << "volta senza farlo fermare mai su una casella su cui e' gia' stato!\n"
     << "in totale il cavallo dovra' fare 64 fermate...\nvediamo se sei capace!!! :)\n\n";
     
}

void mossa()
{
     cout << "digita uno dei seguenti numeri\n\n";
    cout << "0) destra - su\n"
         << "1) su - destra\n"
         << "2) su - sinistra\n"
         << "3) sinistra - su\n"
         << "4) sinistra - giu'"
         << "5) giu' - sinistra\n"
         << "6) giu' - destra\n"
         << "7) destra - giu'\n\n";
}


il problema sta nel far capire al cavallo che non deve andare fuori dai bordi...io avevo pensato che creando una scacchiera di 12x12 invece che 8x8 e mettendo a 1 i bordi e la scacchiera interna (8x8) azzerata...potevo semplicemente dire al cavallo :

esegui la mossa
if(Board[riga][colonna] != 1 && Board[riga][colonna] == 0)


ma sono sicuro che ci sia un altro modo senza aggiungere questa cornice alla matrice...
La consulenza è aperta!!:rofl:
22/12/09 17:17
Matthew
Crei una scacchiera 8x8 e dai al cavallo delle coordinate d'inizio, per esempio (1,1). Ogni volta che lo muovi le coordinate cambiano a seconda della mossa che hai fatto, basta sommare le coordinate di partenza al numero di caselle di cui si muove in ogni direzione.
A questo punto basta inserire un controllo if che si assicura che le nuove coordinate non siano mai minori di 1 o maggiori di 8.
aaa
22/12/09 18:17
minori di uno e maggiori di 8 non va bene...perchè già alla riga 2 per esempio se vado a nord sforo...come anche a sud se sono alla riga N - 2 sforo ugualmente...stessa cosa per le colonne....
22/12/09 19:10
Matthew
Non capisco quello che stai dicendo.
Contiamo righe e colone da 1 a 8.
Sei alla riga 2. Ti muovi di -2 verticale. La nuova riga è 0. 0<1 quindi la mossa non è consentita, e non deve esserlo.
Qual'è il problema?
Ultima modifica effettuata da Matthew 22/12/09 19:10
aaa
22/12/09 19:16
l'array parte da zero e il posto zero quindi è consentito....semmai a -1 non è consentito..8 righe e 8 colonne da 0 a 7...
Ultima modifica effettuata da 22/12/09 19:17
22/12/09 21:26
Matthew
Ok, è la stessa cosa. Non devi andare prima di 0 e dopo 7.
Ultima modifica effettuata da Matthew 22/12/09 21:32
aaa
22/12/09 23:04
se a qualcuno interessasse ecco il codice del gioco funzionante:

#include <iostream>

#include <ctime>

using namespace std;

const int N = 8;

void stampa(int [][N]);

void istruzioni();

void mossa();

int gioco(int &, int &, int[][N], int[], int [], int, int &);

int main()
{
   int riga = 0, colonna = 0;  //variabili che salvano la posizione del cavallo
   
   int verticale[8] = {-1, -2, -2, -1, 1, 2, 2, 1};   //questi sono i due array in cui
   int orizzontale[8] = {2, 1, -1, -2, -2, -1, 1, 2}; //sono salvate le mosse del cavallo
   
   int Move, cont = 0;  //variabile che riceve di volta in volta il movimento
   
   char decisione;
   
   int Board[N][N] = {0};   //scacchiera 8x8
   
   cout << "\t\t\t***L'enigma della mossa del cavallo***\n\n";
   cout << "vuoi leggere le istruzioni? S/N";
   
   cin >> decisione;
   
   if (decisione == 's' || decisione == 'S')
       istruzioni();
   
   else
   cout << "\n\t\t\tOk ora comincia il gioco...\n\n";
   
   do   
   {        
      mossa(); 
      
      cin >> Move;
      
      gioco(riga, colonna, Board, verticale, orizzontale, Move, cont);
      
      stampa(Board);
      // si ferma solo quando saranno state effettuate 64 fermate univoche
   }while(cont < 64); 

   system("pause");
   return 0;
}

void stampa(int a[][N])
{
     for(int i = 0; i < N; i++)
     {
         for(int j = 0; j < N; j++)
             cout << "|" << a[i][j] << "|";
             
       cout << endl;
     }
}

void istruzioni()
{
     cout << "devi cercare di far posizionare il cavallo su tutte le caselle una ed una sola \n "
     << "volta senza farlo fermare mai su una casella su cui e' gia' stato! \n "
     << "in totale il cavallo dovra' fare 64 fermate...\nvediamo se sei capace!!! :) \n\n ";
     
}

void mossa()
{
    cout << "\ndigita uno dei seguenti numeri \n\n ";
    cout << "0) destra - su \n "
         << "1) su - destra \n "
         << "2) su - sinistra \n "
         << "3) sinistra - su \n "
         << "4) sinistra - giu' \n "
         << "5) giu' - sinistra \n "
         << "6) giu' - destra \n "
         << "7) destra - giu' \n\n ";
}

int gioco(int & riga, int & colonna, int Board[][N], int verticale[], int orizzontale[], int Move, int & cont)
{
    int riga1, colonna1; // conservano il valore in entrata di riga e colonna
    riga1 = riga;
    colonna1 = colonna;
    colonna += orizzontale[Move];
    riga += verticale[Move];
    // se lo spostamento è all'interno della scacchiera!
    if(riga >= 0 && riga < N && colonna >= 0 && colonna < N && Board[riga][colonna] == 0) 
       {
           cont++;
           Board[riga][colonna] = cont; 
       }
    else
      { 
         colonna = colonna1; //ritorna il valore precedente alle variabili
         riga = riga1;       //riga e colonna...
         cout << "\nNon puoi andare li'...\n";
         return 0;
      }
    return 0;
}


:k:
Ultima modifica effettuata da 23/12/09 8:39
23/12/09 0:58
Matthew
Postato originariamente da Riuzaki:
if(colonna != -1 && colonna != -2 && colonna != N && colonna != N + 1 && riga != -1 && riga != -2 && riga != N && riga != N + 1)


Il concetto è quello, ma puoi scriverlo in modo più pulito ed elegante:
if(colonna>=0 && colonna<N && riga>=0 && riga<N)
Ultima modifica effettuata da Matthew 23/12/09 0:58
aaa