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++ - Simulazione del gioco guardia e ladri in un labirinto?
Forum - C/C++ - Simulazione del gioco guardia e ladri in un labirinto?

Avatar
ernero (Normal User)
Newbie


Messaggi: 2
Iscritto: 24/02/2011

Segnala al moderatore
Postato alle 13:04
Giovedì, 24/02/2011
salve, ho molti problemi nella risoluzione di questo esercizio.

Si vuole sviluppare un programma per la simulazione del gioco della guardia e ladro
in un labirinto.
La stanza è pavimentata a tasselli quadrati (caselle) ed è dotata di pareti esterne e
interne come in figura. Si sceglie casualmente la posizione della guardia (blue) e del
ladro (rosso). Entrambi si muovono di una casella alla volta, scelta tra una delle
quattro caselle vicine. Il ladro deve uscire dal labirinto e viene guidato dall’utente.
La guardia cerca di intercettare il ladro in modo tale che conoscendo la sua posizione
può calcolare lo spostamento minimo per avvicinarsi a lui. Se la traiettoria è ostruita
da un muro viene presa una direzione casuale.
La simulazione termina quando il ladro “esce dalla porta” o quando la guardia cattura
il ladro. L’algoritmo deve visualizzare il percorso del ladro e della guardia dopo ogni
passo, mostrando la stanza e la posizione dei due.
qui si vede l' immagine http://www.ernero.altervista.org/stanza.…
L’algoritmo usa la function rand() in stdlib per generare numeri casuali: si
ricorda che, per esempio, se numero_casuale è un int, la chiamata
numero_casuale=rand()%11; genera un numero casuale intero (distribuzione
uniforme) nell’insieme (0,1,2,3,4,5,6,7,8,9,10). Usare sempre la srand() per
rendere automatica la scelta iniziale del seed della sequenza di numeri casuali.
Effettuare almeno 5 test, variando la posizione iniziale del robot. Effettuare anche 3
test cambiando ogni volta la disposizione delle pareti nella stanza e cercando di
trovare disposizioni critiche delle pareti.

ho creato la stanza e anche la posizione casuale solo che va anche sulle pareti e poi non so come continuare.

questo è quello che ho fatto fino ad ora:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. void guardia(char scacchiera[][16], int nx, int ny);
  6. void ladro(char scacchiera[][16], int nx, int ny);
  7. float ladronord( char scacchiera[][16], int nx, int ny);
  8. void printScacchiera(char scacchiera[][16]);
  9. /*void ladrosud(char scaccheira[][16], int nx, int ny);
  10. void ladroest(char scaccheira[][16], int nx, int ny);
  11. void ladroovest(char scacchiera[][16], int nx, int ny);  
  12. */
  13. int main()
  14. {
  15.      int i,j,nx,ny;
  16.      char scacchiera[16][16]= {
  17.           { 'm','m','m','m','m','m','m','m','m','m','m','m','m','m','m','m'},
  18.           { 'm',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
  19.           { 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
  20.           { 'm',' ',' ','m',' ',' ',' ','m','m','m','m','m','m','m','m','m'},  
  21.           { 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
  22.           { 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
  23.           { 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
  24.           { 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
  25.           { 'm',' ',' ','m',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
  26.           { 'm',' ',' ','m',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
  27.           { 'm',' ',' ',' ',' ',' ',' ','m',' ',' ',' ','m','m','m',' ','m'},
  28.           { '.',' ',' ',' ',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
  29.           { '.',' ',' ',' ',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
  30.           { '.',' ',' ',' ',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
  31.           { 'm',' ',' ',' ',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
  32.           { 'm','m','m','m','m','m','m','m','m','m','m','m','m','m','m','m'}};
  33.      //scelta automatica del seed
  34.      srand(time(NULL));
  35.      //generazione della posizione del LADRO
  36.      ladro(scacchiera, nx, ny);
  37.       //generazione della posizione della GUARDIA
  38.      guardia(scacchiera, nx, ny);
  39.      //stampa la scacchiera
  40.      printScacchiera(scacchiera);
  41.      
  42.      ladronord(scacchiera,nx,ny);
  43.      
  44.       system("PAUSE");
  45.       return 0;
  46. }
  47.  
  48. void ladro(char scacchiera[][16], int nx, int ny)
  49. {
  50.      int i;
  51.      for (i=0;i<1;i++)//ciclo che viene eseguita una sola volta quanto quanto è la posizione da generare.
  52.      {
  53.      
  54.       /* genera a caso una posizione nella scacchiera 17x17 */
  55.            do
  56.            {
  57.            nx = rand()%16;
  58.            ny = rand()%16;
  59.            }
  60.            while(scacchiera[nx][ny]=='m');
  61.            scacchiera[nx][ny] = 'L';      
  62.       printf("le cordinate del ladro sono %d : %d \n",nx,ny);
  63.       printf("\n\n");
  64.        
  65.       }
  66. }
  67.  
  68. void guardia(char scacchiera[][16], int nx, int ny)
  69. {
  70.      int i;
  71.       for (i=0;i<1;i++)//ciclo che viene eseguita una sola volta quanto quanto è la posizione da generare.
  72.      {
  73.      
  74.       /* genera a caso una posizione nella scacchiera 17x17 */
  75.            do
  76.            {
  77.            nx = rand()%16;
  78.            ny = rand()%16;
  79.            }
  80.            while(scacchiera[nx][ny]=='m');
  81.            scacchiera[nx][ny] = 'G';      
  82.       printf("le cordinate della guardia sono %d : %d \n",nx,ny);
  83.       printf("\n\n");
  84.        
  85.       }
  86. }
  87.  
  88. void printScacchiera(char scacchiera[][16])
  89. {
  90.      int i,j;
  91.          for (i=0;i<16;i++)//visualizzazione della scacchiera
  92.       {
  93.            for (j=0;j<16;j++)
  94.            printf(" %c",scacchiera[i][j]);
  95.            printf("\n");                  //visualizzazione per riga
  96.       }
  97. }
  98.  
  99.  
  100. float ladronord( char scacchiera[][16], int nx, int ny)
  101. {
  102.      char p;
  103.      printf("per spostare il ladro occorre premere:\n W = SU \n S = GIU' \n A = SINISTRA \n D = DESTRA\n");
  104.      scanf("%c",&p);
  105.      switch (p)
  106.      {
  107.       case 1:
  108.            if(p == 'w')
  109.            nx-1;
  110.            break;
  111.       case 2:
  112.            if(p == 's')
  113.            nx+1;
  114.            break;
  115.       case 3:
  116.            if(p == 'a')
  117.            ny-1;
  118.            break;
  119.       case 4:
  120.            if(p == 'd')
  121.            ny+1;
  122.            break;
  123.       }
  124.      
  125.    
  126. }

      
    


ernero ha allegato un file: stanza.png (4671 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da ernero il 28/02/2011 alle 17:52
PM
Avatar
andrea993 (Member)
Rookie


Messaggi: 21
Iscritto: 19/01/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 15:54
Domenica, 27/02/2011
Non ho letto il codice perchè è pieno di errori e non ha molto senso

innanzitutto cosa significa
Codice sorgente - presumibilmente Plain Text

  1. if(scacchiera[j] == 0) || (scacchiera[j] == 0))???



A parte che tu non introduci neanche la variabile j ma suppongo  faccia parte di un for esterno.

Oltre a questo come fai a dire
Codice sorgente - presumibilmente Plain Text

  1. if(scacchiera[j] == 0) || (scacchiera[j] == 0))

cioè è la stessa cosa perchè gli chiedi la condizione 2 volte????

forse intendevi
Codice sorgente - presumibilmente Plain Text

  1. if(scacchiera[j] == 0) || (scacchiera[i] == 0))

  o cosa so....

Poi scacchiera è una MATRICE, NON un vettore!!!!
Non puoi dire scacchiera[j]!!!
Codice sorgente - presumibilmente Plain Text

  1. Puoi ad esempio scrivere scacchiera[j][i]



Per quanto riguarda la generazione della posizione iniziale devi generalre la posizione finchè non viene generata in una cella appropriata (dove non c'è il muro)

quindi fai
Codice sorgente - presumibilmente C/C++

  1. do
  2. {
  3. nx = rand()%16;
  4. ny = rand()%16;
  5. }
  6. while (scacchiera[nx][ny]==',');



Ti consiglio caldamente di studiarti eglio il C perchè il programma che hai intenzione di fare non è banalissimo e non credo sia fattibile per uno che fa degli errori come i tuoi.
Non lo dico per cattiveria, ci siamo passati tutti.
Studiati bene l'IF, i vettori e le matrici, poi riprova e vedrai che avrai le idee molto più chiare ;)

Ultima modifica effettuata da andrea993 il 27/02/2011 alle 15:59
ti ringrazio della tua risposta in effetti io sono agli inizi con il c e nn ho ancora molta pratica. Cmq sono andato un pò avanti e mi sn bloccato sul fatto che non so come fare per poter far muovere il ladro, questo è quello che ho fatto sperando nn ci siano errori gravi: - ernero - 28/02/11 17:27
#include <stdio.h> #include <stdlib.h> #include <time.h> void guardia(char scacchiera[][16], int nx, int ny); void ladro(char scacchiera[][16], int nx, int ny); float ladronord( char scacchiera[][16], int nx, int ny); void printScacchiera(char scacchiera[][16]); /*void ladrosud(char scacche - ernero - 28/02/11 17:28
ho cambiato il post iniziale dato che non riesco a capire come fare per risponderti - ernero - 28/02/11 17:46
#include <stdio.h> #include <stdlib.h> #include <time.h> void guardia(char scacchiera[][16], int nx, int ny); void ladro(char scacchiera[][16], int nx, int ny); float ladronord( char scacchiera[][16], int nx, int ny); void printScacchiera(char scacchiera[][16]); /*void ladrosud(char scacche - ernero - 05/07/11 11:37
PM