Created
May 4, 2013 19:39
-
-
Save Back2Basics/5518502 to your computer and use it in GitHub Desktop.
buggy version of Monopoly.
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 collections import OrderedDict, namedtuple | |
import random | |
# <codecell> | |
criteria = namedtuple('criteria', ['owner', 'cost', 'square_type', 'rent'], verbose=True) | |
# <codecell> | |
board = OrderedDict() # you need to add the sale price before the group | |
# from http://www.math.yorku.ca/~zabrocki/math2042/ | |
# ['ownership','Name', 'Price', 'Rent', 'Group'] | |
# ownership is an {0:bank, 1:player1, 2:player2 ...} | |
board['Medterranean Ave'] = criteria(0, 60, 'purple', 2) | |
board['Baltic Ave'] = criteria(0, 60, 'purple', 4) | |
board['Reading Railroad'] = criteria(0, 200, 'Railroad', '**') | |
board['Oriental Ave'] = criteria(0, 100, 'Light-Green', 6) | |
board['Vermont Ave'] = criteria(0, 100, 'Light-Green', 6) | |
board['Conneticut Ave'] = criteria(0, 120, 'Light-Green', 8) | |
board['St. Charles Pl'] = criteria(0, 140, 'Violet', 10) | |
board['Electric Co.'] = criteria(0, 150, 'Utilities', '*') | |
board['States Ave'] = criteria(0, 140, 'Violet', 10) | |
board['Virgina Ave'] = criteria(0, 160, 'Violet', 12) | |
board['Pennsylvania RailRoad'] = criteria(0, 200, 'Railroad', '**') | |
board['St. James PL'] = criteria(0, 180, 'Orange', 14) | |
board['Tennesse Ave'] = criteria(0, 180, 'Orange', 14) | |
board['New York Ave'] = criteria(0, 200, 'Orange', 16) | |
board['Kentucky Ave'] = criteria(0, 220, 'Red', 18) | |
board['Indiana Ave'] = criteria(0, 220, 'Red', 18) | |
board['Illinois Ave'] = criteria(0, 240, 'Red', 20) | |
board['B&0 RailRoad'] = criteria(0, 200, 'Railroad', '**') | |
board['Atlantic Ave'] = criteria(0, 260, 'Yellow', 22) | |
board['Venitor Ave'] = criteria(0, 260, 'Yellow', 22) | |
board['Water Works'] = criteria(0, 150, 'Utilities', '*') | |
board['Marvin Gardens'] = criteria(0, 280, 'Yellow', 22) | |
board['Pacific Ave'] = criteria(0, 300, 'Dark-Green', 26) | |
board['North Carolina Ave'] = criteria(0, 300, 'Dark-Green', 26) | |
board['Pennsylvania Ave'] = criteria(0, 320, 'Dark-Green', 28) | |
board['Short Line RailRoad'] = criteria(0, 200, 'Railroad', '**') | |
board['Park Place'] = criteria(0, 350, 'Dark-Blue', 35) | |
board['Boardwalk'] = criteria(0, 400, 'Dark-Blue', 50) | |
# <codecell> | |
def dice_roll(): | |
return random.randint(1,6)+random.randint(1,6) | |
class Player(object): | |
def __init__(self, money=1500, player_number=1): | |
self.money = money | |
self.player_number = player_number | |
self.position = 0 | |
def evaluate_property(self): | |
# does the bank own it | |
if board.items()[self.position][1].owner == 0: # 0 is the bank owns it | |
self.buy_property() | |
else: | |
self.pay_rent() | |
def pay_rent(self): | |
if board.items()[self.position][1].owner == self.player_number : | |
return # you own it | |
else: | |
if board.items()[self.position][1][3] == "Utilities": # utility | |
if board['Electric Co.'][0].owner == board['Water Works'][0].owner: | |
payment = dice_roll() * 10 | |
self.money -= payment | |
player.money += payment | |
else: | |
payment = dice_roll() * 4 | |
self.money -= payment | |
player.money += payment | |
elif board.items()[self.position][1].square_type == "Railroad": # I landed on a railroad | |
railroad_owner = board.items()[self.position[1]].owner # I have to pay the owner | |
rr_count = 0 | |
if board['Reading Railroad'].owner == railroad_owner: | |
rr_count += 1 | |
if board['Pennsylvania RailRoad'].owner == railroad_owner: | |
rr_count += 1 | |
if board['B&0 RailRoad'].owner == railroad_owner: | |
rr_count += 1 | |
if board['Short Line RailRoad'].owner == railroad_owner: | |
rr_count += 1 | |
payment = 25 * (1 << (rr_count - 1)) | |
else: # it's a property | |
payment = board.items()[self.position][1].cost | |
self.exchange_money(board.items()[self.position][1].owner, self.player_number, payment) | |
@classmethod | |
def exchange_money(cls, giving_player, recieving_player, money): | |
if player_list[giving_player].money < money: | |
property_list = list() | |
for x, property in enumerate(board.items()): # make a list of property they own. | |
if property[1].owner == player_list[giving_player]: | |
property_list.append(x) | |
cls.sell_property(random.randint(0, len(property_list))) # pick a property and sell it | |
else: | |
player_list[giving_player].money -= money | |
player_list[recieving_player].money -= money | |
def buy_property(self): | |
if board.items()[self.position][1].cost <= self.money: | |
if random.random >= .5: | |
board.items()[self.position][1] = board.items()[2][1]._replace(owner=self.player_number) | |
def sell_property(self, property_num): | |
board.items()[self.position][1] = board.items()[2][1]._replace(owner=0) | |
self.money += board.items()[self.property][1].cost | |
def move(self): | |
self.old_position = self.position | |
self.position = (self.position + dice_roll()) % len(board) | |
if self.old_position > self.position: # passed go | |
self.money += 200 | |
# <codecell> | |
if __name__ == "__main__": | |
no_of_players = 4 | |
no_of_games = 50 | |
for game in xrange(no_of_games): | |
player_list = [Player(player_number=x) for x in xrange(no_of_players)] | |
while len([player_list[x].money <= 2000 for x in xrange(no_of_players)]): | |
for player in player_list: | |
player.move() | |
player.evaluate_property() # which also buys or pays rent. | |
print('.') | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment