PDA

Visualizza la versione completa : Calcolo spostamento minimo , gioco guardia e ladri in C


babilon90
08-02-2012, 14:14
La guardia compie ad ogni turno un passo in modo tale che conoscendo la posizione
del ladro può calcolare lo spostamento minimo per avvicinarsi a lui.

preciso che il ladro viene mosso dall'utente.



volevo sapere come faccio a calcolare lo spostamento minimo che deve fare la guardia per intercettare il ladro , conoscendo la posizione del ladro

Grazie anticipatamente

alka
08-02-2012, 15:04
Posta il codice che hai scritto fino ad ora per la risoluzione del problema e, in caso di errori o comportamenti anomali, spiega quali sono e saremo ben felici di aiutarti.

In caso contrario, il tuo quesito è troppo vago e generico, e non si capisce che tipo di aiuto ti occorra, né con quali strutture dati si sta lavorando, nulla di nulla.

babilon90
08-02-2012, 16:04
ti posto il testo


Si vuole sviluppare un programma per la simulazione del gioco della guardia e del 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 che 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.



a me servirebbe solo sapere la formula per determinare le coordinate della guardia in modo tale che ad ogni passo del ladro lui si avvicini sempre di più alla guardia.

alka
08-02-2012, 16:08
Originariamente inviato da babilon90
a me servirebbe solo sapere la formula per determinare le coordinate della guardia in modo tale che ad ogni passo del ladro lui si avvicini sempre di più alla guardia.
E' il 95% dell'esercizio. :fagiano:

Non c'è una "formula": occorre codificare un algoritmo.
Prova a scriverlo, o ad abbozzare una tua proposta di soluzione.

babilon90
08-02-2012, 16:11
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


void printScacchiera(char scacchiera[][16] , int n, int m);//prototipo function che stampa a video la scacchiera




void genera_posi_casuale(char scacchiera[][16], int x, int y,int nx,int ny);// prototipo funzione genera posizione ladro e guardia casualmente





void comando(char scacchiera[][16],int x,int y ,int nx, int ny);//prototipo funzione che manovra ladro


void main()
{
int nx,ny,x,y;

char scacchiera[16][16]= {
{ 'm','m','m','m','m','m','m','m','m','m','m','m','m ','m','m','m'},
{ 'm',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ','m',' ',' ',' ','m','m','m','m','m','m','m','m','m'},
{ 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ','m',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ','m',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ','m',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ',' ',' ',' ',' ','m',' ',' ',' ','m','m','m',' ','m'},
{ '.',' ',' ',' ',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
{ '.',' ',' ',' ',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
{ '.',' ',' ',' ',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm',' ',' ',' ',' ',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','m'},
{ 'm','m','m','m','m','m','m','m','m','m','m','m','m ','m','m','m'}};







srand(time(NULL)); /*permette la lettura dell'orologio interno del sistema ,
ottenendo automaticamente un valore sempre diverso per il seme*/






genera_posi_casuale(scacchiera, x, y,nx,ny); // chiamata procedura








}



//procedura che permette movimento ladro da parte dell'utente


void comando(char scacchiera[][16],int x ,int y ,int nx, int ny){

int n ,m ;

char com;




// muove il ladro finche non esce da labirinto o non viene preso dalla guardia


while(scacchiera[x][y] != scacchiera[13][0] && scacchiera[x][y] != scacchiera[12][0] && scacchiera[x][y] != scacchiera[11][0]){

printf("\n digitare un comando w = avanti - a = sinsitra - d = destra - z = indietro \n ");
scanf("%c",&com);
printf("\n");


switch(com){

case 'w': //va avanti

x--;

if(scacchiera[x][y] != 'm'){




scacchiera[x+1][y] = ' ';//cancella posizione precedente

scacchiera[x][y] = 'L';


printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);


printScacchiera(scacchiera,n,m);//chiamata void function - stampa la scacchiera
printf("\n");


}

//se incontri muro rimani in quella posizione
else{

x++;

printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);
printScacchiera(scacchiera,n,m);//chiamata void function - stampa la scacchiera

}
break;



case 'a'://va a sinistra

y--;
if(scacchiera[x][y] != 'm'){

scacchiera[x][y+1] = ' ';//cancella posizione precedente

scacchiera[x][y] = 'L';



printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);
printScacchiera(scacchiera,n,m);//chiamata void function - stampa la scacchiera
printf("\n");



}

//se incontri muro rimani in quella posizione
else{

y++;

printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);
printScacchiera(scacchiera,n,m);//chiamata void function - stampa la scacchiera


}

break;




case 'd'://va a destra

y++;
if(scacchiera[x][y] != 'm'){



scacchiera[x][y-1] = ' ';//cancella posizione precedente

scacchiera[x][y] = 'L';

printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);
printScacchiera(scacchiera,n,m);//chiamata void function - stampa la scacchiera
printf("\n");


}

//se incontri muro rimani in quella posizione

else{

y--;

printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);
printScacchiera(scacchiera,n,m);//chiamata void function - stampa la scacchiera

}

break;






case 'z'://va indietro

x++;
if(scacchiera[x][y] != 'm'){


scacchiera[x-1][y] = ' '; //cancella posizione precedente

scacchiera[x][y] = 'L';


printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);
printScacchiera(scacchiera,n,m);//chiamata void function - stampa la scacchiera
printf("\n");


}

//se incontri muro rimani in quella posizione

else{

x--;
printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);
printScacchiera(scacchiera,n,m);//chiamata void function - stampa la scacchiera

}

break;


}//chiude switch case




}//chiude while







printf("HAI VINTO .... SEI RIUSCITO A SCAPPARE \n \n");



}






















//procedura che genera posizione ladro e guardia casualmente

void genera_posi_casuale(char scacchiera[][16], int x, int y,int nx ,int ny)
{
int i,n,m;



for (i=0;i<1;i++)//ciclo che viene eseguito una sola volta tanto quanto la posizione da generare.
{

/* genera a caso una posizione
per il ladro */

do
{
x = 1+rand()%15;
y = 1+rand()%15;
}
while(scacchiera[x][y]=='m');

scacchiera[x][y] = 'L';

printf("\n LE COORDINATE DEL LADRO SONO %d : %d \n",x,y);
printf("\n\n");
}







for (i=0;i<1;i++)//ciclo che viene eseguito una sola volta tanto quanto la posizione da generare.
{

/* genera a caso una posizione
per la guardia */

do
{
nx = 1+rand()%15;
ny = 1+rand()%15;
}
while(scacchiera[nx][ny]=='m');

scacchiera[nx][ny] = 'G';

printf("\n LE COORDINATE DELLA GUARDIA SONO %d : %d \n",nx,ny);
printf("\n\n");
}





printScacchiera(scacchiera,n,m);


comando( scacchiera, x, y,nx,ny);




}











//procedura stampa scacchiera
void printScacchiera(char scacchiera[][16] , int n, int m)
{
int i,j;
n=16;
m=16;

//ciclo for che mi permette di scorrere le righe
for (i=0;i<n;i++){
{
for (j=0;j<m;j++)//ciclo for che mi permette di scorrere le colonne
printf(" %c",scacchiera[i][j]);
printf("\n");
}
}

}

babilon90
08-02-2012, 16:15
il programma funziona solo che non so come far muovere la guardia in base a quei criteri

jonnyforever
08-02-2012, 16:59
puoi aiutarmi per favore?? :) http://forum.html.it/forum/showthread.php?s=&threadid=1495861

alka
08-02-2012, 18:53
Originariamente inviato da jonnyforever
puoi aiutarmi per favore?? :)

Non si fanno interventi in altre discussioni, aperte da altre utenti, per chiedere aiuto nella propria: non è corretto né rispettoso nei confronti dell'utente, quindi ti invito ad astenerti in futuro.

jonnyforever
08-02-2012, 19:02
hai ragione scusa. però al mio topic nessuno risponde! :(

Loading