Skip to content

Instantly share code, notes, and snippets.

@Back2Basics
Created May 4, 2013 19:39
Show Gist options
  • Save Back2Basics/5518502 to your computer and use it in GitHub Desktop.
Save Back2Basics/5518502 to your computer and use it in GitHub Desktop.
buggy version of Monopoly.
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