#include #include #include #include #define MAX_STRING 500 typedef char string[ MAX_STRING + 1 ]; typedef enum { domanda, risposta } tipo_nodo; typedef struct s_nodo { tipo_nodo tipo; union { string risposta; struct { string testo_domanda; struct s_nodo *si, *no; } domanda; } contenuto; } nodo; char leggi_si_no() { char risp; do { risp = getchar(); risp = tolower( risp ); } while ( risp != 's' && risp != 'n' ); return risp; } nodo *cerca( nodo *da ) { nodo *prev = NULL, *nuovo, *nuovo_r, *start; string risposta_giusta, domanda_giusta; char risp, last_risp; start = da; while ( da->tipo == domanda ) { printf( "%s? (s/n) ", da->contenuto.domanda.testo_domanda ); prev = da; if ( ( last_risp = leggi_si_no() ) == 's' ) da = da->contenuto.domanda.si; else da = da->contenuto.domanda.no; } printf( "Secondo me stai pensando a un %s\n", da->contenuto.risposta ); printf( "Ho indovinato? (s/n) " ); if ( leggi_si_no() == 'n' ) { printf( "A che cosa pensavi? " ); scanf( " %[^\n]", risposta_giusta ); printf( "Fammi una domanda che distingua un %s da un %s: ", risposta_giusta, da->contenuto.risposta ); scanf( " %[^\n]", domanda_giusta ); printf( "Qual e' la risposta corretta a questa domanda per un %s? (s/n) ", risposta_giusta ); risp = leggi_si_no(); nuovo = (nodo *)malloc( sizeof( nodo ) ); nuovo->tipo = domanda; strcpy( nuovo->contenuto.domanda.testo_domanda, domanda_giusta ); nuovo_r = (nodo *)malloc( sizeof( nodo ) ); nuovo_r->tipo = risposta; strcpy( nuovo_r->contenuto.risposta, risposta_giusta ); if ( risp == 's' ) { nuovo->contenuto.domanda.si = nuovo_r; nuovo->contenuto.domanda.no = da; } else { nuovo->contenuto.domanda.no = nuovo_r; nuovo->contenuto.domanda.si = da; } if ( prev != NULL ) { if ( last_risp == 's' ) prev->contenuto.domanda.si = nuovo; else prev->contenuto.domanda.no = nuovo; return start; } else return nuovo; } else return start; } void salva( FILE *f, nodo *root ) { if ( root->tipo == risposta ) fprintf( f, "R%s\n", root->contenuto.risposta ); else { fprintf( f, "D%s\n", root->contenuto.domanda.testo_domanda ); salva( f, root->contenuto.domanda.si ); salva( f, root->contenuto.domanda.no ); } } nodo *leggi( FILE *f ) { string riga; nodo *res; res = (nodo *)malloc( sizeof( nodo ) ); fscanf( f, " %[^\n]", riga ); if ( riga[ 0 ] == 'R' ) { res->tipo = risposta; strcpy( res->contenuto.risposta, riga + 1 ); } else { res->tipo = domanda; strcpy( res->contenuto.domanda.testo_domanda, riga + 1 ); res->contenuto.domanda.si = leggi( f ); res->contenuto.domanda.no = leggi( f ); } return res; } int main( int argc, char **argv ) { nodo *root; char risp; FILE *f; if ( argc == 1 ) { root = (nodo *)malloc( sizeof( nodo ) ); root->tipo = risposta; strcpy( root->contenuto.risposta, "cane" ); } else { root = leggi( f = fopen( argv[ 1 ], "r" ) ); fclose( f ); } do { printf( "Vuoi giocare? (s/n) " ); risp = leggi_si_no(); if ( risp == 's' ) root = cerca( root ); } while ( risp == 's' ); f = fopen( argc == 1? "dump" : argv[ 1 ], "w" ); salva( f, root ); fclose( f ); return 0; }