Busqué en Google "código 20q" y encontré esto: http://mosaic.cnfolio.com/B142LCW2008A197
Esta versión es solo para animales, pero las 20 preguntas reales probablemente tengan un algoritmo similar.
Aquí hay una descripción general rápida del código que vinculé:
hay varias respuestas diferentes codificadas en el programa. Luego se les asignan varios atributos VERDADERO o FALSO:
#define ANIMALS_LIST "daddylonglegs bee penguin eagle giraffe octopus tiger elephant jellyfish bull \nparrot dolphin python crocodile cat leopard monkey zebra sheep rat \nowl spider frog polarbear snail tortoise rabbit salmon rhino fox"
#define MAMMALS "0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1"
#define FLYING_ANIMALS "1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
#define WATER_ANIMALS "0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0"
#define BEAK "0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0"
...
Como puede ver, una abeja no es un mamífero pero sí vuela, etc.
Hay una matriz para cada grupo:
int mammals[ TOTAL_ANIMALS ] = { 0 };
int flying_animals[ TOTAL_ANIMALS ] = { 0 };
int water_animals[ TOTAL_ANIMALS ] = { 0 };
...
Cuando se hace cada pregunta:
askUserQuestion( guesses, "\nQuestion %d: Is your animal a mammal? \n", mammals );
El programa analiza la definición de la categoría apropiada y rastrea qué animal es el que probablemente esté pensando en función de los valores VERDADERO o FALSO y su respuesta Sí o No a la pregunta.
Esto se hace en:
void askUserQuestion( int guessNumber, char* question, int* animalData );