Oppure

Loading
15/02/15 20:29
tonyleone
Salve , ho un problema per quanto riguarda il progetto che mi è stato assegnato per l'esame di programmazione 1, vi riporto in breve il testo dell' esercizio : si considera una scacchiera n x m . La posizione iniziale degli animali è casuale e il loro movimento può avvenire orizzontalmente o verticalmente di un singolo passo . I cani si muovono prima dei gatti e ogni cane va nella direzione del gatto più vicino . i gatti si muovono in modo casuale in una delle 4 direzioni . il gioco finisce quando i cani raggiungono i gatti o quando si arriva ad un numero prefissato di passi .
infine mi chiede di visualizzare le percentuali effettuate dai quattro animali per ogni direzione .
Per quanto riguarda la matrice e l'inserimento casuale degli animali sono riuscito a fare da solo , ora sono completamente bloccato sulla mossa del cane che deve spostarsi verso il gatto più vicino , sono veramente disperato , purtroppo non ho potuto seguire il corso per dei problemi personali , spero che qualcuno di voi mi possa aiutare , ve ne sarei veramente grato .
aaa
15/02/15 21:33
TheDarkJuster
Ad ogni cane passi tutti i gatti e colcoli qual'è il gatto più vicino (io proverei a vedere le coordinate della scacchiera come vertici di un triangolo e calcolando l'ipotenusa si gaurda qual'è l'ipotenusa più corta)
aaa
15/02/15 22:38
tonyleone
questo è il punto in cui sono arrivato io :
 /*******************************Inizio Programma********************************/

/*
Librerie incluse per l'utilizzo di vare function all'interno del programma.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>


/*
Prototipi delle funzioni.
*/
void StampaScacchiera(char [][8]);
void gattoSu(char [][8],char [], int, int);
void gattoGiu(char [][8],char [], int, int);
void gattoDx(char [][8],char [], int, int);
void gattoSx(char [][8],char [], int, int);



int main()
{
    /*
    Dichiarazione delle variabili.
    */
    int i; /* Contatore per i cicli while.*/
    int posRiga, posCol; /* Variabili utilizzate per riempire la scacchiera in modo pseudo-random*/
    srand(time(NULL)); /* Funzione che inizializza lo pseudo-random. Se non ci fosse, ad ogni avvio del programma
                          la posizione dei pedoni e della regina, sarebbe sempre la stessa.*/
    char colonne[8] = {'a','b','c','d','e','f','g','h'}; /*Dichiarazione e inizializzazione della stringa utilizzata
                                                         per definire le colonne della scacchiera.*/
    char scacchiera[][8] =                    
    {{'b','n','b','n','b','n','b','n'},
    {'n','b','n','b','n','b','n','b'},
    {'b','n','b','n','b','n','b','n'},
    {'n','b','n','b','n','b','n','b'},
    {'b','n','b','n','b','n','b','n'},
    {'n','b','n','b','n','b','n','b'},
    {'b','n','b','n','b','n','b','n'},
    {'n','b','n','b','n','b','n','b'}}; /* Dichiarazione e inizializzazione della scacchiera.*/
    char s;
    i = 0; /* Inizializzazione del contatore.*/

    while(i<2)
    {
        posRiga = rand()%8;
        posCol = rand()%8;

        if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
        {
            scacchiera[posRiga][posCol] = 'G';
            i++;
        }
    } /* Ciclo while: ripete il clclo finchè la condizione resta soddisfatta.
         Posiziona in modo casuale i pedoni nella scacchiera, facendo in modo da non sovrascrivere
         eventuali altri pedoni. Alla fine, il contatore viene autoincrementato.*/
    
    i = 0; /* Il contatore viene nuovamente azzerato in modo da poterlo riutilizzare.*/


    while(i<1)
    {
        posRiga = rand()%8;
        posCol = rand()%8;

        if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
        {
            scacchiera[posRiga][posCol] = 'C';
            i++;
        }
    } /* Altro ciclo while: Posiziona in modo casuale il primo cane*/

    printf("Cane in %c%d puo' catturare i seguenti gatti: \n\n",colonne[posCol],8-posRiga); /* Stampiamo la posizione della
                                                                                                  regina.*/
    gattoSu(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneSu.*/
    gattoGiu(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneGiu.*/
    gattoDx(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneDx.*/
    gattoSx(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneSx.*/
 i = 0; /* Il contatore viene nuovamente azzerato in modo da poterlo riutilizzare.*/


    while(i<1)
    {
        posRiga = rand()%8;
        posCol = rand()%8;

        if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
        {
            scacchiera[posRiga][posCol] = 'C';
            i++;
        }
    } /* Altro ciclo while: Posiziona in modo casuale il secondo cane.*/

    printf("Cane in %c%d puo' catturare i seguenti gatti: \n\n",colonne[posCol],8-posRiga); /* Stampiamo la posizione del cane.*/
    gattoSu(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione gattoSu.*/
    gattoGiu(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione gattoGiu.*/
    gattoDx(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione gattoDx.*/
    gattoSx(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione gattoeSx.*/

    StampaScacchiera(scacchiera);/* Richiamo della funzione StampaScacchiera*/
   
    system("pause"); /* Dato che sto utilizzando un ambiente di sviluppo Dev, mi è
                        opportuno inserire questo comando in quanto, senza di esso, la finestra di MS-DOS
                        che si apre all'avvio del programma, si chiuderebbe.*/
}

/*Inizio funzione*/
void StampaScacchiera(char scacchiera[][8]) /* Funzione StampaScacchiera, a cui passiamo la matrice "scacchiera" di tipo char.*/
{
    int i,j; /* Dichiarazione di due variabili interne alla funzione, quindi locali ad essa.*/

    printf("\n"); /*"Stampa" un rigo vuoto*/
    printf("   a b c d e f g h\n\n"); /*Stampa ciò che viene scritto tra le parentesi, e va a capo due volte.*/
    for(i=0;i<8;i++) /*Ciclo for: inizializza la variabile i, la incrementa ad ogni ciclo fatto, e si ferma quando
                             l'indice raggiunge il valore "8".*/
    {
        printf("%d ",8-i);
        for(j=0;j<8;j++) /*Ciclo for innestato.*/
        {
            printf(" %c", scacchiera[i][j]);
            
        }
        printf("\n");
    }
} /*La funzione, stampa la scacchiera completa.*/
/*Fine funzione.*/

void gattoSu(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posRiga;
   int gattoTrovato = 0;
   
   while(i >= 0 && gattoTrovato == 0){
      
      if(scacchiera[i][posCol] == 'G'){
         printf("Gatto in %c%d\n", colonne[posCol], 8 - i);
         gattoTrovato = 1;
      }
      else
         i--;
   }
}

void gattoGiu(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posRiga;
   int gattoTrovato = 0;
   
   while(i < 8 && gattoTrovato == 0){
      
      if(scacchiera[i][posCol] == 'G'){
         printf("Gatto in %c%d\n", colonne[posCol], 8 - i);
         gattoTrovato = 1;
      }
      else
         i++;
   }
}

void gattoDx(char scacchiera[][8], char colonne[], int posRiga, int posCol){

   int i = posCol;
   int gattoTrovato = 0;
   
   while(i < 8 && gattoTrovato == 0){
      
      if(scacchiera[posRiga][i] == 'G'){
         printf("Gatto in %c%d\n\n", colonne[i], 8 - posRiga);
         gattoTrovato = 1;
      }
      else
         i++;
   }
}

void gattoSx(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posCol;
   int gattoTrovato = 0;
   
   while(i >= 0 && gattoTrovato == 0){
      
      if(scacchiera[posRiga][i] == 'G'){
         printf("Gatto in %c%d\n\n", colonne[i], 8 - posRiga);
         gattoTrovato = 1;
      }
      else
         i--;
   }
} 
Ultima modifica effettuata da tonyleone 15/02/15 22:47
aaa
15/02/15 22:41
tonyleone
Questo algoritmo riesce a dirmi quale gatto è possibile catturare e da quale cane,solo che ora mi manca proprio il procedimento tramite il quale il cane si avvicini al gatto più vicino e in contemporanea il gatto dovrebbe allontanarsi tutto ciò contando i passi che ogni cane effettua , per i passi potrei risolvere con un contatore il problema lo riscontro proprio nel muovere fisicamente il cane
aaa
16/02/15 14:07
tonyleone
Ragazzi nessuno può aiutarmi ? non ho moltissimo tempo , grazie ancora
aaa
16/02/15 14:48
TheDarkJuster
Guarda che ti ho già detto cosa dovresti fare, se hai riscontrato dei problemi parla e facci sapere igniorare una presunta soluzione non è una cosa astuta....
aaa
16/02/15 14:55
tonyleone
Non ho ignorato la tua soluzione , ci mancherebbe.. ma non l'ho capita ...
aaa
16/02/15 15:08
TheDarkJuster
E quindi hai pensato che non dicendo niente si sarebbe chiarita da sola. Ok Allora, Da quello che vedo hai una scacchiera che è una matrice in cui ci c'è un carattere a cella. Tu quindi farai un ciclo che otterrà la posizione di un cane per volta, e per ogni cane farai un ciclo che controlli la posizione di ogni gatto. La posizione sono i due indici della matrice. A questo punto pensa alla matrice come un grafico con l'asse delle ascisse e delle ordinate e grazie a questo ragionamento pensa che il primo indice sia la coordinata delle ordinate e la seconda delle ascisse. A questo punto hai due punti: un punto che è la coordinata di UN cane (quello che stai controllando al momento) e un punto che è la cordinata di UN gatto (da notare che per ogni cane dovrai controllare N gatti, con N che è il numero dei gatti). Ora basta calcolare la distanza fra i due punti: youmath.it/formulari/formulari-di-geometria-analitica/…
aaa