Я переглянув "код 20q" і знайшов це: http://mosaic.cnfolio.com/B142LCW2008A197
Ця версія призначена лише для тварин, але власне 20 запитань, мабуть, мають подібний алгоритм.
Ось короткий огляд коду, який я зв'язав:
Є кілька різних відповідей, які важко закодовані в програму. Потім їм присвоюється кілька TRUE або FALSE атрибутів:
#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"
...
Як ви бачите, бджола не ссавець, але вона літає і т.д.
Для кожної групи є масив:
int mammals[ TOTAL_ANIMALS ] = { 0 };
int flying_animals[ TOTAL_ANIMALS ] = { 0 };
int water_animals[ TOTAL_ANIMALS ] = { 0 };
...
Коли кожне запитання задається:
askUserQuestion( guesses, "\nQuestion %d: Is your animal a mammal? \n", mammals );
Програма вивчає визначення відповідної категорії та відстежує, яка тварина, швидше за все, є тією, про яку ви думаєте, виходячи зі значення ІСТИНА або ЛІЖНЯ та ваші введені відповіді "Так" чи "ні" на питання.
Це робиться в:
void askUserQuestion( int guessNumber, char* question, int* animalData );