#include #include #include #include #define ANIMAL_INFO_MAX 50 struct _no_arvore { char nome_ou_pergunta[ANIMAL_INFO_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, folha; folha = arv->sim == NULL && arv->nao == NULL; if (folha) { printf("O animal que você está pensando é %s? ", arv->nome_ou_pergunta); resp = perguntaSimOuNao(); if (resp) { printf ("Ganhei!\n"); return; } //eh um animal que nunca vi antes e acabaram as minhas perguntas 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_ou_pergunta); assert(lidos > 0); NoArvore *noAnt = calloc(1, sizeof(NoArvore)); strncpy(noAnt->nome_ou_pergunta, arv->nome_ou_pergunta, ANIMAL_INFO_MAX); arv->nome_ou_pergunta[0] = 0; printf("E o que um(a) %s faz que um(a) %s não faz?\n>", no->nome_ou_pergunta, noAnt->nome_ou_pergunta); lidos = scanf(" %[^\n]", arv->nome_ou_pergunta); assert(lidos > 0); arv->sim = no; arv->nao = noAnt; printf("Certo, admito derrota!\n"); } else { printf("O animal que você pensou %s? ", arv->nome_ou_pergunta); joga(perguntaSimOuNao() ? arv->sim : arv->nao); } } int main(int argc, char **argv) { Arvore arv = calloc(1, sizeof(NoArvore)); strncpy(arv->nome_ou_pergunta, "macaco", ANIMAL_INFO_MAX); printf("Pense num animal. Pressione enter quando estiver pronto."); getchar(); do { joga(arv); printf("Quer jogar de novo? "); } while (perguntaSimOuNao()); return EXIT_SUCCESS; }