Advertisement
lucasiano97

Cani e Gatti V.2

Jan 4th, 2020
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 50.81 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h> //time.h lo utilizzo per generare un seme di numeri casuali sempre diverso per ogni esecuzione del programma
  4. #include <math.h> //utilizzata per le funzioni potenza e radice quadrata
  5. #include <windows.h>//la utilizzo per rallentare l'esecuzione del gioco
  6.  
  7. /*In questo primo progetto viene implementato il gioco dei cani e dei gatti
  8. Due cani e due gatti si muovono sopra una scacchiera di dimensioni inserite dall'utente
  9. Il gioco prevede una posizione casuale dei cani e dei gatti quando viene inizializzata la scacchiera.
  10. Sia cani che gatti possono muoversi orizzontalmente o verticalmente di un singolo passo.
  11. I cani si muovono per primi nella direzione del gatto più vicino a loro, mentre i gatti si muovono casualmente
  12. in una delle direzioni possibili.
  13. Il gioco termina quando i cani raggiungono i gatti, oppure quando termina un numero finito di passi, decisi a priori
  14. dall'utente che esegue il programma*/
  15.  
  16. typedef enum{destra,sinistra,su,giu} Direzione; //con una enumerazione affido alle direzioni possibili un numero univoco
  17.  
  18. void dimscacchiera(int *righe, int *colonne); //procedura che chiede all'utente la dimensione di righe e colonne della scacchiera
  19. void passidaeffettuare(int *passi); //procedura che chiede all'utente il numero di passi massimo da effettuare
  20. void inizializzazionescacchiera(char scacchiera[][100], int righe, int colonne); //procedura che crea e inizializza la scacchiera
  21. void cani_gatti(char scacchiera[][100],int righe, int colonne, int* rigagatto1, int *colonnagatto1,
  22.                 int* rigagatto2, int *colonnagatto2, int* rigacane1, int* colonnacane1,
  23.                 int* rigacane2, int* colonnacane2);
  24.                 //procedura che inserisce i cani ed i gatti nella scacchiera e ne salva le posizioni
  25. void visualizzascacchiera(char scacchiera[][100], int righe, int colonne);//procedura che consente di visualizzare la scacchiera
  26. void movimentogatto(char scacchiera[][100], int righe, int colonne, int *rigagatto, int *colonnagatto,
  27.                     double *sopra, double *sotto, double *dx, double *sx);
  28. //procedura che consente al gatto un movimento di un passo verso una delle direzioni possibili, laddove non sia occupata
  29. void movimentocane1(char scacchiera[][100],int *rigagatto, int *colonnagatto,
  30.                    int *rigacane, int *colonnacane, int* numgatti, double *su, double *giu, double *destra, double *sinistra);
  31. //procedura che consente al cane1 il movimento di un passo verso il gatto più vicino
  32. void movimentocane2(char scacchiera[][100],int *rigagatto, int *colonnagatto,
  33.                    int *rigacane, int *colonnacane, int* numgatti, double *su, double *giu, double *destra, double *sinistra);
  34. //procedura che consente al cane2 il movimento di un passo verso il gatto più vicino
  35. double distanza(int rigacane, int colonnacane, int rigagatto, int colonnagatto);/*procedura che ritorna un valore con
  36. la virgola utilizzata per calcolare la distanza tra un cane ed un gatto*/
  37.  
  38. int main()
  39. {   char scacchiera[100][100]; //dichiarazione della scacchiera di char di dimensioni MASSIME 100x100
  40.     int righe, colonne, passi, numgatti = 2;
  41.     /*dichiarazione delle variabili intere righe, colonne, passi, che inserirà l'utente da tastiera.
  42.     Le prime due generano la scacchiera, passi invece decreta la fine dell'esecuzione laddove i gatti non sono
  43.     stati presi
  44.     Utilizzo una variabile per tenere conto di quanti gatti restano, inizialmente settata a 2 perchè ci sono sempre
  45.     2 e 2 soli gatti alla generazione della scacchiera*/
  46.     int rigagatto1, colonnagatto1, rigagatto2, colonnagatto2; /*4 variabili intere che utilizzerò per non perdere
  47.     gli indici dei due gatti su righe e colonne*/
  48.     int rigacane1, colonnacane1, rigacane2, colonnacane2;/*4 variabili intere che utilizzerò per non perdere
  49.     gli indici dei due cani su righe e colonne*/
  50.     double distanza1, distanza2; /*due variabili di tipo double che utilizzerò per controllare quale distanza
  51.     è minore da un cane ad uno dei due gatti*/
  52.     double cane1su = 0,cane1giu = 0,cane1destra = 0,cane1sinistra = 0; //contamovimenti per il cane1
  53.     double pcane1su = 0,pcane1giu = 0,pcane1destra = 0,pcane1sinistra = 0; //percentuali di movimento del cane1
  54.     double cane2su = 0,cane2giu = 0,cane2destra = 0,cane2sinistra = 0; //contamovimenti per il cane2
  55.     double pcane2su = 0,pcane2giu = 0,pcane2destra = 0,pcane2sinistra = 0; //percentuali di movimento del cane2
  56.  
  57.     double gatto1su = 0,gatto1giu = 0,gatto1destra = 0,gatto1sinistra = 0; //contamovimenti per il gatto1
  58.     double pgatto1su = 0,pgatto1giu = 0,pgatto1destra = 0,pgatto1sinistra = 0; //percentuali di movimento del gatto1
  59.     double gatto2su = 0,gatto2giu = 0,gatto2destra = 0,gatto2sinistra = 0; //contamovimenti per il gatto2
  60.     double pgatto2su = 0,pgatto2giu = 0,pgatto2destra = 0,pgatto2sinistra = 0; //percentuali di movimento del gatto2
  61.  
  62.     printf("Benvenuto nel programma: Cani e Gatti\n");
  63.     srand(time(NULL)); //genero un seme per i numeri pseudocasuali in base all'orario di esecuzione
  64.     dimscacchiera(&righe,&colonne);//richiamo la procedura dimscacchiera per passare gli indirizzi di righe e colonne
  65.     passidaeffettuare(&passi);//richiamo la procedura passidaeffettuare passando l'indirizzo della variabile passi
  66.     inizializzazionescacchiera(scacchiera,righe,colonne);//richiamo la procedura per creare la scacchiera
  67.     cani_gatti(scacchiera,righe,colonne, &rigagatto1, &colonnagatto1, &rigagatto2, &colonnagatto2,
  68.                &rigacane1, &colonnacane1, &rigacane2, &colonnacane2);/*richiamo la procedura per inserire i cani e gatti
  69.                nella scacchiera,in maniera CASUALE*/
  70.     visualizzascacchiera(scacchiera,righe,colonne);//visualizzo la scacchiera chiamando la procedura apposita
  71.  
  72.     /*il seguente ciclo while è così strutturato:
  73.     fin quando il numero dei passi è maggiore di 0 E il numero dei gatti è maggiore di 0
  74.     esegui le istruzioni*/
  75.  
  76.     while((numgatti > 0)&&(passi > 0)){
  77.         if(numgatti == 2){ //se il numero dei gatti è 2
  78.                 /*calcolo le distanze prima del cane 1 verso i due gatti scegliendo la minore tra le due
  79.                 In input vengono prese le posizioni del cane1 e di gatto1 per distanza1 e gatto2 per distanza2*/
  80.             distanza1 = distanza(rigacane1,colonnacane1,rigagatto1,colonnagatto1);
  81.             distanza2 = distanza(rigacane1,colonnacane1,rigagatto2,colonnagatto2);
  82.  
  83.         /*Se la distanza1 è minore o uguale della distanza2 allora vuol dire che il gatto1 è più vicino (o distante uguale,
  84.         ma per convenienza do precedenza al primo cane) al cane1
  85.         Dunque richiamo movimentocane passandogli la posizione di cane1 e gatto1
  86.         Nel caso opposto (cioè che la distanza minore è quella verso il secondo gatto, allora richiamo la stessa procedura
  87.                           ma passando l'indice del gatto2*/
  88.             if(distanza1<=distanza2){
  89.                 movimentocane1(scacchiera,&rigagatto1,&colonnagatto1,&rigacane1,&colonnacane1,&numgatti,&cane1su,&cane1giu,
  90.                               &cane1destra,&cane1sinistra);
  91.             }
  92.             else{
  93.                 movimentocane1(scacchiera,&rigagatto2,&colonnagatto2,&rigacane1,&colonnacane1,&numgatti,
  94.                               &cane1su,&cane1giu,&cane1destra,&cane1sinistra);
  95.             }
  96.             //faccio lo stesso procedimento per quanto riguarda il secondo cane
  97.             distanza1 = distanza(rigacane2,colonnacane2,rigagatto1,colonnagatto1);
  98.             distanza2 = distanza(rigacane2,colonnacane2,rigagatto2,colonnagatto2);
  99.             if(distanza1<=distanza2){
  100.                 movimentocane2(scacchiera,&rigagatto1,&colonnagatto1,&rigacane2,&colonnacane2,&numgatti,
  101.                               &cane2su,&cane2giu,&cane2destra,&cane2sinistra);
  102.                 if(numgatti == 2){
  103.                     /*dopo i cani faccio muovere i gatti tenendo conto della variabile numgatti
  104.                     Se è ancora uguale a 2 allora significa che nessun gatto è stato preso e posso richiamare
  105.                     movimentogatto per entrambi i gatti*/
  106.                     movimentogatto(scacchiera,righe,colonne, &rigagatto1,&colonnagatto1,&gatto1su,&gatto1giu,
  107.                                    &gatto1destra,&gatto1sinistra);
  108.                     movimentogatto(scacchiera,righe,colonne, &rigagatto2,&colonnagatto2, &gatto2su, &gatto2giu,
  109.                                    &gatto2destra,&gatto2sinistra);
  110.                 }
  111.                 else{
  112.                     /*Nel caso in cui numgatti è diventato 1 significa che un gatto è stato preso
  113.                     Nota: per distinguere i due cani ed i due gatti
  114.                     'G' indica il gatto1 e 'g' indica il gatto2
  115.                     'C' indica il cane1 e 'c' indica il cane2
  116.  
  117.                     Quindi se numgatti è 1 E la matrice scacchiera con la posizione del gatto1 è 'G'
  118.                     vuol dire che non è gatto1 ad esser stato preso e posso dunque procedere a chiamare la procedura
  119.                     per muovere il gatto1
  120.  
  121.                     Qualora numgatti è 1, ma è la matrice scacchiera con l'indice del gatto2 ad essere 'g'
  122.                     Allora è il gatto1 ad essere stato preso, mentre procedo a far muovere gatto2*/
  123.  
  124.                     if((numgatti == 1)&&(scacchiera[rigagatto1][colonnagatto1]== 'G'))
  125.                     movimentogatto(scacchiera,righe,colonne, &rigagatto1,&colonnagatto1,&gatto1su,&gatto1giu,
  126.                                    &gatto1destra,&gatto1sinistra);
  127.                     if((numgatti == 1)&&(scacchiera[rigagatto2][colonnagatto2]== 'g'))
  128.                     movimentogatto(scacchiera,righe,colonne, &rigagatto2,&colonnagatto2, &gatto2su, &gatto2giu,
  129.                                    &gatto2destra,&gatto2sinistra);
  130.                 }
  131.             }else{//nel caso in cui la distanza2 è minore di distanza1 si muoverà per primo il secondo cane
  132.                 movimentocane2(scacchiera,&rigagatto2,&colonnagatto2,&rigacane2,&colonnacane2,&numgatti,
  133.                               &cane2su,&cane2giu,&cane2destra,&cane2sinistra);
  134.                 if(numgatti == 2){//stesso procedimento di riga 85-109
  135.                     movimentogatto(scacchiera,righe,colonne, &rigagatto1,&colonnagatto1,&gatto1su,&gatto1giu,
  136.                                    &gatto1destra,&gatto1sinistra);
  137.                     movimentogatto(scacchiera,righe,colonne, &rigagatto2,&colonnagatto2, &gatto2su, &gatto2giu,
  138.                                    &gatto2destra,&gatto2sinistra);
  139.                 }
  140.                 else{
  141.                     if((numgatti == 1)&&(scacchiera[rigagatto1][colonnagatto1]== 'G'))
  142.                     movimentogatto(scacchiera,righe,colonne, &rigagatto1,&colonnagatto1,&gatto1su,&gatto1giu,
  143.                                    &gatto1destra,&gatto1sinistra);
  144.                     if((numgatti == 1)&&(scacchiera[rigagatto2][colonnagatto2]== 'g'))
  145.                     movimentogatto(scacchiera,righe,colonne, &rigagatto2,&colonnagatto2, &gatto2su, &gatto2giu,
  146.                                    &gatto2destra,&gatto2sinistra);
  147.                 }
  148.             }
  149.         }else{/*nel caso in cui numgatti non è più uguale a 2 controllo quale gatto è stato preso
  150.             I cani si muoveranno verso quello che non è stato preso (la distanza non è più necessaria
  151.                                                                       siccome resta un solo gatto
  152.                                                                       Per convenienza faccio sempre muovere il primo cane*/
  153.             if(scacchiera[rigagatto1][colonnagatto1] == 'G'){
  154.             movimentocane1(scacchiera,&rigagatto1,&colonnagatto1,&rigacane1,&colonnacane1, &numgatti,&cane1su,&cane1giu,
  155.                           &cane1destra,&cane1sinistra);
  156.             }
  157.             else{
  158.             movimentocane1(scacchiera,&rigagatto2,&colonnagatto2,&rigacane1,&colonnacane1, &numgatti,&cane1giu,&cane1su,
  159.                           &cane1destra,&cane1sinistra);
  160.             }
  161.             if(scacchiera[rigagatto1][colonnagatto1] == 'G'){
  162.             movimentocane2(scacchiera,&rigagatto1,&colonnagatto1,&rigacane2,&colonnacane2, &numgatti,
  163.                           &cane2su,&cane2giu,&cane2destra,&cane2sinistra);
  164.             if(numgatti == 1)
  165.                 movimentogatto(scacchiera,righe,colonne, &rigagatto1,&colonnagatto1,&gatto1su,&gatto1giu,
  166.                                    &gatto1destra,&gatto1sinistra);/*
  167.                 faccio muovere il primo gatto se numgatti è uguale ad 1 e se la matrice scacchiera con l'indice del primo gatto
  168.                 ha come valore 'G', altrimenti vuol dire che è il gatto2 che non è stato ancora preso*/
  169.             }
  170.             else{
  171.             movimentocane2(scacchiera,&rigagatto2,&colonnagatto2,&rigacane2,&colonnacane2, &numgatti,
  172.                           &cane2su,&cane2giu,&cane2destra,&cane2sinistra);
  173.             if(numgatti == 1)/*se dopo che i cani si sono mossi, numgatti è ancora 1, vuol dire che posso far muovere il gatto2*/
  174.                 movimentogatto(scacchiera,righe,colonne, &rigagatto2,&colonnagatto2, &gatto2su, &gatto2giu,
  175.                                    &gatto2destra,&gatto2sinistra);
  176.             }
  177.         }
  178.         Sleep(2000); /*la procedura sleep (della libreria windows.h) la utilizzo per rallentare l'esecuzione del programma
  179.         di 2000 millisecondi (2 secondi)*/
  180.         visualizzascacchiera(scacchiera,righe,colonne); //al termine di ogni movimento di tutti gli animali, stampo la scacchiera
  181.         passi--;//decremento ogni volta i passi di 1
  182.     };
  183.     if(numgatti == 0){//altermine se numgatti è 0 significa che i gatti sono stati presi e l'utente ha vinto
  184.         printf("I cani hanno preso i gatti! Hai vinto!\n");
  185.     }else{
  186.         printf("I passi massimi sono stati effettuati, ma i gatti non sono stati presi, hai perso!\n");/*altrimenti significa
  187.         che i passi sono terminati e l'utente ha perso*/
  188.     }
  189.  
  190.     //calcolo e stampo a video la percentuale dei movimenti di cani e gatti
  191.     if(cane1su != 0)
  192.         pcane1su = (cane1su*100)/(cane1su + cane1giu + cane1destra + cane1sinistra);
  193.     if(cane1giu != 0)
  194.         pcane1giu = (cane1giu*100)/(cane1su + cane1giu + cane1destra + cane1sinistra);
  195.     if(cane1destra != 0)
  196.         pcane1destra = (cane1destra*100)/(cane1su + cane1giu + cane1destra + cane1sinistra);
  197.     if(cane1sinistra != 0)
  198.         pcane1sinistra = (cane1sinistra*100)/(cane1su + cane1giu + cane1destra + cane1sinistra);
  199.  
  200.     printf("Il cane C si e' mosso:\nPer il %-.lf%% verso l'alto\nPer il %-.lf%% verso il basso\nPer il %-.lf%% verso destra\nPer il %-.lf%% verso sinistra\n\n",
  201.            pcane1su,pcane1giu,pcane1destra,pcane1sinistra);
  202.  
  203.     if(cane2su != 0)
  204.         pcane2su = (cane2su*100)/(cane2su + cane2giu + cane2destra + cane2sinistra);
  205.     if(cane2giu != 0)
  206.         pcane2giu = (cane2giu*100)/(cane2su + cane2giu + cane2destra + cane2sinistra);
  207.     if(cane2destra != 0)
  208.         pcane2destra = (cane2destra*100)/(cane2su + cane2giu + cane2destra + cane2sinistra);
  209.     if(cane2sinistra != 0)
  210.         pcane2sinistra = (cane2sinistra*100)/(cane2su + cane2giu + cane2destra + cane2sinistra);
  211.     printf("Il cane c si e' mosso:\nPer il %-.lf%% verso l'alto\nPer il %-.lf%% verso il basso\nPer il %-.lf%% verso destra\nPer il %-.lf%% verso sinistra\n\n",
  212.            pcane2su,pcane2giu,pcane2destra,pcane2sinistra);
  213.  
  214.     if(gatto1su != 0)
  215.         pgatto1su =(gatto1su*100)/(gatto1su + gatto1giu + gatto1destra + gatto1sinistra);
  216.     if(gatto1giu != 0)
  217.         pgatto1giu =(gatto1giu*100)/(gatto1su + gatto1giu + gatto1destra + gatto1sinistra);
  218.     if(gatto1destra != 0)
  219.         pgatto1destra =(gatto1destra*100)/(gatto1su + gatto1giu + gatto1destra + gatto1sinistra);
  220.     if(gatto1sinistra != 0)
  221.         pgatto1sinistra =(gatto1sinistra*100)/(gatto1su + gatto1giu + gatto1destra + gatto1sinistra);
  222.  
  223.     printf("Il gatto G si e' mosso:\nPer il %-.lf%% verso l'alto\nPer il %-.lf%% verso il basso\nPer il %-.lf%% verso destra\nPer il %-.lf%% verso sinistra\n\n",
  224.            pgatto1su,pgatto1giu,pgatto1destra,pgatto1sinistra);
  225.  
  226.     if(gatto2su != 0)
  227.         pgatto2su = (gatto2su*100)/(gatto2su + gatto2giu + gatto2destra + gatto2sinistra);
  228.     if(gatto2giu != 0)
  229.         pgatto2giu = (gatto2giu*100)/(gatto2su + gatto2giu + gatto2destra + gatto2sinistra);
  230.     if(gatto2destra != 0)
  231.         pgatto2destra = (gatto2destra*100)/(gatto2su + gatto2giu + gatto2destra + gatto2sinistra);
  232.     if(gatto2sinistra != 0)
  233.         pgatto2sinistra = (gatto2sinistra*100)/(gatto2su + gatto2giu + gatto2destra + gatto2sinistra);
  234.  
  235.     printf("Il gatto g si e' mosso:\nPer il %-.lf%% verso l'alto\nPer il %-.lf%% verso il basso\nPer il %-.lf%% verso destra\nPer il %-.lf%% verso sinistra\n",
  236.            pgatto2su,pgatto2giu,pgatto2destra,pgatto2sinistra);
  237. }
  238. /* La procedura dimscacchiera prende in ingresso i puntatori di righe e colonne per consentire all'utente di
  239. inserire le dimensioni della scacchiera (utilizzo un do-while per evitare che l'utente inserisca numeri negativi
  240.                                          o superiori al 100, dato che la dimensione massima della mia matrice é 100x100 */
  241. void dimscacchiera(int *righe, int *colonne){
  242.     printf("Inserisci il numero di righe della scacchiera per iniziare a giocare (compreso tra 2 e 100)\n");
  243.     do{
  244.         scanf("%d",righe);
  245.     }while((*righe < 2) || (*righe > 100));
  246.     printf("Inserisci il numero di colonne della scacchiera per iniziare a giocare (compreso tra 2 e 100)\n");
  247.     do{
  248.         scanf("%d",colonne);
  249.     }while((*colonne < 2) || (*colonne > 100));
  250.     printf("Hai creato una scacchiera con %d righe e %d colonne\n",*righe,*colonne);
  251. }
  252.  
  253. /* Nella procedura passidaeffettuare chiedo all'utente il numero di passi massimo da effettuare prima di terminare il gioco*/
  254. void passidaeffettuare(int *passi){
  255.     printf("Inserisci quanti passi vuoi effettuare al massimo all'interno della scacchiera\n");
  256.     scanf("%d",passi);
  257.     printf("Hai deciso di effettuare %d passi\n", *passi);
  258. }
  259.  
  260. /* Nella procedura inizializzazionescacchiera prendo in ingresso la scacchiera (array di char) e le sue dimensioni
  261. Inizializzo tutto con un trattino(-) per comodità, prima di andare ad inserire i cani ed i gatti*/
  262. void inizializzazionescacchiera(char scacchiera[][100], int righe, int colonne){
  263.     int i,j;
  264.     for(i = 0; i< righe; i++){
  265.         for(j = 0; j < colonne; j++){
  266.             scacchiera[i][j] = '-';
  267.         }
  268.     }
  269. }
  270.  /*Nella procedura cani_gatti, prendo la scacchiera inizializzata e, mediante due contatori, uno per i cani ed uno per i gatti,
  271.  vado ad inserire in maniera casuale nella scacchiera prima i gatti e poi i cani.
  272.  Utilizzo un IF innestato in un do-while
  273.  Laddove nella posizione x vi è '-', allora inserisco 'G' per il gatto1 e 'g' per il gatto2 e 'C' per il cane1, 'c' per il cane2
  274.  Il gioco utilizza 2 cani e 2 gatti, pertanto il contatore di cani e gatti è inizializzato a zero (0)
  275.  e giunge fino a <1, cioè quando vengono fatte le quattro assegnazioni*/
  276.  
  277. /* la procedura prende in ingresso la matrice scacchiera con il numero di righe e colonne.
  278. Inoltre prende gli indirizzi di memoria di righe e colonne dei 2 gatti e dei 2 cani e li metto nei rispettivi puntatori*/
  279. void cani_gatti(char scacchiera[][100], int righe, int colonne, int* rigagatto1, int *colonnagatto1,
  280.                 int* rigagatto2, int *colonnagatto2, int* rigacane1, int* colonnacane1,
  281.                 int* rigacane2, int* colonnacane2){
  282.     //int cgatto1 = 0;
  283.     int cgatto2 = 0; //contatore gatto2
  284.     int ccane1 = 0; //contatore cane1
  285.     int ccane2 = 0; //contatore cane2
  286.     int indiceriga, indicecolonna;//con queste due variabili locali genero man mano gli indici di riga e colonna per gatti e cani
  287.     //do{
  288.     indiceriga = rand()%righe;//genero un numero che va da 0 a righe-1
  289.     indicecolonna = rand()%colonne;//genero un numero che va da 0 a colonne-1
  290.     scacchiera[indiceriga][indicecolonna] = 'G';
  291.     *rigagatto1 = indiceriga;//salvo nel puntatore gli indici di riga e colonna
  292.     *colonnagatto1 = indicecolonna;
  293.  
  294.     /*per i 3 animali restanti ho bisogno di un do-while per ciascuno.
  295.     Siccome necessito di controllare che l'elemento della matrice con gli indici generati random
  296.     non sia occupata da un altro animale già, quindi sia uguale a '-'.
  297.     Per questo rifaccio la generazione di righe e colonne causali fin quando
  298.     scacchiera[indiceriga][indicecolonna] non è uguale a '-'*/
  299.  
  300.     do{
  301.         indiceriga = rand()%righe;
  302.         indicecolonna = rand()%colonne;
  303.         if(scacchiera[indiceriga][indicecolonna] == '-'){
  304.             scacchiera[indiceriga][indicecolonna] = 'g';
  305.             cgatto2++;//incremento il contatore per uscire dal do-while
  306.             *rigagatto2 = indiceriga;//salvo nel puntatore gli indici di riga e colonna
  307.             *colonnagatto2 = indicecolonna;
  308.         }
  309.     }while(cgatto2 < 1);
  310.     do{
  311.         indiceriga = rand()%righe;
  312.         indicecolonna = rand()%colonne;
  313.         if(scacchiera[indiceriga][indicecolonna] == '-'){
  314.             scacchiera[indiceriga][indicecolonna] = 'C';
  315.             ccane1++;//incremento il contatore per uscire dal do-while
  316.             *rigacane1 = indiceriga;//salvo nel puntatore gli indici di riga e colonna
  317.             *colonnacane1 = indicecolonna;
  318.         }
  319.     }while(ccane1 < 1);
  320.     do{
  321.         indiceriga = rand()%righe;
  322.         indicecolonna = rand()%colonne;
  323.         if(scacchiera[indiceriga][indicecolonna] == '-'){
  324.             scacchiera[indiceriga][indicecolonna] = 'c';
  325.             *rigacane2 = indiceriga;//salvo nel puntatore gli indici di riga e colonna
  326.             *colonnacane2 = indicecolonna;
  327.             ccane2++;//incremento il contatore per uscire dal do-while
  328.         }
  329.     }while(ccane2 < 1);
  330. }
  331. /*In questa procedura che prende in input la matrice di char, le righe e le colonne,stampo a video la scacchiera*/
  332. void visualizzascacchiera(char scacchiera[][100], int righe, int colonne){
  333.     int i,j;
  334.     for(i=0;i<righe;i++){
  335.         for(j=0;j<colonne;j++){
  336.             printf("%c", scacchiera[i][j]);//stampo a video il contenuto della matrice all'indice [i][j]
  337.         }
  338.         printf("\n");// con questo \n vado a capo ogni volta che termina una riga
  339.     }
  340. }
  341.  
  342. /*Questa procedura che prende input la matrice con il rispettivo indice e due puntatori agli indici di riga e colonna del gatto,
  343. serve a far muovere in una delle 4 direzioni l'animale.
  344. La scelta della direzione è random mediante il tipo enumerato: Direzione
  345. Tiene però conto di alcune criticità riscontrate durante la programmazione:
  346. 1. Un gatto non può muoversi prima dell'indice 0 di riga e colonna (andrebbe fuori dalla matrice)
  347. 2. Un gatto non può muoversi dopo l'indice-1 di riga e colonna (andrebbe fuori dalla matrice)
  348. 3.Nel momento in cui un gatto si trova senza movimenti possibili (ovvero che tutte le possibili direzioni sono bloccate,
  349. da indici della matrice o da cani e/o gatti, allora mi vedo costretto a non far muovere il gatto in questione ed ad uscire*/
  350.  
  351. void movimentogatto(char scacchiera[][100], int righe, int colonne, int *rigagatto, int *colonnagatto,
  352.                     double *sopra, double *sotto, double *dx, double *sx){
  353.     Direzione muovi;//variabile muovi del tipo enumerato Direzione
  354.     int contamovimento = 0;//la utilizzo per il do-while, per tener conto di quando il gatto ha effettuato il movimento
  355.     char appoggio; //con questa variabile scambierò gli indici quando viene effettuato un movimento del gatto
  356.     int verificablocco[] = {0,0,0,0}; /* Utilizzo questo vettore per gestire il caso in cui un gatto non possa muoversi in nessuna
  357.                                             delle 4 direzioni*/
  358.     int interrompi = 0; //questa variabile la utilizzo nel momento in cui ogni direzione è bloccata, per uscire dal do-while
  359.     do{
  360.         muovi = rand()%4;//genero un numero random da 0 a 3
  361.         if(muovi == su){//su è uguale a 2 nel tipo enumerato Direzione
  362.  
  363.             /*Se la riga-1 del gatto è maggiore di -1 e
  364.             l'array scacchiera con l'indice della riga-1 e della colonna è uguale all'elemento '-'
  365.             Allora procedo a scambiare 'G' o 'g' con '-' mediante la variabile appoggio*/
  366.             if(((*rigagatto-1)> -1)&&(scacchiera[*rigagatto-1][*colonnagatto] == '-')){
  367.                 printf("Il gatto %c si sta muovendo verso su\n",scacchiera[*rigagatto][*colonnagatto]);
  368.                 appoggio = scacchiera[*rigagatto][*colonnagatto];
  369.                 scacchiera[*rigagatto][*colonnagatto] = scacchiera[*rigagatto-1][*colonnagatto];
  370.                 scacchiera[*rigagatto-1][*colonnagatto] = appoggio;
  371.                 *rigagatto = *rigagatto - 1;//il nuovo valore del puntatore alla riga del gatto diventa *rigagatto-1
  372.                 *sopra = *sopra +1;
  373.                 contamovimento++;//procedo ad incrementare il movimento per uscire dal do-while
  374.             }
  375.             else{//nel caso in cui entro nell'else vuol dire che la direzione SU è bloccata per il gatto in questione
  376.                 verificablocco[0] = -1;//il primo elemento del vettore che verifica il blocco viene messo uguale a -1
  377.             }
  378.         }
  379.         if(muovi == giu){//giu è uguale a 3 nel tipo enumerato Direzione
  380.  
  381.             /*Se la riga+1 del gatto è minore delle righe della matrice e
  382.             l'array scacchiera con l'indice della riga+1 e della colonna è uguale all'elemento '-'
  383.             Allora procedo a scambiare 'G' o 'g' con '-' mediante la variabile appoggio*/
  384.             if(((*rigagatto+1) < righe)&&(scacchiera[*rigagatto+1][*colonnagatto] == '-')){
  385.                 printf("Il gatto %c si sta muovendo verso giu\n",scacchiera[*rigagatto][*colonnagatto]);
  386.                 appoggio = scacchiera[*rigagatto][*colonnagatto];
  387.                 scacchiera[*rigagatto][*colonnagatto] = scacchiera[*rigagatto+1][*colonnagatto];
  388.                 scacchiera[*rigagatto+1][*colonnagatto] = appoggio;
  389.                 *rigagatto = *rigagatto + 1;//il nuovo valore del puntatore alla riga del gatto diventa *rigagatto+1
  390.                 *sotto = *sotto +1;
  391.                 contamovimento++;//procedo ad incrementare il movimento per uscire dal do-while
  392.             }
  393.             else{//nel caso in cui entro nell'else vuol dire che la direzione GIU è bloccata per il gatto in questione
  394.                 verificablocco[1] = -1;//il secondo elemento del vettore che verifica il blocco viene messo uguale a -1
  395.             }
  396.         }
  397.         if(muovi == destra){//destra è uguale a 0 nel tipo enumerato Direzione
  398.  
  399.             /*Se la colonna+1 del gatto è maggiore delle colonne della matrice e
  400.             l'array scacchiera con l'indice della riga e della colonna+1 è uguale all'elemento '-'
  401.             Allora procedo a scambiare 'G' o 'g' con '-' mediante la variabile appoggio*/
  402.             if(((*colonnagatto+1) < colonne)&&(scacchiera[*rigagatto][*colonnagatto+1] == '-')){
  403.                 printf("Il gatto %c si sta muovendo verso destra\n",scacchiera[*rigagatto][*colonnagatto]);
  404.                 appoggio = scacchiera[*rigagatto][*colonnagatto];
  405.                 scacchiera[*rigagatto][*colonnagatto] = scacchiera[*rigagatto][*colonnagatto+1];
  406.                 scacchiera[*rigagatto][*colonnagatto+1] = appoggio;
  407.                 *colonnagatto = *colonnagatto + 1;//il nuovo valore del puntatore alla colonna del gatto diventa *colonnagatto+1
  408.                 *dx = *dx +1;
  409.                 contamovimento++;//procedo ad incrementare il movimento per uscire dal do-while
  410.             }
  411.             else{//nel caso in cui entro nell'else vuol dire che la direzione DESTRA è bloccata per il gatto in questione
  412.                 verificablocco[2] = -1;//il terzo elemento del vettore che verifica il blocco viene messo uguale a -1
  413.             }
  414.         }
  415.         if(muovi == sinistra){//sinistra è uguale a 1 nel tipo enumerato Direzione
  416.  
  417.             /*Se la colonna-1 del gatto è maggiore di -1 e
  418.             l'array scacchiera con l'indice della riga e della colonna-1 è uguale all'elemento '-'
  419.             Allora procedo a scambiare 'G' o 'g' con '-' mediante la variabile appoggio*/
  420.             if(((*colonnagatto-1)>-1)&&(scacchiera[*rigagatto][*colonnagatto-1] == '-')){
  421.                 printf("Il gatto %c si sta muovendo verso sinistra\n",scacchiera[*rigagatto][*colonnagatto]);
  422.                 appoggio = scacchiera[*rigagatto][*colonnagatto];
  423.                 scacchiera[*rigagatto][*colonnagatto] = scacchiera[*rigagatto][*colonnagatto-1];
  424.                 scacchiera[*rigagatto][*colonnagatto-1] = appoggio;
  425.                 *colonnagatto = *colonnagatto -1;//il nuovo valore del puntatore alla colonna del gatto diventa *colonnagatto-1
  426.                 *sx = *sx+1;
  427.                 contamovimento++;//procedo ad incrementare il movimento per uscire dal do-while
  428.             }
  429.             else{//nel caso in cui entro nell'else vuol dire che la direzione SINISTRA è bloccata per il gatto in questione
  430.                 verificablocco[3] = -1;//il quarto elemento del vettore che verifica il blocco viene messo uguale a -1
  431.             }
  432.         }//qualora il gatto non si fosse mosso (contamovimento == 0) inizio a contare in quante direzioni ha provato a muoversi
  433.         if(contamovimento == 0){
  434.             /*se tutti i valori nel vettore verificablocco sono -1, incremento interrompi perchè vuol dire che non ci sono
  435.             movimenti disponibili che il gatto in quel momento può effettuare.
  436.             Al primo valore che non è -1 (==0) breakko il ciclo for per evitare di ciclare inutilmente su altri elementi*/
  437.             for(int i=0;i<4;i++){
  438.                 if(verificablocco[i] == 0){
  439.                     break;
  440.                 }
  441.                 else
  442.                     interrompi++;
  443.             }
  444.             if(interrompi == 4){//se interrompi è 4 allora il gatto non può muoversi. Incremento contamovimento ed esco
  445.                 printf("Il gatto non puo' muoversi in nessuna delle 4 direzioni possibili\n");
  446.                 contamovimento = 1;
  447.             }
  448.             else
  449.                 interrompi = 0;//altrimenti vuol dire che vi sono ancora direzioni da controllare e setto interrompi a 0
  450.         }
  451.     }while(contamovimento < 1);
  452. }
  453. /*la procedura movimentocane prende in input la matrice con i rispettivi indici ed i puntatori alle righe e colonne di
  454. un gatto e del cane1, oltre al puntatore di numgatti (variabile che verifica quanti gatti sono rimasti*/
  455. void movimentocane1(char scacchiera[][100],int *rigagatto, int *colonnagatto,
  456.                    int *rigacane, int *colonnacane, int* numgatti, double *su, double *giu, double *destra, double *sinistra){
  457.     char appoggio;//utilizzo appoggio per scambiare qualora vi è un movimento, come nella procedura movimentogatti
  458.     int contamovimento = 0;//anche qui utilizzo contamovimento per avviare il do-while
  459.     /*Funzionamento
  460.     Quando un cane prende un gatto, il cane prende il posto del gatto nella scacchiera.
  461.     Il gatto invece sparisce.
  462.     Nel momento in cui si muove verso il gatto, invece, dò priorità, per scelta personale, alle righe prima che alle colonne
  463.     per quanto riguarda il cane1
  464.     (Mi avvalgo dei break per interrompere il do-while appena un primo passo viene compiuto, impedendo al cane di
  465.      compiere più movimenti in un solo ciclo)
  466.     PER PRENDERE UN GATTO SOSTANZIALMENTE C'E' BISOGNO CHE, DOPO IL MOVIMENTO, GLI INDICI DI RIGHE DEL CANE E DEL GATTO
  467.     DIVENTINO ESATTAMENTE UGUALI, STESSO DISCORSO PER LE COLONNE.
  468.     Quindi:
  469.     1. nel momento in cui la riga del cane è minore a quella del gatto, significa che il cane si muoverà verso il basso
  470.     2. nel momento in cui la riga del cane è minore a quella del gatto, significa che il cane si muoverà verso sopra
  471.     3. nel momento in cui la riga del cane è UGUALE a quella del gatto il cane:
  472.     Si muoverà a destra se la colonna è minore di quella del gatto, a sinistra se maggiore di quella del gatto
  473.     */
  474.     do{
  475.         //righe
  476.         /*Se la riga del cane è minore di quella del gatto, ma lo stesso gatto ancora non è stato preso dopo il passo
  477.         (cioè scacchiera[*rigacane+1][*colonnacane] è uguale a '-'
  478.          Allora il cane si sta avvicinando verso il basso
  479.          Con la variabile appoggio scambio i due elementi di scacchiera
  480.          Aggiorno il puntatore di riga del cane
  481.          Incremento il movimento per uscire dal do-while*/
  482.         if((*rigacane < *rigagatto) && (scacchiera[*rigacane+1][*colonnacane] == '-')){
  483.             printf("Il cane %c si muove verso il basso per avvicinarsi al gatto\n",scacchiera[*rigacane][*colonnacane]);
  484.             appoggio = scacchiera[*rigacane][*colonnacane];
  485.             scacchiera[*rigacane][*colonnacane] = scacchiera[*rigacane+1][*colonnacane];
  486.             scacchiera[*rigacane+1][*colonnacane] = appoggio;
  487.             *rigacane = *rigacane + 1;
  488.             contamovimento++;
  489.             *giu = *giu +1;
  490.             break;
  491.         }
  492.  
  493.         /*Se la riga del cane è minore di quella del gatto, e dopo il passo il gatto è stato preso
  494.         (cioè scacchiera[*rigacane+1][*colonnacane] è uguale a 'G' o 'g'
  495.          Allora il cane ha preso il gatto
  496.          scacchiera[*rigacane+1][colonnacane] diventa il nuovo indice del cane, mentre il precedente diventa '-'
  497.          Aggiorno il puntatore di riga del cane
  498.          Decremento di uno il puntatore di numgatti
  499.          Incremento il movimento per uscire dal do-while*/
  500.         if((*rigacane < *rigagatto)&& ((scacchiera[*rigacane+1][*colonnacane] == 'G')||(scacchiera[*rigacane+1][*colonnacane] == 'g'))){
  501.            printf("Il cane %c si e' mosso verso il basso ed ha preso il gatto %c!\n",
  502.                   scacchiera[*rigacane][*colonnacane],scacchiera[*rigacane+1][*colonnacane]);
  503.            scacchiera[*rigacane+1][*colonnacane] = scacchiera[*rigacane][*colonnacane];
  504.            scacchiera[*rigacane][*colonnacane] = '-';
  505.            *rigacane = *rigacane + 1;
  506.            *numgatti = *numgatti -1;
  507.            contamovimento++;
  508.            *giu = *giu + 1;
  509.            break;
  510.         }
  511.  
  512.         /*Se la riga del cane è maggiore di quella del gatto, ma lo stesso gatto ancora non è stato preso dopo il passo
  513.         (cioè scacchiera[*rigacane-1][*colonnacane] è uguale a '-'
  514.          Allora il cane si sta avvicinando verso l'alto
  515.          Con la variabile appoggio scambio i due elementi di scacchiera
  516.          Aggiorno il puntatore di riga del cane
  517.          Incremento il movimento per uscire dal do-while*/
  518.         if((*rigacane > *rigagatto) && (scacchiera[*rigacane-1][*colonnacane] == '-')){
  519.             printf("Il cane %c si muove verso l'alto per avvicinarsi al gatto\n",scacchiera[*rigacane][*colonnacane]);
  520.             appoggio = scacchiera[*rigacane][*colonnacane];
  521.             scacchiera[*rigacane][*colonnacane] = scacchiera[*rigacane-1][*colonnacane];
  522.             scacchiera[*rigacane-1][*colonnacane] = appoggio;
  523.             *rigacane = *rigacane - 1;
  524.             contamovimento++;
  525.             *su = *su +1;
  526.             break;
  527.         }
  528.  
  529.         /*Se la riga del cane è maggiore di quella del gatto, e dopo il passo il gatto è stato preso
  530.         (cioè scacchiera[*rigacane-1][*colonnacane] è uguale a 'G' o 'g'
  531.          Allora il cane ha preso il gatto
  532.          scacchiera[*rigacane-1][colonnacane] diventa il nuovo indice del cane, mentre il precedente diventa '-'
  533.          Aggiorno il puntatore di riga del cane
  534.          Decremento di uno il puntatore di numgatti
  535.          Incremento il movimento per uscire dal do-while*/
  536.         if((*rigacane > *rigagatto)&& ((scacchiera[*rigacane-1][*colonnacane] == 'G')||(scacchiera[*rigacane-1][*colonnacane] == 'g'))){
  537.            printf("Il cane %c si e' mosso verso l'alto ed ha preso il gatto %c!\n"
  538.                   ,scacchiera[*rigacane][*colonnacane],scacchiera[*rigacane-1][*colonnacane]);
  539.            scacchiera[*rigacane-1][*colonnacane] = scacchiera[*rigacane][*colonnacane];
  540.            scacchiera[*rigacane][*colonnacane] = '-';
  541.            *rigacane = *rigacane - 1;
  542.            *numgatti = *numgatti -1;
  543.            contamovimento++;
  544.            *su = *su +1;
  545.            break;
  546.         }
  547.         //colonne
  548.  
  549.         /*Se la colonna del cane è minore di quella del gatto, ma lo stesso gatto ancora non è stato preso dopo il passo
  550.         (cioè scacchiera[*rigacane][*colonnacane+1] è uguale a '-'
  551.          Allora il cane si sta avvicinando verso destra
  552.          Con la variabile appoggio scambio i due elementi di scacchiera
  553.          Aggiorno il puntatore di colonna del cane
  554.          Incremento il movimento per uscire dal do-while*/
  555.          if((*colonnacane < *colonnagatto) && (scacchiera[*rigacane][*colonnacane+1] == '-')){
  556.             printf("Il cane %c si muove verso destra per avvicinarsi al gatto\n",scacchiera[*rigacane][*colonnacane]);
  557.             appoggio = scacchiera[*rigacane][*colonnacane];
  558.             scacchiera[*rigacane][*colonnacane] = scacchiera[*rigacane][*colonnacane+1];
  559.             scacchiera[*rigacane][*colonnacane+1] = appoggio;
  560.             *colonnacane = *colonnacane + 1;
  561.             contamovimento++;
  562.             *destra = *destra +1;
  563.             break;
  564.         }
  565.  
  566.         /*Se la colonna del cane è minore di quella del gatto, e dopo il passo il gatto è stato preso
  567.         (cioè scacchiera[*rigacane][*colonnacane+1] è uguale a 'G' o 'g'
  568.          Allora il cane ha preso il gatto
  569.          scacchiera[*rigacane][colonnacane+1] diventa il nuovo indice del cane, mentre il precedente diventa '-'
  570.          Aggiorno il puntatore di colonna del cane
  571.          Decremento di uno il puntatore di numgatti
  572.          Incremento il movimento per uscire dal do-while*/
  573.         if((*colonnacane < *colonnagatto)&& ((scacchiera[*rigacane][*colonnacane+1] == 'G')||(scacchiera[*rigacane][*colonnacane+1] == 'g'))){
  574.            printf("Il cane %c si e' mosso verso destra ed ha preso il gatto %c!\n",
  575.                   scacchiera[*rigacane][*colonnacane],scacchiera[*rigacane][*colonnacane+1]);
  576.            scacchiera[*rigacane][*colonnacane+1] = scacchiera[*rigacane][*colonnacane];
  577.            scacchiera[*rigacane][*colonnacane] = '-';
  578.            *colonnacane = *colonnacane + 1;
  579.            *numgatti = *numgatti -1;
  580.            contamovimento++;
  581.            *destra = *destra+1;
  582.            break;
  583.         }
  584.  
  585.         /*Se la colonna del cane è maggiore di quella del gatto, ma lo stesso gatto ancora non è stato preso dopo il passo
  586.         (cioè scacchiera[*rigacane][*colonnacane-1] è uguale a '-'
  587.          Allora il cane si sta avvicinando verso sinistra
  588.          Con la variabile appoggio scambio i due elementi di scacchiera
  589.          Aggiorno il puntatore di colonna del cane
  590.          Incremento il movimento per uscire dal do-while*/
  591.         if((*colonnacane > *colonnagatto) && (scacchiera[*rigacane][*colonnacane-1]== '-')){
  592.             printf("Il cane %c si muove verso sinistra per avvicinarsi al gatto\n",scacchiera[*rigacane][*colonnacane]);
  593.             appoggio = scacchiera[*rigacane][*colonnacane];
  594.             scacchiera[*rigacane][*colonnacane] = scacchiera[*rigacane][*colonnacane-1];
  595.             scacchiera[*rigacane][*colonnacane-1] = appoggio;
  596.             *colonnacane = *colonnacane - 1;
  597.             contamovimento++;
  598.             *sinistra = *sinistra +1;
  599.             break;
  600.         }
  601.  
  602.          /*Se la colonna del cane è maggiore di quella del gatto, e dopo il passo il gatto è stato preso
  603.         (cioè scacchiera[*rigacane][*colonnacane-1] è uguale a 'G' o 'g'
  604.          Allora il cane ha preso il gatto
  605.          scacchiera[*rigacane][colonnacane-1] diventa il nuovo indice del cane, mentre il precedente diventa '-'
  606.          Aggiorno il puntatore di colonna del cane
  607.          Decremento di uno il puntatore di numgatti
  608.          Incremento il movimento per uscire dal do-while*/
  609.         if((*colonnacane > *colonnagatto)&& ((scacchiera[*rigacane][*colonnacane-1] == 'G')||(scacchiera[*rigacane][*colonnacane-1] == 'g'))){
  610.            printf("Il cane %c si e' mosso verso sinistra ed ha preso il gatto %c!\n",
  611.                 scacchiera[*rigacane][*colonnacane],scacchiera[*rigacane][*colonnacane-1]);
  612.            scacchiera[*rigacane][*colonnacane-1] = scacchiera[*rigacane][*colonnacane];
  613.            scacchiera[*rigacane][*colonnacane] = '-';
  614.            *colonnacane = *colonnacane - 1;
  615.            *numgatti = *numgatti-1;
  616.            contamovimento++;
  617.            *sinistra = *sinistra +1;
  618.            break;
  619.         }
  620.         break;
  621.     }while(contamovimento<1);
  622. }
  623.  
  624. /*la procedura movimentocane prende in input la matrice con i rispettivi indici ed i puntatori alle righe e colonne di
  625. un gatto e del cane2, oltre al puntatore di numgatti (variabile che verifica quanti gatti sono rimasti*/
  626. void movimentocane2(char scacchiera[][100],int *rigagatto, int *colonnagatto,
  627.                    int *rigacane, int *colonnacane, int* numgatti, double *su, double *giu, double *destra, double *sinistra){
  628.     char appoggio;//utilizzo appoggio per scambiare qualora vi è un movimento, come nella procedura movimentogatti
  629.     int contamovimento = 0;//anche qui utilizzo contamovimento per avviare il do-while
  630.     /*Funzionamento
  631.     Quando un cane prende un gatto, il cane prende il posto del gatto nella scacchiera.
  632.     Il gatto invece sparisce.
  633.     Nel momento in cui si muove verso il gatto, invece, dò priorità, per scelta personale, alle colonne prima che alle righe
  634.     per quanto riguarda il cane2
  635.     (Mi avvalgo dell'utilizzo dei break per interrompere il do-while appena un primo passo viene compiuto, impedendo al cane2 di
  636.      compiere più movimenti in un solo ciclo)
  637.     PER PRENDERE UN GATTO SOSTANZIALMENTE C'E' BISOGNO CHE, DOPO IL MOVIMENTO, GLI INDICI DI RIGHE DEL CANE E DEL GATTO
  638.     DIVENTINO ESATTAMENTE UGUALI, STESSO DISCORSO PER LE COLONNE.
  639.     Quindi:
  640.     1. nel momento in cui la riga del cane è minore a quella del gatto, significa che il cane si muoverà verso il basso
  641.     2. nel momento in cui la riga del cane è minore a quella del gatto, significa che il cane si muoverà verso sopra
  642.     3. nel momento in cui la riga del cane è UGUALE a quella del gatto il cane:
  643.     Si muoverà a destra se la colonna è minore di quella del gatto, a sinistra se maggiore di quella del gatto
  644.     */
  645.     do{
  646.         //colonne
  647.  
  648.         /*Se la colonna del cane è minore di quella del gatto, ma lo stesso gatto ancora non è stato preso dopo il passo
  649.         (cioè scacchiera[*rigacane][*colonnacane+1] è uguale a '-'
  650.          Allora il cane si sta avvicinando verso destra
  651.          Con la variabile appoggio scambio i due elementi di scacchiera
  652.          Aggiorno il puntatore di colonna del cane
  653.          Incremento il movimento per uscire dal do-while*/
  654.          if((*colonnacane < *colonnagatto) && (scacchiera[*rigacane][*colonnacane+1] == '-')){
  655.             printf("Il cane %c si muove verso destra per avvicinarsi al gatto\n",scacchiera[*rigacane][*colonnacane]);
  656.             appoggio = scacchiera[*rigacane][*colonnacane];
  657.             scacchiera[*rigacane][*colonnacane] = scacchiera[*rigacane][*colonnacane+1];
  658.             scacchiera[*rigacane][*colonnacane+1] = appoggio;
  659.             *colonnacane = *colonnacane + 1;
  660.             contamovimento++;
  661.             *destra = *destra +1;
  662.             break;
  663.         }
  664.  
  665.         /*Se la colonna del cane è minore di quella del gatto, e dopo il passo il gatto è stato preso
  666.         (cioè scacchiera[*rigacane][*colonnacane+1] è uguale a 'G' o 'g'
  667.          Allora il cane ha preso il gatto
  668.          scacchiera[*rigacane][colonnacane+1] diventa il nuovo indice del cane, mentre il precedente diventa '-'
  669.          Aggiorno il puntatore di colonna del cane
  670.          Decremento di uno il puntatore di numgatti
  671.          Incremento il movimento per uscire dal do-while*/
  672.         if((*colonnacane < *colonnagatto)&& ((scacchiera[*rigacane][*colonnacane+1] == 'G')||(scacchiera[*rigacane][*colonnacane+1] == 'g'))){
  673.            printf("Il cane %c si e' mosso verso destra ed ha preso il gatto %c!\n",
  674.                   scacchiera[*rigacane][*colonnacane],scacchiera[*rigacane][*colonnacane+1]);
  675.            scacchiera[*rigacane][*colonnacane+1] = scacchiera[*rigacane][*colonnacane];
  676.            scacchiera[*rigacane][*colonnacane] = '-';
  677.            *colonnacane = *colonnacane + 1;
  678.            *numgatti = *numgatti -1;
  679.            contamovimento++;
  680.            *destra = *destra+1;
  681.            break;
  682.         }
  683.  
  684.         /*Se la colonna del cane è maggiore di quella del gatto, ma lo stesso gatto ancora non è stato preso dopo il passo
  685.         (cioè scacchiera[*rigacane][*colonnacane-1] è uguale a '-'
  686.          Allora il cane si sta avvicinando verso sinistra
  687.          Con la variabile appoggio scambio i due elementi di scacchiera
  688.          Aggiorno il puntatore di colonna del cane
  689.          Incremento il movimento per uscire dal do-while*/
  690.         if((*colonnacane > *colonnagatto) && (scacchiera[*rigacane][*colonnacane-1]== '-')){
  691.             printf("Il cane %c si muove verso sinistra per avvicinarsi al gatto\n",scacchiera[*rigacane][*colonnacane]);
  692.             appoggio = scacchiera[*rigacane][*colonnacane];
  693.             scacchiera[*rigacane][*colonnacane] = scacchiera[*rigacane][*colonnacane-1];
  694.             scacchiera[*rigacane][*colonnacane-1] = appoggio;
  695.             *colonnacane = *colonnacane - 1;
  696.             contamovimento++;
  697.             *sinistra = *sinistra +1;
  698.             break;
  699.         }
  700.  
  701.          /*Se la colonna del cane è maggiore di quella del gatto, e dopo il passo il gatto è stato preso
  702.         (cioè scacchiera[*rigacane][*colonnacane-1] è uguale a 'G' o 'g'
  703.          Allora il cane ha preso il gatto
  704.          scacchiera[*rigacane][colonnacane-1] diventa il nuovo indice del cane, mentre il precedente diventa '-'
  705.          Aggiorno il puntatore di colonna del cane
  706.          Decremento di uno il puntatore di numgatti
  707.          Incremento il movimento per uscire dal do-while*/
  708.         if((*colonnacane > *colonnagatto)&& ((scacchiera[*rigacane][*colonnacane-1] == 'G')||(scacchiera[*rigacane][*colonnacane-1] == 'g'))){
  709.            printf("Il cane %c si e' mosso verso sinistra ed ha preso il gatto %c!\n",
  710.                 scacchiera[*rigacane][*colonnacane],scacchiera[*rigacane][*colonnacane-1]);
  711.            scacchiera[*rigacane][*colonnacane-1] = scacchiera[*rigacane][*colonnacane];
  712.            scacchiera[*rigacane][*colonnacane] = '-';
  713.            *colonnacane = *colonnacane - 1;
  714.            *numgatti = *numgatti-1;
  715.            contamovimento++;
  716.            *sinistra = *sinistra +1;
  717.            break;
  718.         }
  719.  
  720.         //righe
  721.         /*Se la riga del cane è minore di quella del gatto, ma lo stesso gatto ancora non è stato preso dopo il passo
  722.         (cioè scacchiera[*rigacane+1][*colonnacane] è uguale a '-'
  723.          Allora il cane si sta avvicinando verso il basso
  724.          Con la variabile appoggio scambio i due elementi di scacchiera
  725.          Aggiorno il puntatore di riga del cane
  726.          Incremento il movimento per uscire dal do-while*/
  727.         if((*rigacane < *rigagatto) && (scacchiera[*rigacane+1][*colonnacane] == '-')){
  728.             printf("Il cane %c si muove verso il basso per avvicinarsi al gatto\n",scacchiera[*rigacane][*colonnacane]);
  729.             appoggio = scacchiera[*rigacane][*colonnacane];
  730.             scacchiera[*rigacane][*colonnacane] = scacchiera[*rigacane+1][*colonnacane];
  731.             scacchiera[*rigacane+1][*colonnacane] = appoggio;
  732.             *rigacane = *rigacane + 1;
  733.             contamovimento++;
  734.             *giu = *giu +1;
  735.             break;
  736.         }
  737.  
  738.         /*Se la riga del cane è minore di quella del gatto, e dopo il passo il gatto è stato preso
  739.         (cioè scacchiera[*rigacane+1][*colonnacane] è uguale a 'G' o 'g'
  740.          Allora il cane ha preso il gatto
  741.          scacchiera[*rigacane+1][colonnacane] diventa il nuovo indice del cane, mentre il precedente diventa '-'
  742.          Aggiorno il puntatore di riga del cane
  743.          Decremento di uno il puntatore di numgatti
  744.          Incremento il movimento per uscire dal do-while*/
  745.         if((*rigacane < *rigagatto)&& ((scacchiera[*rigacane+1][*colonnacane] == 'G')||(scacchiera[*rigacane+1][*colonnacane] == 'g'))){
  746.            printf("Il cane %c si e' mosso verso il basso ed ha preso il gatto %c!\n",
  747.                   scacchiera[*rigacane][*colonnacane],scacchiera[*rigacane+1][*colonnacane]);
  748.            scacchiera[*rigacane+1][*colonnacane] = scacchiera[*rigacane][*colonnacane];
  749.            scacchiera[*rigacane][*colonnacane] = '-';
  750.            *rigacane = *rigacane + 1;
  751.            *numgatti = *numgatti -1;
  752.            contamovimento++;
  753.            *giu = *giu + 1;
  754.            break;
  755.         }
  756.  
  757.         /*Se la riga del cane è maggiore di quella del gatto, ma lo stesso gatto ancora non è stato preso dopo il passo
  758.         (cioè scacchiera[*rigacane-1][*colonnacane] è uguale a '-'
  759.          Allora il cane si sta avvicinando verso l'alto
  760.          Con la variabile appoggio scambio i due elementi di scacchiera
  761.          Aggiorno il puntatore di riga del cane
  762.          Incremento il movimento per uscire dal do-while*/
  763.         if((*rigacane > *rigagatto) && (scacchiera[*rigacane-1][*colonnacane] == '-')){
  764.             printf("Il cane %c si muove verso l'alto per avvicinarsi al gatto\n",scacchiera[*rigacane][*colonnacane]);
  765.             appoggio = scacchiera[*rigacane][*colonnacane];
  766.             scacchiera[*rigacane][*colonnacane] = scacchiera[*rigacane-1][*colonnacane];
  767.             scacchiera[*rigacane-1][*colonnacane] = appoggio;
  768.             *rigacane = *rigacane - 1;
  769.             contamovimento++;
  770.             *su = *su +1;
  771.             break;
  772.         }
  773.  
  774.         /*Se la riga del cane è maggiore di quella del gatto, e dopo il passo il gatto è stato preso
  775.         (cioè scacchiera[*rigacane-1][*colonnacane] è uguale a 'G' o 'g'
  776.          Allora il cane ha preso il gatto
  777.          scacchiera[*rigacane-1][colonnacane] diventa il nuovo indice del cane, mentre il precedente diventa '-'
  778.          Aggiorno il puntatore di riga del cane
  779.          Decremento di uno il puntatore di numgatti
  780.          Incremento il movimento per uscire dal do-while*/
  781.         if((*rigacane > *rigagatto)&& ((scacchiera[*rigacane-1][*colonnacane] == 'G')||(scacchiera[*rigacane-1][*colonnacane] == 'g'))){
  782.            printf("Il cane %c si e' mosso verso l'alto ed ha preso il gatto %c!\n"
  783.                   ,scacchiera[*rigacane][*colonnacane],scacchiera[*rigacane-1][*colonnacane]);
  784.            scacchiera[*rigacane-1][*colonnacane] = scacchiera[*rigacane][*colonnacane];
  785.            scacchiera[*rigacane][*colonnacane] = '-';
  786.            *rigacane = *rigacane - 1;
  787.            *numgatti = *numgatti -1;
  788.            contamovimento++;
  789.            *su = *su +1;
  790.            break;
  791.         }
  792.         break;
  793.     }while(contamovimento<1);
  794. }
  795.  
  796. /*questa function prende in input l'indice di riga e colonna del cane e del gatto per restituire alla chiamante un double
  797. Utilizzando le funzioni sqrt e pow di math.h vado a calcolare la distanza tra un cane ed un gatto in forma matematica
  798. (x2-x1)^2 + (y2-y1)^2 tutto sotto radice*/
  799. double distanza(int rigacane, int colonnacane, int rigagatto, int colonnagatto){
  800.     double dis;
  801.     dis = pow((rigacane+1) - (rigagatto+1),2.0) + pow((colonnacane+1) - (colonnagatto+1), 2.0);
  802.     dis = sqrt(dis);
  803.     return dis;
  804. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement