import random import operator import json configFileName = "kukconfig.json" people = {} class Person(object): global people def __init__(self, name): self.name = name self.kukPoints = 0 self.kukMealCount = 0 self.kukServingCount = 0 self.attendanceRate = 0.5 self.eatenCount = 0 people[name] = self @staticmethod def get(name): if name not in people: people[name] = Person(name) return people[name] mealHistory = {} midTop = 0 class Meal(object): global mealHistory def __init__(self, kuk, date): self.mid = self.getNextMID() self.kuk = kuk self.eaters = [] self.date = date self.meal = "food" mealHistory[self.mid] = self @staticmethod def getNextMID(): global midTop midTop += 1 return midTop def save(): with open(config['mealHistoryFile'], 'w') as outfile: json.dump(mealHistory, outfile) if __name__ == '__main__': try: with open (configFileName, 'r') as configFile: config = json.load(configFile) except IOError: print "Config file not found! Loading defaults" config = {} config['ip'] = '127.0.0.1' config['port'] = 5000 config['debug'] = True config['mealHistoryFile'] = "MealHistory.json" Person("Mark") Person("Davide") Person("Wille") Person("Sven") Person("David") Person("Ahmed") for name, person in people.iteritems(): person.attendanceRate = 0.2 + random.random() * 0.8 points = {} points[3] = 52 points[4] = 69 points[5] = 80 points[6] = 90 points[7] = 102 points[8] = 112 points[9] = 120 points[10] = 135 important = ['delicious', 'fabulous', 'very tasty', 'good', 'very good', 'not bad at all', 'favorable', 'ok', 'nutritious', 'italian', 'mouth-watering', 'objectively pleasing', 'aromatic', 'something to write home about', 'probably digestible', 'edible', 'a complex blend of carbon-based chemistry','not sanitized"); DROP TABLE MEALS;--', 'not poisoned', 'of unknown origin', 'crunchy', 'finger-licking good', 'fantastic', 'the best one we had so far', 'fancy', 'extrordinary', 'pleasant'] newcommers = ["Rick", "Morty", "Jerry", "Mr Poopy Buthole", "Karl Gustav VII", "Erik"] day = 1 while True: #somebody-joining module if len(newcommers) > 0 and random.random() < 0.1: newbe = Person(newcommers.pop()) newbe.attendanceRate = 0.2 + random.random() * 0.8 print "### NEW MEMBER ###" print "!!! {} has joined the group !!!" n_people = 0 while n_people < 3: attendees = [] for name, person in people.iteritems(): if random.random() < person.attendanceRate: attendees.append(name) n_people = len(attendees) print "\n\n===Day {}===".format(str(day)) print "{} people comming: ".format(str(n_people)) print " ", for name in attendees: print name + ",", print "" #selecting the kuk cookies = [v for k,v in people.iteritems() if k in attendees] scookies = sorted(cookies, key=operator.attrgetter('kukPoints'), reverse=True) tied = [] for person in scookies: if person.kukPoints < scookies[0].kukPoints: break tied.append(person) if len(tied)==1: print "{} has the most points ({}) and is going to cook".format(tied[0].name, str(tied[0].kukPoints)) kuk = tied[0] else: print "{} people are tied with {} points each".format(str(len(tied)), str(tied[0].kukPoints)) print " ", for person in tied: print person.name + ",", print "" kuk = random.choice(tied) print "{} was selected at random and is going to cook".format(kuk.name) cookies.remove(kuk) #kuking and points reward = points[n_people] payment = points[n_people] / (n_people-1) kuk.kukPoints -= reward kuk.kukMealCount += 1 kuk.kukServingCount += n_people kuk.eatenCount += 1 for cookie in cookies: cookie.kukPoints += payment cookie.eatenCount += 1 m = Meal(kuk.name, day); m.eaters = "many people" print "" print "{} cooked for {} people and cleared {} KukPoints".format(kuk.name, n_people, reward) print "{} people gained {} KukPoints each".format(n_people-1, payment) print "The meal was {}!".format(random.choice(important[:day])) #loop and status print "\nWhat now?" r = raw_input("[C]ontinue | [B]reak | [S]how stats\n") day += 1 if r == 'b': break if(r=='s'): print "STATUS:" for name, person in people.iteritems(): print "{} has {} kukPoints".format(name, str(person.kukPoints)) print "\tcooked {} times, a total of {} servings, ate {} times".format(str(person.kukMealCount), str(person.kukServingCount), str(person.eatenCount)) print "\nWhat now?" r = raw_input("[C]ontinue | [B]reak | [S]ince I already showed the stats, this option does nothing\n") if r == 'b': break for mid, meal in mealHistory.iteritems(): print "{} kuked for {} people".format(meal.kuk.name, str(len(meal.eaters))) print "Thank you for using KUKCOUNTER"