Stanze per gioco testuale in C

di il
16 risposte

Stanze per gioco testuale in C

Buonasera a tutti,
Sto da poco studiando il linguaggio C, quindi perdonate la mia poca conoscenza.
Mi servirebbe (se qualche anima pia può e vuole spiegarmi) in che modo posso progettare in C delle “stanze” per un gioco testuale.
Faccio un esempio per rendere più chiaro il concetto:
La schermata di partenza del gioco descrive la stanza principale, usandola come punto di partenza l’intento sarebbe (grazie a dei comandi direzionali, ad esempio nord, sud ecc, muoversi in altre stanze).
Il tutto ovviamente permettendo di tornare nelle caselle già visitate se i comandi digitati ti consentano di “ripassarci”.
Mi manca proprio capire il ragionamento ( e quindi il codice) che devo far fare alla macchina per creare una serie di stanze dove far “girare” il giocatore.
Non so se sono stato chiaro (ma ci ho provato). Grazie a chi mi aiuterà e perdonate l’ignorwnza.
Grazie

16 Risposte

  • Re: Stanze per gioco testuale in C

    C'è un linguaggio di programmazione apposito per i giochi testuali
    https://it.wikipedia.org/wiki/Infor
    https://ganelson.github.io/inform-website
  • Re: Stanze per gioco testuale in C

    Weierstrass ha scritto:


    C'è un linguaggio di programmazione apposito per i giochi testuali
    https://it.wikipedia.org/wiki/Infor
    https://ganelson.github.io/inform-website
    Ti ringrazio, ma intendo farlo il “c”.
  • Re: Stanze per gioco testuale in C

    Ciao, ma intendi creare un giochino visualizzato tramite terminale o utilizzando qualche libreria grafica?
  • Re: Stanze per gioco testuale in C

    In genere questo tipo Di giochi gira sul terminale dedicato, ma di base gira anche senza grafica.
    Allego degli esempi


    Il gioco viene riprodotto nella finestra
    Grande, con il terminale dedicato viene mostrata una piccola mappa grafica aggiuntiva, ma il gioco girerebbe anche senza di quella.
    Facendo un passo indietro vorrei creare il codice senza grafica (per ora).
  • Re: Stanze per gioco testuale in C

    Non so bene cosa preveda un gioco del genere, ma da quello che ho capito potresti limitarti a salvare i dati delle singole stanze in appositi "contenitori", e nel momento in cui c'è un cambio di stanza potresti svuotare la console e stampare la nuova stanza.

    Se poi spieghi quale difficoltà stai incontrando di preciso, magari possiamo esserti maggiormente d'aiuto.
  • Re: Stanze per gioco testuale in C

    Nippolo ha scritto:


    Non so bene cosa preveda un gioco del genere, ma da quello che ho capito potresti limitarti a salvare i dati delle singole stanze in appositi "contenitori", e nel momento in cui c'è un cambio di stanza potresti svuotare la console e stampare la nuova stanza.

    Se poi spieghi quale difficoltà stai incontrando di preciso, magari possiamo esserti maggiormente d'aiuto.
    Esatto, vorrei fare questo,
    Qualche consiglio su come compilare questo “contenitori”?
  • Re: Stanze per gioco testuale in C

    Bisogna però prima capire in cosa consistono queste "stanze"...


    P.S.
    Conosci le struct?
  • Re: Stanze per gioco testuale in C

    Ipotizziamo di fare un gioco “polizesco” testuale ambientato in una piccola casa dove lo scopo sarebbe quello di trovare indizi.
    Praticamente dovrebbero avere (prendendo per esempio un giochino ambientato un una casa di 4 stanze le stanze disposte in questo modo:
    Disponiamo ad esempio le quattro stanze in un quadrato che contiene le quattro stanze:
    1 Una cucina accogliente (collocata come prima stanza in alto a sinistra )
    2 Una camere da letto (a fianco quindi in alto a sinistra
    3 Uno Studio (sotto, quindi in basso a destra)
    4 un giardino (in basso a sinistra)

    Tramite dei comandi pre impostati (esempio : nord,sud,era,ovest) il giocatore dovrebbe muoversi
    Nelle varie stanze.


    Verrebbe per esempio così (faccio un esempio):
    Parte il gioco

    Una Cucina Accogliente
    Ti trovi in una cucina accogliente, noti il pavimento usurato in legno, come la mobilia che ti sembra abbastanza datata, l’odore di cibo appena cucinato giunge alle tue narici.
    Noti a terra delle impronte di sangue.

    *il giocatore digita est*
    Ti muovi verso Est

    Una Camera da letto
    Ti trovi in una luminosa camera da letto, noti un grande letto disfatto, inoltre moto la finestra rotta con pezzi di vetro ovunque.

    *il giocatore digita est*
    Non puoi andare in quella direzione c’è un muro
    *il giocatore digita sud*

    Uno studio
    Ti trovi in uno studi, noti un tagliacarte sporco di sangue sulla scrivania, per il resto ti sembra tutto in ordine.

    *il giocatore digita nord*
    Ti muovi verso nord

    Una Camera da letto
    Ti trovi in una luminosa camera da letto, noti un grande letto disfatto, inoltre moto la finestra rotta con pezzi di vetro ovunque.

    Ecc ecc.

    Il giocatore dovrebbe girare a suo piacimento tutte le volte che vuole nelle stanze.

    Spero di essere stato il più chiaro possibile.
  • Re: Stanze per gioco testuale in C

    Devi modellare la "realtà" (stanze, oggetti, personaggi) con delle strutture dati im cui riporti i dati specifici.

    Poi devi allocare il numero giusto di strutture che ti servono (un array di "strutture stanza", ad esempio) e le gestisci a seconda delle situazioni.

    Ovviamente è una indicazione generale perché dovrai cominciare ad affrontare i singoli problemi e risolverli magari chiedendo dove ti fermi.
  • Re: Stanze per gioco testuale in C

    Ho scritto qualche riga di codice, magari puoi prendere qualche spunto:
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    
    #define GIALLO  14
    #define ROSSO   12
    #define DEFAULT 7
    
    #define B 254 // CARATTERE "BLOCCO"
    #define V 179 // CARATTERE "|"
    #define O 45  // CARATTERE "-"
    #define D 47  // CARATTERE "/"
    #define S 92  // CARATTERE "\"
    #define X 120 // CARATTERE "x"
    
    #define M 6
    #define N 18
    
    typedef struct stanza_
    {
        char *nome;
        unsigned int i;
        unsigned int j;
    }   stanza;
    
    void cambia_colore(int colore)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colore);
    }
    
    void stampa_mappa(int m[2 * M + 1][2 * M + 1], stanza *p)
    {
        for(unsigned int i = 0; i < 2 * M + 1; ++i)
        {
            for(unsigned int j = 0; j < 2 * M + 1; ++j)
            {
                cambia_colore(m[i][j] != B ? GIALLO : (i == p->i && j == p->j ? ROSSO : DEFAULT));
                printf("%c", m[i][j] ? m[i][j] : ' ');
            }
            printf("\n");
        }
        cambia_colore(DEFAULT);
    }
    
    int main()
    {
        int m[2 * M + 1][2 * M + 1] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                       {0, 0, 0, B, O, B, 0, 0, 0, B, 0, 0, 0},
                                       {0, 0, D, 0, 0, 0, S, 0, 0, V, 0, 0, 0},
                                       {0, B, 0, 0, 0, 0, 0, B, O, B, O, B, 0},
                                       {0, V, 0, 0, 0, 0, D, 0, S, 0, D, 0, 0},
                                       {0, B, O, B, 0, B, 0, 0, 0, B, 0, 0, 0},
                                       {0, V, X, 0, 0, 0, 0, 0, 0, 0, S, 0, 0},
                                       {0, B, 0, B, 0, 0, 0, 0, 0, 0, 0, B, 0},
                                       {0, 0, S, 0, 0, 0, 0, 0, 0, 0, D, 0, 0},
                                       {0, 0, 0, B, 0, B, 0, 0, 0, B, 0, 0, 0},
                                       {0, 0, 0, 0, 0, 0, S, 0, D, 0, 0, 0, 0},
                                       {0, 0, 0, 0, 0, 0, 0, B, 0, 0, 0, 0, 0},
                                       {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; //MAPPA
    
        stanza v[N] = {{"S1" ,  1,  3},
                       {"S2" ,  1,  5},
                       {"S3" ,  1,  9},
                       {"S4" ,  3,  1},
                       {"S5" ,  3,  7},
                       {"S6" ,  3,  9},
                       {"S7" ,  3, 11},
                       {"S8" ,  5,  1},
                       {"S9" ,  5,  3},
                       {"S10",  5,  5},
                       {"S11",  5,  9},
                       {"S12",  7,  1},
                       {"S13",  7,  3},
                       {"S14",  7, 11},
                       {"S15",  9,  3},
                       {"S16",  9,  5},
                       {"S17",  9,  9},
                       {"S18", 11,  7}}; //VETTORE STANZE
    
        stanza *p = &v[2]; //STANZA CORRENTE
    //-----------------------------------------------------------------------------------
        stanza *m2[2 * M + 1][2 * M + 1] = {NULL};
        for(unsigned int k = 0; k < N; ++k)
        {
            m2[v[k].i][v[k].j] = &v[k];
        }
        char str[200];
        while(1)
        {
            stampa_mappa(m, p);
            printf(" SEI NELLA STANZA %s -> ", p->nome);
            gets(str);
            if(!strcmp(str, "S"))
            {
                if(m[p->i + 1][p->j])
                {
                    p = m2[p->i + 2][p->j];
                }
            }
            else if(!strcmp(str, "E"))
            {
                if(m[p->i][p->j + 1])
                {
                    p = m2[p->i][p->j + 2];
                }
            }
            else if(!strcmp(str, "N"))
            {
                if(m[p->i - 1][p->j])
                {
                    p = m2[p->i - 2][p->j];
                }
            }
            else if(!strcmp(str, "O"))
            {
                if(m[p->i][p->j - 1])
                {
                    p = m2[p->i][p->j - 2];
                }
            }
            else if(!strcmp(str, "SE"))
            {
                if(m[p->i + 1][p->j + 1] && m[p->i + 1][p->j + 1] != D)
                {
                    p = m2[p->i + 2][p->j + 2];
                }
            }
            else if(!strcmp(str, "NE"))
            {
                if(m[p->i - 1][p->j + 1] && m[p->i - 1][p->j + 1] != S)
                {
                    p = m2[p->i - 2][p->j + 2];
                }
            }
            else if(!strcmp(str, "NO"))
            {
                if(m[p->i - 1][p->j - 1] && m[p->i - 1][p->j - 1] != D)
                {
                    p = m2[p->i - 2][p->j - 2];
                }
            }
            else if(!strcmp(str, "SO"))
            {
                if(m[p->i + 1][p->j - 1] && m[p->i + 1][p->j - 1] != S)
                {
                    p = m2[p->i + 2][p->j - 2];
                }
            }
            else if(!strcmp(str, "ESCI"))
            {
                break;
            }
            system("CLS");
        }
        return 0;
    }
    
    I comandi validi, come si può vedere dal codice, sono: S, SE, E, NE, N, NO, O, SO, ESCI.

    Se hai qualche dubbio chiedi pure.
  • Re: Stanze per gioco testuale in C

    Grazie mille gentilissimo,
    Probabilmente per errore mio non mi parte.
    Ho copiato il codice uguale sul compilatore Devc++
    Purtroppo quando o per in C mi da questo errore

    Mentre in c++ parte ma digito i comandi (s,n,o) e non succede niente.
    Ovviamente a me servirebbe operare in C.
  • Re: Stanze per gioco testuale in C

    Scrivi

    unsigned int i;
    for(i=0; ....

    Ma sei sicuro di saper programmare in C?
    Se non conosci neanche le basi, sarà dura completare un progetto completo.
  • Re: Stanze per gioco testuale in C

    Sto imparando, devo dire che il codice gentilmente fornito da Nippolo presenta delle cose che non so, e sono felice di imparare.
    So che sarà difficile, ma sto davvero imparando molto, e credo sia l’unica cosa che conta, almeno per me.
  • Re: Stanze per gioco testuale in C

    Il compilatore oltre a dirti "l'errore", ti sta dicendo anche come risolverlo. Nel caso specifico o fai come detto da @oregon o abiliti il flag -std=c99 o -std=c11 presente nelle opzioni del compilatore.

    Ilterribile ha scritto:


    Mentre in c++ parte ma digito i comandi (s,n,o) e non succede niente.
    Per forza, utilizzi il minuscolo al posto del maiuscolo.
Devi accedere o registrarti per scrivere nel forum
16 risposte