Programma auto-scontro

di il
21 risposte

Programma auto-scontro

Salve a tutti. È da qualche giorno che mi sto impazzendo su un programma e ad oggi ho perso le speranze. Non riesco proprio a capire come fare. Qualcuno che riesce a risolverlo? Anche dei cenni per capire come muovermi.
Grazie mille in anticipo.
Allegati:
25555_1580ff9fd9251b80c7c8f0476220dbbe.jpg
25555_1580ff9fd9251b80c7c8f0476220dbbe.jpg

21 Risposte

  • Re: Programma auto-scontro

    Ciao!

    Per quanto riguarda la traccia mi è tutto chiaro tranne una cosa: ipotizziamo che un'auto abbia alla sua destra il muro, cosa succede se esce che deve spostarsi a destra? La sua posizione rimane immutata oppure va ripetuta l'estrazione tra sopra, sotto, destra e sinistra?

    Detto questo iniziamo ad occuparci della parte probabilistica. Ci sono vari modi in cui simulare per ogni macchina delle specifiche probabilità, ma credo che la strada più semplice sia quella di associare ad ognuna delle 4 direzioni (DESTRA, SINISTRA, SOPRA, SOTTO) un certo intervallo numerico (ossia due int) che dipende a sua volta dalla probabilità associata alla direzione stessa. Per esempio nel caso della macchina 2:

    DESTRA -> [1;40] che è un intervallo contenente 40 interi
    SINISTRA -> [41;50] che è un intervallo contenente 10 interi
    SOPRA -> [51;65] che è un intervallo contenente 15 interi
    SOTTO -> [66;100] che è un intervallo contenente 35 interi

    a questo punto basta generare un numero casuale tra 1 e 100 e vedere tale numero a quale intervallo appartiene.

    Se qualcosa non ti è chiaro chiedi pure!
  • Re: Programma auto-scontro

    Togliendo di mezzo l'implementazione (no "pappa pronta", ho capito!), potresti provare a seguire una strada di questo tipo:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define W_AUTOPISTA     7
    #define H_AUTOPISTA     7
    #define Q_DIREZIONI     4
    #define Q_AUTO          4
    
    // per le coordinate
    typedef struct {
        int x;
        int y;
    } coo_t;
    
    const char kEtVuota = '.';      // l'etichetta che indica una posizione vuota
    const char kEtCollisione = 'X'; // l'etichetta che indica una collisione
    
    // le etichette che indicano le quattro macchine
    const char kEtAuto[Q_AUTO] = { 'A', 'B', 'C', 'D' };
    
    // le coordinate iniziali delle quattro macchine
    const coo_t kCooIniziali[Q_AUTO] = { {3,0}, {6,3}, {3,6}, {0,3} };
    
    // le probabilita' dell'estrazione delle 4 direzioni, per le 4 macchine
    const int kProbabilita[Q_AUTO][Q_DIREZIONI] = {
        { 30, 30, 30, 10 }, // macchina 1
        { 15, 40, 35, 10 }, // macchina 2
        {  5, 30, 45, 20 }, // macchina 3
        { 25, 20, 25, 30 }  // macchina 4
    };
    
    char ap[H_AUTOPISTA][W_AUTOPISTA]; // la mappa dell'autopista
    
    void inizializza( coo_t *coo ) {
        // 1. inizializzo srand()
        // 2. "azzero" la mappa dell'autopista ap con tutti '.'
        // 3. piazzo le quattro lettere segnaposizione A,B,C e D nella mappa ap
        // 4. imposto in coo le quattro macchina con le loro coordinate iniziali
    }
    
    void mostra_autopista( int collisione ) {
        // 1. visualizzo in console il contenuto della mappa dell'autopista ap
        // 2. se collisione e' diverso da zero, aggiungo il messaggio "Collisione!"
    }
    
    void estrai_movimento( coo_t *coo, const int prob[Q_DIREZIONI] ) {
        // in un ciclo che termina solo con l'estrazione di un movimento valido
        // 1. estraggo a sorte un numero a caso compreso tra 0 e 100
        // 2. verifico in quale intervallo percentuale si trova il valore estratto
        // 3. decido di conseguenza la direzione da prendere
        // 4. controllo di non essere finito fuori dalla mappa ap
        // 5. se sono finito fuori dalla mappa ap ripeto il ciclo "over and over"
    }
    
    int muovi( coo_t *coo ) {
        // 1. chiamo estrai_movimento per farmi dire in coo dove devo andare
        // 2. verifico se c'e' stata una collisione
        // 3. in caso di collisione restituisco 1, altrimenti restituisco 0
    }
    
    void aggiorna_autopista( const coo_t *coo, int collisione ) {
        // 1. "azzero" la mappa dell'autopista ap con tutti '.', per eliminare le
        //    vecchie posizioni delle macchine
        // 2. colloco le etichette A,B,C e D nelle nuove posizioni delle macchine
        // 3. se c'e' stata collisione, verifico dove e colloco il segnaposto 'X'
    }
    
    int main() {
        coo_t coo[Q_AUTO];
        int collisione;
    
        inizializza( coo );
        mostra_autopista(0);
        system( "pause" ); // lo so... a tanti system() non piace
    
        do {
            system( "cls" ); // di nuovo system()! ;)
    
            collisione = muovi( coo );
            aggiorna_autopista( coo, collisione );
            mostra_autopista( collisione );
    
            system( "pause" ); // e ancora una volta...
        } while( !collisione );
    
        return 0;
    }
    
  • Re: Programma auto-scontro

    AldoBaldo ha scritto:


    Togliendo di mezzo l'implementazione (no "pappa pronta", ho capito!), potresti provare a seguire una strada di questo tipo:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define W_AUTOPISTA     7
    #define H_AUTOPISTA     7
    #define Q_DIREZIONI     4
    #define Q_AUTO          4
    
    // per le coordinate
    typedef struct {
        int x;
        int y;
    } coo_t;
    
    const char kEtVuota = '.';      // l'etichetta che indica una posizione vuota
    const char kEtCollisione = 'X'; // l'etichetta che indica una collisione
    
    // le etichette che indicano le quattro macchine
    const char kEtAuto[Q_AUTO] = { 'A', 'B', 'C', 'D' };
    
    // le coordinate iniziali delle quattro macchine
    const coo_t kCooIniziali[Q_AUTO] = { {3,0}, {6,3}, {3,6}, {0,3} };
    
    // le probabilita' dell'estrazione delle 4 direzioni, per le 4 macchine
    const int kProbabilita[Q_AUTO][Q_DIREZIONI] = {
        { 30, 30, 30, 10 }, // macchina 1
        { 15, 40, 35, 10 }, // macchina 2
        {  5, 30, 45, 20 }, // macchina 3
        { 25, 20, 25, 30 }  // macchina 4
    };
    
    char ap[H_AUTOPISTA][W_AUTOPISTA]; // la mappa dell'autopista
    
    void inizializza( coo_t *coo ) {
        // 1. inizializzo srand()
        // 2. "azzero" la mappa dell'autopista ap con tutti '.'
        // 3. piazzo le quattro lettere segnaposizione A,B,C e D nella mappa ap
        // 4. imposto in coo le quattro macchina con le loro coordinate iniziali
    }
    
    void mostra_autopista( int collisione ) {
        // 1. visualizzo in console il contenuto della mappa dell'autopista ap
        // 2. se collisione e' diverso da zero, aggiungo il messaggio "Collisione!"
    }
    
    void estrai_movimento( coo_t *coo, const int prob[Q_DIREZIONI] ) {
        // in un ciclo che termina solo con l'estrazione di un movimento valido
        // 1. estraggo a sorte un numero a caso compreso tra 0 e 100
        // 2. verifico in quale intervallo percentuale si trova il valore estratto
        // 3. decido di conseguenza la direzione da prendere
        // 4. controllo di non essere finito fuori dalla mappa ap
        // 5. se sono finito fuori dalla mappa ap ripeto il ciclo "over and over"
    }
    
    int muovi( coo_t *coo ) {
        // 1. chiamo estrai_movimento per farmi dire in coo dove devo andare
        // 2. verifico se c'e' stata una collisione
        // 3. in caso di collisione restituisco 1, altrimenti restituisco 0
    }
    
    void aggiorna_autopista( const coo_t *coo, int collisione ) {
        // 1. "azzero" la mappa dell'autopista ap con tutti '.', per eliminare le
        //    vecchie posizioni delle macchine
        // 2. colloco le etichette A,B,C e D nelle nuove posizioni delle macchine
        // 3. se c'e' stata collisione, verifico dove e colloco il segnaposto 'X'
    }
    
    int main() {
        coo_t coo[Q_AUTO];
        int collisione;
    
        inizializza( coo );
        mostra_autopista(0);
        system( "pause" ); // lo so... a tanti system() non piace
    
        do {
            system( "cls" ); // di nuovo system()! ;)
    
            collisione = muovi( coo );
            aggiorna_autopista( coo, collisione );
            mostra_autopista( collisione );
    
            system( "pause" ); // e ancora una volta...
        } while( !collisione );
    
        return 0;
    }
    









    Gentilmente può risolvere anche i passaggi che ha numerato e spiegato. Nonostante la spiegazione non riesco ad andare avanti.
    I passaggi del:

    void inizializza
    void mostra_autopista
    void estrai_movimento
    int muovi
    void aggiorna_autopista



    Gliene sarei davvero grato.
    Grazie mille
  • Re: Programma auto-scontro

    Visto che l'esercizio l'ho risolto (se no non avrei potuto dire niente in merito) si tratterebbe giusto di fare un copia-e-incolla, e lo fare volentieri, ma rischierei di fare inquietare gli amministratori del forum, quindi mi astengo. Già così, comunque, ho risposto in parte al tuo quesito, visto che chiedevi di darti "dei cenni per capire come muovermi". Spezzare un problema generale in tanti sottoproblemi particolari è già una bella traccia.

    P.S. Per puro divertimento, ho fatto anche una versione grafica del programma:
    https://dopiest-curtains.000webhostapp.com/autoscontri
  • Re: Programma auto-scontro

    AldoBaldo ha scritto:


    Visto che l'esercizio l'ho risolto (se no non avrei potuto dire niente in merito) si tratterebbe giusto di fare un copia-e-incolla, e lo fare volentieri, ma rischierei di fare inquietare gli amministratori del forum, quindi mi astengo. Già così, comunque, ho risposto in parte al tuo quesito, visto che chiedevi di darti "dei cenni per capire come muovermi". Spezzare un problema generale in tanti sottoproblemi particolari è già una bella traccia.

    P.S. Per puro divertimento, ho fatto anche una versione grafica del programma:
    https://dopiest-curtains.000webhostapp.com/autoscontri



    Può aiutarmi in privato se per lei non è un problema
    La ringrazio davvero tanto.
    Buona giornata
  • Re: Programma auto-scontro

    Entix ha scritto:


    Può aiutarmi in privato
    Non funziona così ... la discussione dovrebbe continuare nel forum ...

    Aldo ... questo è il risultato del codice pappa pronta ...
  • Re: Programma auto-scontro

    Allora se gentilmente qualcuno è in grado di risolvere i punti spiegati sopra gliene sarei grato.
  • Re: Programma auto-scontro

    Qui nessuno è obbligato a "risolvere i punti". In un forum si danno consigli e, in genere, per una questione alla volta.

    La prima questione qual è? Cosa non sai fare esattamente?

    Prendi una funzione ed analizzane le problematiche ... comincia da Inizializza .. ti è stato suggerito
    
    void inizializza( coo_t *coo ) {
        // 1. inizializzo srand()
        // 2. "azzero" la mappa dell'autopista ap con tutti '.'
        // 3. piazzo le quattro lettere segnaposizione A,B,C e D nella mappa ap
        // 4. imposto in coo le quattro macchina con le loro coordinate iniziali
    }
    
    Tu cosa proponi per i punti spiegati da Aldo?
  • Re: Programma auto-scontro

    oregon ha scritto:


    Qui nessuno è obbligato a "risolvere i punti". In un forum si danno consigli e, in genere, per una questione alla volta.

    La prima questione qual è? Cosa non sai fare esattamente?

    Prendi una funzione ed analizzane le problematiche ... comincia da Inizializza .. ti è stato suggerito
    
    void inizializza( coo_t *coo ) {
        // 1. inizializzo srand()
        // 2. "azzero" la mappa dell'autopista ap con tutti '.'
        // 3. piazzo le quattro lettere segnaposizione A,B,C e D nella mappa ap
        // 4. imposto in coo le quattro macchina con le loro coordinate iniziali
    }
    
    Tu cosa proponi per i punti spiegati da Aldo?



    Io non sto obbligando nessuno a risolvere i punti. Sto solo chiedendo se gentilmente c'è qualcuno in grado di risolverli. Tutto qua...se non c'è quel qualcuno nessun problema.
  • Re: Programma auto-scontro

    oregon ha scritto:


    Qui nessuno è obbligato a "risolvere i punti". In un forum si danno consigli e, in genere, per una questione alla volta.

    La prima questione qual è? Cosa non sai fare esattamente?

    Prendi una funzione ed analizzane le problematiche ... comincia da Inizializza .. ti è stato suggerito
    
    void inizializza( coo_t *coo ) {
        // 1. inizializzo srand()
        // 2. "azzero" la mappa dell'autopista ap con tutti '.'
        // 3. piazzo le quattro lettere segnaposizione A,B,C e D nella mappa ap
        // 4. imposto in coo le quattro macchina con le loro coordinate iniziali
    }
    
    Tu cosa proponi per i punti spiegati da Aldo?



    Sono alle prime armi ancora e quindi non sono in grado di risolverlo. Ho chiesto se gentilmente qualcuno poteva farlo cosicché potessi capire dal programma svolto.
  • Re: Programma auto-scontro

    Ma non hai letto il regolamento del forum in cui questa richiesta è "vietata" !
  • Re: Programma auto-scontro

    oregon ha scritto:


    Ma non hai letto il regolamento del forum in cui questa richiesta è "vietata" !

    Ho letto il regolamento e non dice che è vietata. Dice che sono vietate le richieste di svolgimeto di programmi ai fini illegali.
  • Re: Programma auto-scontro

    8. Discussioni e post non ammessi
    Oltre a rispettare la civile convivenza e quanto scritto nel regolamento di questo forum ci teniamo a ricordare che non sono ammesse le seguenti tipologie di messaggi:
    ...
    Richieste di aiuto per esami scolastici
    Non è permessa la richiesta di aiuto e collaborazioni atte a violare regole e normative in materia scolastica.

    ...
    Richiedere la "pappa pronta"
    Evitare di richiedere la così detta "pappa pronta". In un forum prima di tutto si aiuta l'utente, indirizzandolo sulla soluzione migliore. Gli spezzoni di codice che vengono dati non sono da intendere come soluzione definitiva, ma un esempio su come procedere.
  • Re: Programma auto-scontro

    Entix ha scritto:


    oregon ha scritto:


    Qui nessuno è obbligato a "risolvere i punti". In un forum si danno consigli e, in genere, per una questione alla volta.

    La prima questione qual è? Cosa non sai fare esattamente?

    Prendi una funzione ed analizzane le problematiche ... comincia da Inizializza .. ti è stato suggerito
    
    void inizializza( coo_t *coo ) {
        // 1. inizializzo srand()
        // 2. "azzero" la mappa dell'autopista ap con tutti '.'
        // 3. piazzo le quattro lettere segnaposizione A,B,C e D nella mappa ap
        // 4. imposto in coo le quattro macchina con le loro coordinate iniziali
    }
    
    Tu cosa proponi per i punti spiegati da Aldo?



    Sono alle prime armi ancora e quindi non sono in grado di risolverlo. Ho chiesto se gentilmente qualcuno poteva farlo cosicché potessi capire dal programma svolto.



    Va bene...allora come inizializzo srand() ????
Devi accedere o registrarti per scrivere nel forum
21 risposte