Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - La mossa del cavallo
Forum - C/C++ - La mossa del cavallo

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
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:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. #include <ctime>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 12;
  8.  
  9. void stampa(int [][N]);
  10.  
  11. void istruzioni();
  12.  
  13. void mossa();
  14.  
  15. int main()
  16. {
  17.    int riga = 4, colonna = 3;
  18.    
  19.    int verticale[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
  20.    int orizzontale[8] = {2, 1, -1, -2, -2, -1, 1, 2};
  21.    
  22.    char decisione;
  23.    
  24.    int Board[N][N] = {0};
  25.    
  26.    cout << "\t\t\t***L'enigma della mossa del cavallo***\n\n";
  27.    cout << "vuoi leggere le istruzioni? S/N";
  28.    
  29.    cin >> decisione;
  30.    
  31.    if (decisione == 's' || decisione == 'S')
  32.        istruzioni();
  33.    else
  34.    cout << "\n\t\t\tOk ora comincia il gioco...\n\n";
  35.    
  36.    mossa();
  37.    
  38.    
  39.  
  40.    system("pause");
  41.    return 0;
  42. }
  43.  
  44. void stampa(int a[][N])
  45. {
  46.      for(int i = 2; i < N - 2; i++)
  47.      {
  48.          for(int j = 2; j < N - 2; j++)
  49.              cout << "|" << a[i][j] << "|";
  50.              
  51.        cout << endl;
  52.      }
  53. }
  54.  
  55. void istruzioni()
  56. {
  57.      cout << "devi cercare di far posizionare il cavallo su tutte le caselle una ed una sola\n"
  58.      << "volta senza farlo fermare mai su una casella su cui e' gia' stato!\n"
  59.      << "in totale il cavallo dovra' fare 64 fermate...\nvediamo se sei capace!!! :)\n\n";
  60.      
  61. }
  62.  
  63. void mossa()
  64. {
  65.      cout << "digita uno dei seguenti numeri\n\n";
  66.     cout << "0) destra - su\n"
  67.          << "1) su - destra\n"
  68.          << "2) su - sinistra\n"
  69.          << "3) sinistra - su\n"
  70.          << "4) sinistra - giu'"
  71.          << "5) giu' - sinistra\n"
  72.          << "6) giu' - destra\n"
  73.          << "7) destra - giu'\n\n";
  74. }



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 :

Codice sorgente - presumibilmente Plain Text

  1. esegui la mossa
  2. 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:

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 18:17
Martedì, 22/12/2009
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.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 19:17
Martedì, 22/12/2009
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....

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 20:10
Martedì, 22/12/2009
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 il 22/12/2009 alle 20:10
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:16
Martedì, 22/12/2009
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 il 22/12/2009 alle 20:17
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 22:26
Martedì, 22/12/2009
Ok, è la stessa cosa. Non devi andare prima di 0 e dopo 7.

Ultima modifica effettuata da Matthew il 22/12/2009 alle 22:32
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 0:04
Mercoledì, 23/12/2009
se a qualcuno interessasse ecco il codice del gioco funzionante:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. #include <ctime>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 8;
  8.  
  9. void stampa(int [][N]);
  10.  
  11. void istruzioni();
  12.  
  13. void mossa();
  14.  
  15. int gioco(int &, int &, int[][N], int[], int [], int, int &);
  16.  
  17. int main()
  18. {
  19.    int riga = 0, colonna = 0;  //variabili che salvano la posizione del cavallo
  20.    
  21.    int verticale[8] = {-1, -2, -2, -1, 1, 2, 2, 1};   //questi sono i due array in cui
  22.    int orizzontale[8] = {2, 1, -1, -2, -2, -1, 1, 2}; //sono salvate le mosse del cavallo
  23.    
  24.    int Move, cont = 0;  //variabile che riceve di volta in volta il movimento
  25.    
  26.    char decisione;
  27.    
  28.    int Board[N][N] = {0};   //scacchiera 8x8
  29.    
  30.    cout << "\t\t\t***L'enigma della mossa del cavallo***\n\n";
  31.    cout << "vuoi leggere le istruzioni? S/N";
  32.    
  33.    cin >> decisione;
  34.    
  35.    if (decisione == 's' || decisione == 'S')
  36.        istruzioni();
  37.    
  38.    else
  39.    cout << "\n\t\t\tOk ora comincia il gioco...\n\n";
  40.    
  41.    do  
  42.    {        
  43.       mossa();
  44.      
  45.       cin >> Move;
  46.      
  47.       gioco(riga, colonna, Board, verticale, orizzontale, Move, cont);
  48.      
  49.       stampa(Board);
  50.       // si ferma solo quando saranno state effettuate 64 fermate univoche
  51.    }while(cont < 64);
  52.  
  53.    system("pause");
  54.    return 0;
  55. }
  56.  
  57. void stampa(int a[][N])
  58. {
  59.      for(int i = 0; i < N; i++)
  60.      {
  61.          for(int j = 0; j < N; j++)
  62.              cout << "|" << a[i][j] << "|";
  63.              
  64.        cout << endl;
  65.      }
  66. }
  67.  
  68. void istruzioni()
  69. {
  70.      cout << "devi cercare di far posizionare il cavallo su tutte le caselle una ed una sola \n "
  71.      << "volta senza farlo fermare mai su una casella su cui e' gia' stato! \n "
  72.      << "in totale il cavallo dovra' fare 64 fermate...\nvediamo se sei capace!!! :) \n\n ";
  73.      
  74. }
  75.  
  76. void mossa()
  77. {
  78.     cout << "\ndigita uno dei seguenti numeri \n\n ";
  79.     cout << "0) destra - su \n "
  80.          << "1) su - destra \n "
  81.          << "2) su - sinistra \n "
  82.          << "3) sinistra - su \n "
  83.          << "4) sinistra - giu' \n "
  84.          << "5) giu' - sinistra \n "
  85.          << "6) giu' - destra \n "
  86.          << "7) destra - giu' \n\n ";
  87. }
  88.  
  89. int gioco(int & riga, int & colonna, int Board[][N], int verticale[], int orizzontale[], int Move, int & cont)
  90. {
  91.     int riga1, colonna1; // conservano il valore in entrata di riga e colonna
  92.     riga1 = riga;
  93.     colonna1 = colonna;
  94.     colonna += orizzontale[Move];
  95.     riga += verticale[Move];
  96.     // se lo spostamento è all'interno della scacchiera!
  97.     if(riga >= 0 && riga < N && colonna >= 0 && colonna < N && Board[riga][colonna] == 0)
  98.        {
  99.            cont++;
  100.            Board[riga][colonna] = cont;
  101.        }
  102.     else
  103.       {
  104.          colonna = colonna1; //ritorna il valore precedente alle variabili
  105.          riga = riga1;       //riga e colonna...
  106.          cout << "\nNon puoi andare li'...\n";
  107.          return 0;
  108.       }
  109.     return 0;
  110. }



:k:

Ultima modifica effettuata da il 23/12/2009 alle 9:39
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 1:58
Mercoledì, 23/12/2009
Testo quotato

Postato originariamente da Riuzaki:  
Codice sorgente - presumibilmente Plain Text

  1. 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:
Codice sorgente - presumibilmente Plain Text

  1. if(colonna>=0 && colonna<N && riga>=0 && riga<N)


Ultima modifica effettuata da Matthew il 23/12/2009 alle 1:58
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 9:22
Mercoledì, 23/12/2009
hai ragione sono un cretino:rofl:
guardo sempre le cose dal lato più difficile...non trovo mai la solizione più semplice...

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo