##############################################
# Guess Who? #
# No Copyright by Yserbius #
# a work that I hope my boss doesn't see #
# #
##############################################
import random
#number of characteristics
char_num = 13
#number of cards (people)
card_num = 20
#minimal number of characteristics on a card
floor = 2
#maximum characteristics on a card
ceiling = 3
#number of characteristics to distribute
use = 5
#a list of lists. Each item represents a card. The items in the card are the characteristics
card_char = []
#build deck
for i in range(card_num):
card_char.append([]) #initialize the cards to zero
#populate the deck
for i in range(char_num): #for each characteristic
for j in range(use): #max number of times a characteristic can be used
card_full = False
times_around = 0
#cycle till we hit a card that still has room for extra characteristics
#and this one has not yet been used
while (not card_full) and (times_around < card_num):
card = random.randrange(card_num)
if (len(card_char[card]) >= ceiling) or (i in card_char[card]):
card_full = False
times_around = times_around +1
else:
card_char[card].append(i)
card_full = True
#start game
mycards = card_char
#get the card to guess
opponent_card = card_char[random.randrange(card_num)]
#don't tell the computer!
print("opponents card is:")
print(opponent_card)
#a list of characteristics to guess
guesses = (range(char_num))
#how many turns were taken
turns = 0
#keep looping till we eliminate all cards
while len(mycards) > 1:
turns = turns +1 #increment turn
estimate = [] #this will be a complete list of all characteristics remaining
for i in mycards:
for j in i:
estimate.append(j) #populate with all the chrtstc of all the cards
highest = random.choice(estimate) #start from a random chrrctst
highest_num = 0
#find the characteristic that is in most cards
for x in guesses:
current = estimate.count(x)
if current > highest_num:
highest_num = current
highest = x
#use it as a guess
guess = highest
guesses.remove(guess)
#does he have brown eyes?
if guess in opponent_card:
right = True
else:
right = False
size = len(mycards)
to_remove = []
#loop through the cards and remove those that don't fit the criteria
for card in range(size):
cur_card = mycards[card]
if right:
if not(guess in cur_card):
to_remove.append(cur_card)
if not right:
if guess in cur_card:
to_remove.append(cur_card)
for card in to_remove:
mycards.remove(card)
#print out the result
print 'I guessed:'
print mycards
print 'in ', turns,' turns'