Advertisement
Lasall42

GOIO leaderboard calculations season 1 (v3)

Jul 24th, 2015
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.31 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. import json
  4. import sys
  5. from collections import OrderedDict
  6.  
  7. PARTICIPATION_POINTS = 2
  8. TOURNAMENT_MAX_POINTS = 11
  9. RANK_1_MULTIPLIER = 1
  10. RANK_2_MULTIPLIER = 2
  11. RANK_3_MULTIPLIER = 3
  12. NO_RANK_MULTIPLIER = 4
  13.  
  14.  
  15. clanlist = {}
  16. ranking = []
  17. sumpoints = 0
  18.  
  19.  
  20. class Clan():
  21.     '''Clan object holding information about points and rank.'''
  22.  
  23.     def __init__(self, name):
  24.         '''Initialize Clan object. Use get_clan instead.'''
  25.         self.points = 0
  26.         self.rank = 0
  27.         self.name = name
  28.  
  29. def get_clan(name):
  30.     '''Retrieves Clan object from global dictionary or creates new object
  31.    with all necessary initializations.'''
  32.  
  33.     try:
  34.         return clanlist[name]
  35.     except KeyError:
  36.         clan = Clan(name)
  37.         clanlist[name] = clan
  38.         ranking.append (clan)
  39.         return clan
  40.  
  41.  
  42. class Tournament():
  43.     '''Tournament object. Invoke finish method after adding all participants
  44.    to update ranking. '''
  45.  
  46.     count = 0
  47.  
  48.     def __init__(self, name, participants):
  49.         self.name = name
  50.         self.participants = participants
  51.         Tournament.count += 1
  52.  
  53.     def add(self, clan, wins, place):
  54.         global sumpoints
  55.  
  56.         #
  57.         # Add points based on place
  58.         #
  59.         # addpoints = TOURNAMENT_MAX_POINTS - place
  60.         # if addpoints > 0:
  61.         #     clan.points += addpoints
  62.         #     sumpoints += addpoints
  63.         #     # clan.points += addpoints/self.participants
  64.         #     # sumpoints += addpoints/self.participants
  65.  
  66.         #
  67.         # Diminishing returns system
  68.         #
  69.         addpoints = 0
  70.         if wins == 0:
  71.             addpoints += PARTICIPATION_POINTS
  72.         else:
  73.             if clan.rank == 1:
  74.                 addpoints = wins*RANK_1_MULTIPLIER
  75.             elif clan.rank == 2:
  76.                 addpoints += wins*RANK_2_MULTIPLIER
  77.             elif clan.rank == 3:
  78.                 addpoints += wins*RANK_3_MULTIPLIER
  79.             else:
  80.                 addpoints += wins*NO_RANK_MULTIPLIER
  81.         clan.points += addpoints
  82.         sumpoints += addpoints
  83.  
  84.     def finish(self):
  85.         # print("\n", self.name, sep = "")
  86.         # if Tournament.count == 100:
  87.         #     update_ranks(True)
  88.         #     self.reset()
  89.         # else:
  90.         update_ranks()
  91.  
  92.     def reset(self):
  93.         # print("reset")
  94.         Tournament.count = 0
  95.         del ranking[:]
  96.         clanlist.clear()
  97.  
  98.  
  99. def update_ranks(show = False):
  100.     ranking.sort(key = lambda x: x.points, reverse = True)
  101.  
  102.     rank = 0
  103.     prevpoints = -1
  104.     # print(ranking[0].name, "first")
  105.     for clan in ranking:
  106.         if prevpoints != clan.points:
  107.             rank += 1
  108.             prevpoints = clan.points
  109.         # elif rank == 1:
  110.         #     print("same:", clan.name)
  111.         clan.rank = rank
  112.         if show:
  113.             print("%2d: %12s %4s)" % (clan.rank, clan.name, "(" + str(clan.points)))
  114.     if show:
  115.         print()
  116.  
  117.  
  118. def load_data(file):
  119.     with open (file) as f:
  120.         # OrderedDict to keep key/values in order for ranking
  121.         return json.load(f, object_pairs_hook = OrderedDict)
  122.  
  123.  
  124. if __name__ == "__main__":
  125.     try:
  126.         filename = sys.argv[1]
  127.     except IndexError:
  128.         filename = "leaderboard.json"
  129.  
  130.     json = load_data(filename)
  131.     for tournament in json["Leaderboard"]:
  132.         eventobj = json["Leaderboard"][tournament]
  133.         event = Tournament(tournament, eventobj["participants"])
  134.         update = True
  135.         skip = False
  136.  
  137.         if "options" in eventobj:
  138.             opts = eventobj["options"]
  139.             if "skip" in opts and opts["skip"]:
  140.                 skip = True
  141.                 continue
  142.             if "update" in opts and not opts["update"]:
  143.                 update = False
  144.  
  145.  
  146.         clans = eventobj["clans"]
  147.         for clan in clans:
  148.             event.add(get_clan(clan), clans[clan]["wins"], clans[clan]["place"])
  149.  
  150.         if not skip and update:
  151.             event.finish()
  152.  
  153.     rank = 0
  154.     prevpoints = -1
  155.     for clan in ranking:
  156.         if prevpoints != clan.points:
  157.             rank += 1
  158.             prevpoints = clan.points
  159.         # normalized display
  160.         # print("%2d: %12s %4s%%)" % (clan.rank, clan.name, "(" + str(round(clan.points*100/sumpoints, 2))))
  161.         print("%2d: %12s %4s)" % (clan.rank, clan.name, "(" + str(clan.points)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement