Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    navigazione testuale in C

    vorrei inserire nel mio RPG testuale una navigazione testuale..
    cioè:
    adesso è strutturato osì:
    - narrazione degli eventi
    - scelte

    PRATICAMENTE il gioco si riduce ad utilizzaretutti i num ui in quellasezione è assegnata unafunzione e andare avanti...

    io vorrei nn mettere quello che si può fare ma lasiare interpretare al giocatore...

    cioè

    COSA FAI?

    se si scrive parlo con TIZIO parte il dialogo
    se si scrive raccolgo OGGETTO si raccogliel'oggetto...

    come sifa?

    ty1000
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  2. #2
    l'avevo fatto da piccolo con QBasic...io avevo fatto dicersi

    "case" nei quali se la frase conteneve certe parole chiavi ( and and and ) si intendeva una scelta... infatti dovresti fare qualcosa che cerca di interpretare quanto scritto ( standardizzandolo sarebbe riduttivo ) a seconda delle perole chiavi

  3. #3
    avevo fatto DIVERSI "case"

    e

    PAROLE chiavi

    scrivo come uno struzzo

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    ti spegheresti meglio?

    devi usare swicht?
    e come?

    io voglio ke scrivendo una parolaq o una frase si attivi una certa parte del gioco...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Puui usare una struttura in cui memorizzare per ogni stringa del menu, la funzione da eseguire...

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int fai_questo(void * args);
    int fai_quello(void * args);
    int esci(void * args);
    int help(void*args);
    
    typedef struct _MAP
    {
    	char * key;
    	int (* trigger )(void*args);
    } MAP;
    
    
    MAP Menu[] = {
    	{"opzione1", fai_questo}, 
    	{"opzione2", fai_quello},
    	{"aiuto", help},
    	{"esci", esci}
    };
    
    
    int fai_questo(void * args)
    {
    	printf("ho fatto questo\n");
    	return 0;
    }
    
    int fai_quello(void * args)
    {
    	printf("ho fatto quello\n");
    	return 0;
    }
    
    int esci(void * args)
    {
    	exit(0);
    }
    
    int help(void*args)
    {
    	unsigned i, nelem = sizeof(Menu) / sizeof(MAP);
    	printf ("==================\n"
    	        "Elenco dei comandi\n"
    	        "==================\n");
    	for(i=0; i<nelem; ++i)
    		{
    			printf("%s\n", Menu[i].key);
    		}
    	printf ("\n");
    	return 0;
    }
    
    int main()
    {
    	char buffer[1024];
    	unsigned nelem, i;	
    	
    	nelem = sizeof(Menu) / sizeof(MAP);
    
    	help(NULL);
    
    	while(1)
    	{
    		scanf("%1024s", buffer);
    		for(i=0; i<nelem; ++i)
    		{
    			if(!strcmp(buffer, Menu[i].key))
    			{
    				Menu[i].trigger(NULL);
    				break;
    			}
    		}
    	}
    }

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Andrea Simonassi
    Puui usare una struttura in cui memorizzare per ogni stringa del menu, la funzione da eseguire...

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int fai_questo(void * args);
    int fai_quello(void * args);
    int esci(void * args);
    int help(void*args);
    
    typedef struct _MAP
    {
    	char * key;
    	int (* trigger )(void*args);
    } MAP;
    
    
    MAP Menu[] = {
    	{"opzione1", fai_questo}, 
    	{"opzione2", fai_quello},
    	{"aiuto", help},
    	{"esci", esci}
    };
    
    
    int fai_questo(void * args)
    {
    	printf("ho fatto questo\n");
    	return 0;
    }
    
    int fai_quello(void * args)
    {
    	printf("ho fatto quello\n");
    	return 0;
    }
    
    int esci(void * args)
    {
    	exit(0);
    }
    
    int help(void*args)
    {
    	unsigned i, nelem = sizeof(Menu) / sizeof(MAP);
    	printf ("==================\n"
    	        "Elenco dei comandi\n"
    	        "==================\n");
    	for(i=0; i<nelem; ++i)
    		{
    			printf("%s\n", Menu[i].key);
    		}
    	printf ("\n");
    	return 0;
    }
    
    int main()
    {
    	char buffer[1024];
    	unsigned nelem, i;	
    	
    	nelem = sizeof(Menu) / sizeof(MAP);
    
    	help(NULL);
    
    	while(1)
    	{
    		scanf("%1024s", buffer);
    		for(i=0; i<nelem; ++i)
    		{
    			if(!strcmp(buffer, Menu[i].key))
    			{
    				Menu[i].trigger(NULL);
    				break;
    			}
    		}
    	}
    }


    lo commenteresti x favore?
    nn sono un esperto...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Ricordami di farlo lunedi, stasera purtroppo non posso...

    Ciao.

  8. #8
    Allora, per capire questo codice commentato bisogna che tu sappia la differenza tra dichiarazione e definizione, conosca i puntatori a funzione, sappia cosa sia una struct, sappia cosa sia un array, sappia cosa sia una variabile globale, sappia cosa sia l'inizializzazione statica.

    Se non conosci qualcuna di queste definizioni chiedi, è molto utile conoscerle, soprattutto parlando tra programmatori (d'altronde quando esci con gli amici o con la ragazza avrai poche occasioni di parlare di puntatori o di strutture )

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /*
    QUA SOTTO [B]DICHIARO[B] LE FUZIONI CHE RISPONDONO 
    ALL'EVENTO RICHIAMATO DALL'UTENTE
    
    se ad esempio l'utente scrive "aiuto" viene richiamata
    la funzione help.
    */
    int fai_questo(void * args);
    int fai_quello(void * args);
    int esci(void * args);
    int help(void*args);
    
    /*
    	Siccome in C non esistono nella libreria array associativi, 
    	mi creo una struttura in cui memorizzare la corrispondenza
    	tra il comando dell'utente e la funzione da fare partire 
    	in risposta al comando
    
    	ad esempio 
    	
    	MAP.key <- "aiuto"
    	MAP.trigger <- help()
    
    	Se l'utente digita "aiuto" il programma saprà
    	di dovere fare partire la funzione help
    */
    
    typedef struct _MAP
    {
    	/*parola chiave del menu*/
    	char * key;
    	/*puntatore alla funzione da lanciare*/
    	int (* trigger )(void*args);
    } MAP;
    
    
    /*
    	Dichiaro una variabile globale di tipo array di MAP
    	e la inizializzo staticamente mappando i nomi dei comandi
    	con le funzioni da lanciare in risposta ai comandi 
    
    	e la chiamo Menu
    */
    
    MAP Menu[] = {
    	{"opzione1", fai_questo}, 
    	{"opzione2", fai_quello},
    	{"aiuto", help},
    	{"esci", esci}
    };
    
    
    /* +++++++++++++++++++++++++++++++++
    
    DEFINIZIONE HANDLER DI EVENTO
    
    QUA SOTTO [B]DEFINISCO[B] LE FUZIONI CHE RISPONDONO 
    ALL'EVENTO RICHIAMATO DALL'UTENTE
    
    se ad esempio l'utente scrive "aiuto" viene richiamata
    la funzione help.
    */
    int fai_questo(void * args)
    {
    	printf("ho fatto questo\n");
    	return 0;
    }
    
    int fai_quello(void * args)
    {
    	printf("ho fatto quello\n");
    	return 0;
    }
    
    int esci(void * args)
    {
    	exit(0);
    }
    
    int help(void*args)
    {
    	unsigned i, nelem = sizeof(Menu) / sizeof(MAP);
    	printf ("==================\n"
    	        "Elenco dei comandi\n"
    	        "==================\n");
    	for(i=0; i<nelem; ++i)
    		{
    			printf("%s\n", Menu[i].key);
    		}
    	printf ("\n");
    	return 0;
    }
    
    /* +++++++++++++++++++++++++++
    	FINE DEFINIZIONE HANDLER DI EVENTO
    */
    
    
    int main()
    {
    	/*dichiaro uno spazio in memoria dove contenere
    	max 1024 caratteri digitati alla tastiera*/
    	char buffer[1024]; 
    	/*
    	nelem:= numero di elementi nell'array Menu
    	i:= contatore nel ciclo for
    	*/
    	unsigned nelem, i;	
    	
    	/*
    	calcolo quanti elementi ci sono in Menu
    
    	siccome sizeof restituisce la dimensione in byte, per sapere
    	quanti elementi ci sono in Menu devo dividere la sua dimensione
    	in byte per la dimensione in byte di un singolo elemento, cioè
    	la dimensione in byte di MAP
    	*/
    	nelem = sizeof(Menu) / sizeof(MAP); 
    
    	/*
    		stampa lo schermo di help
    	*/
    	help(NULL);
    
    	/*
    		ciclo infinito
    	*/
    	while(1)
    	{
    		/*leggi max 1023 caratteri da input (per evitare stack overflow)
    		  e inseriscili nella variabile buffer.
    		*/
    		scanf("%1023s", buffer);
    		/*
    			per ogni elemento del MENU
    		*/
    		for(i=0; i<nelem; ++i)
    		{
    			/*
    				strcmp(stringa1, stringa2) restituisce 0 se due 
    				stringhe sono uguali.
    
    				per cui !strcmp(stringa1, stringa2) restituisce non zero 
    				se due stringhe sono uguali, per cui, siccome l'if viene
    				eseguito quando l'espressione tra parentesi è non zero,
    				significa che il corpo dell'if viene eseguito solo se
    				le due stringhe sono uguali.
    
    				Nella fattispecie confronto l'i-esima parola chiave del 
    				menu, con la stringa letta da tastiera
    			*/
    			if(!strcmp(buffer, Menu[i].key))
    			{
    				/*
    				   avendo trovato una parola chiave, lancio il comando
    				   corrispondente (che è il comando i-esimo.
    				*/
    				Menu[i].trigger(NULL);
    				/*esce dal ciclo for, dal momento che ha gia trovato
    				  il risultato.
    				*/
    				break;
    			}
    		}
    	}
    }

  9. #9
    geniale nella sua semplicità.
    Complimenti Andrea
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  10. #10
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    grazie!!!

    adesso me lo studio un poco...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.