Created
November 27, 2017 16:16
-
-
Save anonymous/7c5d32479f2612e3e1374ec1d6863f97 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from __future__ import print_function | |
from itertools import chain | |
import random | |
R = random.Random('the game') | |
def run_game(players, turns, rounds, starting_clones): | |
# in the game function, players are represented by their index in | |
# the players list. | |
population = list(range(len(players))) * starting_clones | |
for i in range(rounds): | |
# in a round, run each pair | |
scores = [0]*len(players) | |
for player_a_index in population: | |
for player_b_index in population: | |
score_a, score_b = run_pairing( | |
players[player_a_index], | |
players[player_b_index], | |
turns) | |
scores[player_a_index] += score_a | |
scores[player_b_index] += score_b | |
print_round_info(players, scores, population, i) | |
# rebalance population | |
n = len(population) | |
all_score = sum(scores) | |
if 1 == len(set(population)): | |
print("MONOPOLY") | |
break | |
# could have pop changes due to rounding by truncation | |
new_counts = [(n*scores[i])//all_score for i in range(len(players))] | |
population = [i for i in range(len(players)) for _ in range(new_counts[i])] | |
def print_round_info(players, scores, population, round): | |
print("round%5d player score score%% count" % round) | |
for i in range(len(players)): | |
print(" %15s%15d%9.2f%10d" % ( | |
players[i].__name__, scores[i], 100 * scores[i] / sum(scores), | |
population.count(i))) | |
print() | |
def run_pairing(player_a, player_b, turns): | |
points_a = 0 | |
points_b = 0 | |
history_a = [] | |
history_b = [] | |
# play the games and create the history of moves | |
for round in range(turns): | |
history_a.append(player_a(history_a, history_b)) | |
history_b.append(player_b(history_b, history_a)) | |
# return (score_a, score_b) | |
return (player_score(history_a, history_b), | |
player_score(history_b, history_a)) | |
def player_score(player_moves, opponent_moves): | |
ans = 0 | |
for i in range(len(player_moves)): | |
if 5 >= (player_moves[i] + opponent_moves[i]): | |
ans += player_moves[i] | |
return ans | |
# | |
# a player functions takes 2 arguments, lists of integers with the | |
# same length | |
# - your moves history | |
# - their moves history | |
# | |
def random0to5(a, b): | |
return R.randint(0,5) | |
def random2to3(a, b): | |
return R.randint(2,3) | |
def meanie(a, b): | |
return 5 | |
def weakling(a, b): | |
return 0 | |
the_players = [ | |
meanie, | |
weakling, | |
random0to5, | |
random2to3 | |
] | |
the_turns = 100 | |
the_rounds = 100 | |
the_starting_clones = 50 | |
run_game(the_players, the_turns, the_rounds, the_starting_clones) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment