Si consideri un videogame dal nome “Godzilla Frenzy”. In tale gioco, il mondo è una griglia MxN e in ogni cella l'utente può costruire delle case o delle strade.
Mentre l'utente costruisce la sua città, Godzilla può arrivare improvvisamente e distruggere ciò che è stato costruito. Tuttavia, Godzilla si può muovere solo in orizzontale e in verticale e ha una paura tremenda delle strade e non vuole assolutamente attraversarle. Pertanto, Godzilla atterra su una casella scelta a caso e si può muovere solo sulle case, quando trova una strada (o il bordo della griglia) è costretto ad indietreggiare. Implementare una funzione ricorsiva che permette di calcolare, a partire da una casella di partenza (quella in cui atterra Godzilla), su quali caselle il mostro si può muovere.
la funzione deve quindi sostituire con delle g le C "racchiuse" da una cornice di S.
io ho ragionato così: dopo aver riempito la matrice in modo casuale, crea una funzione cont_mosse void di questo tipo
codice:
void cont_mosse(char mappap[][M], int coox, int cooy)
{
if (mappap[coox][cooy] = 'C')
{
mappap[coox][cooy] = 'g';
cont_mosse(mappap, coox, (cooy-1));
cont_mosse(mappap, (coox-1), cooy);
cont_mosse(mappap, (coox+1), cooy);
cont_mosse(mappap, coox, (cooy+1));
}
}
il programma però si blocca prima ancora di entrare nella ricorsione.
il codice completo è questo
codice:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
#define M 15
void riempi_mappa(char mappap[][M]);
void stampa_mappa(char mappap[][M]);
void cont_mosse(char mappap[][M], int coox, int cooy);
int main()
{
srand(time(0));
int i=0;
char mappa[N][M];
riempi_mappa(mappa);
stampa_mappa(mappa);
cont_mosse(mappa, 4, 4);
printf("\n\n");
stampa_mappa(mappa);
_getch();
return 0;
}
void riempi_mappa(char mappap[][M])
{
int i=0, j=0;
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
if (rand() % 2 == 0)
mappap[i][j] = 'C';
else
mappap[i][j] = 'S';
}
}
}
void stampa_mappa(char mappap[][M])
{
int i, j;
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
printf(" %c ", mappap[i][j]);
}
printf("\n\n");
}
}
void cont_mosse(char mappap[][M], int coox, int cooy)
{
if (mappap[coox][cooy] = 'C')
{
mappap[coox][cooy] = 'g';
cont_mosse(mappap, coox, (cooy-1));
cont_mosse(mappap, (coox-1), cooy);
cont_mosse(mappap, (coox+1), cooy);
cont_mosse(mappap, coox, (cooy+1));
}
}
non penso di aver sbagliato ragionamento, cioè se in quella casella c'è una C controlla quella sopra, poi quella sotto, poi quella a destra e a sinistra, e faccio la stessa cosa.