#include #include #include #include #define ANIMAL_NOME_MAX 20 #define ANIMAL_PERGUNTA_MAX 50 struct _no_arvore { char nome_animal[ANIMAL_NOME_MAX]; char pergunta[ANIMAL_PERGUNTA_MAX]; struct _no_arvore *sim, *nao; }; typedef struct _no_arvore NoArvore; typedef NoArvore* Arvore; int perguntaSimOuNao () { int lidos; char resp; printf("(s ou n): "); lidos = scanf(" %c", &resp); if (lidos != 1 || (resp != 'S' && resp != 'N' && resp != 's' && resp != 'n')) { printf("Responda apenas com S ou N! %d %d %c\n", lidos, (int)resp, resp); return perguntaSimOuNao(); //Exagerando um pouco no uso da recursão. Tente fazer iterativo! } return (resp == 'S' || resp == 's'); } void joga (Arvore arv) { int resp, temPergunta; printf("O animal que você está pensando é %s? ", arv->nome_animal); resp = perguntaSimOuNao(); if (resp) { printf ("Ganhei!\n"); return; } temPergunta = arv->sim != NULL; //já tenho uma pergunta pra fazer? variavel apenas por clareza if (temPergunta) { printf("O animal que você pensou %s? ", arv->pergunta); resp = perguntaSimOuNao(); if (resp) return joga(arv->sim); if (arv->nao) return joga(arv->nao); } //vamos entao cadastrar um novo animal printf("Não sei qual animal você pensou. Me diga, que animal é esse?\n>"); NoArvore *no = calloc(1, sizeof(NoArvore)); //note que já coloca NULL nos ponteiros sim e nao int lidos = scanf(" %s", no->nome_animal); assert(lidos > 0); if (!temPergunta) { printf("E o que um(a) %s faz que um(a) %s não faz?\n>", no->nome_animal, arv->nome_animal); lidos = scanf(" %[^\n]", arv->pergunta); assert(lidos > 0); arv->sim = no; } else { arv->nao = no; } printf("Certo, admito derrota!\n"); } int main(int argc, char **argv) { Arvore arv = calloc(1, sizeof(NoArvore)); strncpy(arv->nome_animal, "macaco", ANIMAL_NOME_MAX); do { joga(arv); printf("Quer jogar de novo? "); } while (perguntaSimOuNao()); return EXIT_SUCCESS; }