Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] Scansione matrice char con ricorsione

    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.

  2. #2
    1. non stai controllando di non sforare dai bordi della matrice
    2. nel primo if della cont_mosse hai scritto "=" invece di "==", per cui stai assegnando 'C' a tutte le caselle che visiti (per poi entrare nel corpo dell'if e scriverci sopra 'g').

    Nota che il secondo problema viene segnalato da qualunque compilatore se abiliti i warning, cosa che ti consiglio di fare.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    l'errore era proprio nell'if che non avevo minimamente notato! Grazie mille!
    Per quanto riguarda i bordi non li avevo implementati dato che non mi funzionava in nessun caso.

    PS sai per caso come abilitare i warning su visual studio 2015 ?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.