Last active
July 3, 2020 22:02
-
-
Save asciipip/e34c4ff0e1a3cbe78790684695ccb92b to your computer and use it in GitHub Desktop.
Code to generate Monopoly visualizations
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
#!/usr/bin/env python3 | |
import itertools | |
import colorcet as cc | |
import matplotlib.colors as mcolors | |
import matplotlib.pyplot as plt | |
import matplotlib.ticker as mtick | |
import numpy as np | |
START = np.zeros(120) | |
START[0] = 1.0 | |
JAIL_CELL = 10 | |
GO_TO_JAIL_CELL = 30 | |
GO_CELL = 0 | |
CC_CELLS = [2, 17, 33] | |
C1_CELL = 11 | |
E3_CELL = 24 | |
H2_CELL = 39 | |
R1_CELL = 5 | |
RR_CELLS = [5, 15, 25, 35] | |
U1_CELL = 12 | |
U_CELLS = [12, 28] | |
CH_CELLS = [7, 22, 36] | |
CELL_NAMES = [ | |
('GO', 'white', 'black'), | |
('Medit. Ave', 'brown', 'white'), | |
('Comm. Ch', 'white', 'black'), | |
('Baltic Ave', 'brown', 'white'), | |
('Income Tax', 'white', 'black'), | |
('Reading RR', 'white', 'black'), | |
('Orient. Ave', 'lightblue', 'black'), | |
('Chance', 'white', 'black'), | |
('Vt Ave', 'lightblue', 'black'), | |
('Ct Ave', 'lightblue', 'black'), | |
('Jail', 'white', 'black'), | |
('St. Chas. Pl', 'pink', 'black'), | |
('Elec. Co.', 'white', 'black'), | |
('States Ave', 'pink', 'black'), | |
('Va Ave', 'pink', 'black'), | |
('Pa RR', 'white', 'black'), | |
('St. Jas. Pl', 'orange', 'black'), | |
('Comm. Ch', 'white', 'black'), | |
('Tn Ave', 'orange', 'black'), | |
('NY Ave', 'orange', 'black'), | |
('Free Park.', 'white', 'black'), | |
('Ky Ave', 'red', 'white'), | |
('Chance', 'white', 'black'), | |
('In Ave', 'red', 'white'), | |
('Il Ave', 'red', 'white'), | |
('B&O RR', 'white', 'black'), | |
('Atl. Ave', 'yellow', 'black'), | |
('Vent. Ave', 'yellow', 'black'), | |
('Wtr. Wks.', 'white', 'black'), | |
('Marvin Gdn', 'yellow', 'black'), | |
('Go To Jail', 'white', 'black'), | |
('Pacific Ave', 'green', 'white'), | |
('NC Ave', 'green', 'black'), | |
('Comm. Ch', 'white', 'white'), | |
('Pa Ave', 'green', 'white'), | |
('Short Line', 'white', 'black'), | |
('Chance', 'white', 'black'), | |
('Park Pl', 'darkblue', 'white'), | |
('Lux. Tax', 'white', 'black'), | |
('Boardwalk', 'darkblue', 'white'), | |
] | |
np.set_printoptions(edgeitems=6) | |
def probability_lists(die_sides): | |
singles = np.zeros(1 + 2 * die_sides) | |
doubles = np.zeros(1 + 2 * die_sides) | |
for i in range(2, 1 + 2 * die_sides): | |
if i <= die_sides + 1: | |
base_prob = i - 1 | |
else: | |
base_prob = 2 * die_sides + 1 - i | |
if i % 2 == 0: | |
singles[i] = base_prob - 1 | |
doubles[i] = 1 | |
else: | |
singles[i] = base_prob | |
return (singles, doubles) | |
def apply_row_probabilities(array, row, die_sides): | |
singles, doubles = probability_lists(die_sides) | |
for i, (s_prob_n, d_prob_n) in enumerate(zip(singles, doubles)): | |
col = (row + i) % 40 | |
s_prob = s_prob_n / (die_sides * die_sides) | |
d_prob = d_prob_n / (die_sides * die_sides) | |
# single -> single | |
array[row, col] += s_prob | |
# single -> double | |
array[row, col+40] += d_prob | |
# double -> single | |
array[row+40, col] += s_prob | |
# double -> triple | |
array[row+40, col+80] += d_prob | |
# triple -> single | |
array[row+80, col] += s_prob | |
array[row+80, JAIL_CELL] += 1/6 | |
def apply_go_to_jail(array): | |
for row in range(0, array.shape[0]): | |
array[row, JAIL_CELL] += array[row, GO_TO_JAIL_CELL] + \ | |
array[row, GO_TO_JAIL_CELL + 40] + \ | |
array[row, GO_TO_JAIL_CELL + 80] | |
array[row, GO_TO_JAIL_CELL] = 0 | |
array[row, GO_TO_JAIL_CELL + 40] = 0 | |
array[row, GO_TO_JAIL_CELL + 80] = 0 | |
def apply_community_chest(array): | |
for row in range(0, array.shape[0]): | |
for cc in CC_CELLS: | |
for offset in (0, 40, 80): | |
array[row, GO_CELL+offset] += 1/16 * array[row, cc+offset] | |
array[row, JAIL_CELL+offset] += 1/16 * array[row, cc+offset] | |
array[row, cc+offset] *= 14/16 | |
def apply_chance(array): | |
for row in range(0, array.shape[0]): | |
for ch in CH_CELLS: | |
for offset in (0, 40, 80): | |
for dest in (GO_CELL, JAIL_CELL, C1_CELL, E3_CELL, H2_CELL, R1_CELL): | |
array[row, dest+offset] += 1/16 * array[row, ch+offset] | |
try: | |
next_railroad = next(itertools.dropwhile(lambda i: i<ch, RR_CELLS)) | |
except StopIteration: | |
next_railroad = RR_CELLS[0] | |
array[row, next_railroad+offset] += 2/16 * array[row, ch+offset] | |
try: | |
next_utility = next(itertools.dropwhile(lambda i: i<ch, U_CELLS)) | |
except StopIteration: | |
next_utility = U_CELLS[0] | |
array[row, next_utility+offset] += 1/16 * array[row, ch+offset] | |
# back three | |
array[row, offset+((ch-3)%40)] += 1/16 * array[row, ch+offset] | |
array[row, ch+offset] *= 6/16 | |
def create_prob_matrix(die_sides): | |
array = np.zeros((120, 120)) | |
for row in range(0, 40): | |
apply_row_probabilities(array, row, die_sides) | |
apply_go_to_jail(array) | |
apply_community_chest(array) | |
apply_chance(array) | |
return array | |
def collapse_prob_matrix(array): | |
"""Collapses the double tracking into a single 40x40 array.""" | |
result = np.zeros((40, 40)) | |
for row in range(0, 40): | |
for col in range(0, 40): | |
# "weight" is the likelihood of us being on the row. Doubles | |
# happen 1/6 of the time. The odds that the last two rolls | |
# were doubles are 1/36. The odds that the last roll was | |
# doubles but the previous wasn't are 5/36. That leaves 30/36 | |
# for the common case of no doubles. | |
for ro, weight in ((0, 30/36), (40, 5/36), (80, 1/36)): | |
for co in (0, 40, 80): | |
result[row, col] += array[row+ro, col+co] * weight | |
return result | |
def plot_matrix(array): | |
cmap = mcolors.LinearSegmentedColormap.from_list('cc_bgy', ['#ffffff'] + list(reversed(cc.bmw))) | |
ax = plt.gca() | |
im = ax.imshow(array, cmap=cmap) | |
ax.figure.colorbar(im, ax=ax, format=mtick.PercentFormatter(xmax=1), label='Chance of transition') | |
plt.show() | |
def plot_collapsed_matrix(array): | |
cmap = mcolors.LinearSegmentedColormap.from_list('cc_bgy', ['#ffffff'] + list(reversed(cc.bmw))) | |
plt.figure(figsize=[12, 9]) | |
ax = plt.gca() | |
im = ax.imshow(array, cmap=cmap) | |
ax.figure.colorbar(im, ax=ax, format=mtick.PercentFormatter(xmax=1), label='Chance of transition') | |
ax.set_yticks(range(0, len(CELL_NAMES))) | |
ax.set_yticklabels((n[0] for n in CELL_NAMES)) | |
ax.set_xticks(range(0, len(CELL_NAMES))) | |
ax.set_xticklabels((n[0] for n in CELL_NAMES), rotation=90) | |
for edge, spine in ax.spines.items(): | |
spine.set_color('white') | |
ax.set_xticks(np.arange(array.shape[1]+1)-.5, minor=True) | |
ax.set_yticks(np.arange(array.shape[0]+1)-.5, minor=True) | |
ax.grid(which="minor", color="w", linestyle='-', linewidth=2) | |
ax.tick_params(which="minor", bottom=False, left=False, right=False, top=False) | |
ax.tick_params(bottom=False, left=False, right=False, top=False) | |
ax.set_title('Odds of Moving from One Space to Another in Monopoly', fontsize='x-large') | |
ax.set_ylabel('Chance to go from here...') | |
ax.set_xlabel('...to here.') | |
plt.subplots_adjust(bottom=0.15) | |
plt.savefig('monopoly.svg') | |
#plt.show() | |
arr = create_prob_matrix(6) | |
#plot_matrix(arr) | |
carr = collapse_prob_matrix(arr) | |
plot_collapsed_matrix(carr) |
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
digraph monopoly { | |
label="Monopoly First Move" | |
rankdir=LR | |
compound=true | |
node [shape=plaintext] | |
start [label=< | |
<TABLE BORDER="0" CELLBORDER="1" CELLPADDING="0"> | |
<TR><TD PORT="GO" BGCOLOR="black"><FONT COLOR="white">GO<BR/>100%</FONT></TD></TR> | |
<TR><TD PORT="Mediterranean">Mediterranean Ave</TD></TR> | |
<TR><TD PORT="CC1">Community Chest</TD></TR> | |
<TR><TD PORT="Baltic">Baltic Ave</TD></TR> | |
<TR><TD PORT="Income_Tax">Income Tax</TD></TR> | |
<TR><TD PORT="Reading_RR">Reading RR</TD></TR> | |
<TR><TD PORT="Oriental">Oriental Ave</TD></TR> | |
<TR><TD PORT="Chance1">Chance</TD></TR> | |
<TR><TD PORT="VT">Vermont Ave</TD></TR> | |
<TR><TD PORT="CT">Connecticut Ave</TD></TR> | |
<TR><TD PORT="Jail">Jail</TD></TR> | |
<TR><TD PORT="St_Charles">St. Charles Pl</TD></TR> | |
<TR><TD PORT="Electric">Electric Company</TD></TR> | |
<TR><TD PORT="States">States Ave</TD></TR> | |
<TR><TD PORT="VA">Virginia Ave</TD></TR> | |
<TR><TD PORT="PA_RR">Pennsylvania RR</TD></TR> | |
<TR><TD PORT="St_James">St. James Pl</TD></TR> | |
<TR><TD PORT="CC2">Community Chest</TD></TR> | |
<TR><TD PORT="TN">Tennessee Ave</TD></TR> | |
<TR><TD PORT="NY">New York Ave</TD></TR> | |
<TR><TD PORT="Parking">Free Parking</TD></TR> | |
<TR><TD PORT="KY">Kentucky Ave</TD></TR> | |
<TR><TD PORT="Chance2">Chance</TD></TR> | |
<TR><TD PORT="IN">Indiana Ave</TD></TR> | |
<TR><TD PORT="IL">Illinois Ave</TD></TR> | |
<TR><TD PORT="BO_RR">B&O RR</TD></TR> | |
<TR><TD PORT="Atlantic">Atlantic Ave</TD></TR> | |
<TR><TD PORT="Ventnor">Ventnor Ave</TD></TR> | |
<TR><TD PORT="Water">Water Works</TD></TR> | |
<TR><TD PORT="Marvin">Marvin Gardens</TD></TR> | |
<TR><TD PORT="G2J">Go To Jail</TD></TR> | |
<TR><TD PORT="Pacific">Pacific Ave</TD></TR> | |
<TR><TD PORT="NC">North Carolina Ave</TD></TR> | |
<TR><TD PORT="CC3">Community Chest</TD></TR> | |
<TR><TD PORT="PA">Pennsylvania Ave</TD></TR> | |
<TR><TD PORT="Short">Short Line</TD></TR> | |
<TR><TD PORT="Chance3">Chance</TD></TR> | |
<TR><TD PORT="Park">Park Pl</TD></TR> | |
<TR><TD PORT="Luxury_Tax">Luxury Tax</TD></TR> | |
<TR><TD PORT="Boardwalk">Boardwalk</TD></TR> | |
</TABLE>>] | |
final [label=< | |
<TABLE BORDER="0" CELLBORDER="1" CELLPADDING="0"> | |
<TR><TD PORT="GO" BGCOLOR="#ffd7ff">GO<BR/>1.2%</TD></TR> | |
<TR><TD PORT="Mediterranean">Mediterranean Ave</TD></TR> | |
<TR><TD PORT="CC1" BGCOLOR="#ffc1ff">Community Chest<BR/>2.4%</TD></TR> | |
<TR><TD PORT="Baltic" BGCOLOR="#ff83ff">Baltic Ave<BR/>5.6%</TD></TR> | |
<TR><TD PORT="Income_Tax" BGCOLOR="#e12fff">Income Tax<BR/>9.4%</TD></TR> | |
<TR><TD PORT="Reading_RR" BGCOLOR="#9f1eff"><FONT COLOR="white">Reading RR<BR/>12.2%</FONT></TD></TR> | |
<TR><TD PORT="Oriental" BGCOLOR="#661fff"><FONT COLOR="white">Oriental Ave<BR/>13.9%</FONT></TD></TR> | |
<TR><TD PORT="Chance1" BGCOLOR="#fc5aff">Chance<BR/>7.3%</TD></TR> | |
<TR><TD PORT="VT" BGCOLOR="#661fff"><FONT COLOR="white">Vermont Ave<BR/>13.9%</FONT></TD></TR> | |
<TR><TD PORT="CT" BGCOLOR="#bd1eff"><FONT COLOR="white">Connecticut Ave<BR/>11.1%</FONT></TD></TR> | |
<TR><TD PORT="Jail" BGCOLOR="#e02eff">Jail<BR/>9.5%</TD></TR> | |
<TR><TD PORT="St_Charles" BGCOLOR="#ff6bff">St. Charles Pl<BR/>6.6%</TD></TR> | |
<TR><TD PORT="Electric" BGCOLOR="#ffa8ff">Electric Company<BR/>3.8%</TD></TR> | |
<TR><TD PORT="States">States Ave</TD></TR> | |
<TR><TD PORT="VA">Virginia Ave</TD></TR> | |
<TR><TD PORT="PA_RR" BGCOLOR="#ffdaff">Pennsylvania RR<BR/>1.0%</TD></TR> | |
<TR><TD PORT="St_James">St. James Pl</TD></TR> | |
<TR><TD PORT="CC2">Community Chest</TD></TR> | |
<TR><TD PORT="TN">Tennessee Ave</TD></TR> | |
<TR><TD PORT="NY">New York Ave</TD></TR> | |
<TR><TD PORT="Parking">Free Parking</TD></TR> | |
<TR><TD PORT="KY">Kentucky Ave</TD></TR> | |
<TR><TD PORT="Chance2">Chance</TD></TR> | |
<TR><TD PORT="IN">Indiana Ave</TD></TR> | |
<TR><TD PORT="IL" BGCOLOR="#ffdaff">Illinois Ave<BR/>1.0%</TD></TR> | |
<TR><TD PORT="BO_RR">B&O RR</TD></TR> | |
<TR><TD PORT="Atlantic">Atlantic Ave</TD></TR> | |
<TR><TD PORT="Ventnor">Ventnor Ave</TD></TR> | |
<TR><TD PORT="Water">Water Works</TD></TR> | |
<TR><TD PORT="Marvin">Marvin Gardens</TD></TR> | |
<TR><TD PORT="G2J">Go To Jail</TD></TR> | |
<TR><TD PORT="Pacific">Pacific Ave</TD></TR> | |
<TR><TD PORT="NC">North Carolina Ave</TD></TR> | |
<TR><TD PORT="CC3">Community Chest</TD></TR> | |
<TR><TD PORT="PA">Pennsylvania Ave</TD></TR> | |
<TR><TD PORT="Short">Short Line</TD></TR> | |
<TR><TD PORT="Chance3">Chance</TD></TR> | |
<TR><TD PORT="Park">Park Pl</TD></TR> | |
<TR><TD PORT="Luxury_Tax">Luxury Tax</TD></TR> | |
<TR><TD PORT="Boardwalk" BGCOLOR="#ffdaff">Boardwalk<BR/>1.0%</TD></TR> | |
</TABLE>>] | |
subgraph cluster_dierolls { | |
label="Die Rolls (first, second)\n36 possibilities\n2.8% each" | |
d2 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR><TD PORT="11" BGCOLOR="#ffbaff">1,1</TD></TR> | |
</TABLE>>] | |
d3 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="12" BGCOLOR="#ffbaff">1,2</TD> | |
<TD PORT="21" BGCOLOR="#ffbaff">2,1</TD> | |
</TR> | |
</TABLE>>] | |
d4 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="13" BGCOLOR="#ffbaff">1,3</TD> | |
<TD PORT="22" BGCOLOR="#ffbaff">2,2</TD> | |
<TD PORT="31" BGCOLOR="#ffbaff">3,1</TD> | |
</TR> | |
</TABLE>>] | |
d5 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="14" BGCOLOR="#ffbaff">1,4</TD> | |
<TD PORT="23" BGCOLOR="#ffbaff">2,3</TD> | |
<TD PORT="32" BGCOLOR="#ffbaff">3,2</TD> | |
<TD PORT="41" BGCOLOR="#ffbaff">4,1</TD> | |
</TR> | |
</TABLE>>] | |
d6 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="15" BGCOLOR="#ffbaff">1,5</TD> | |
<TD PORT="24" BGCOLOR="#ffbaff">2,4</TD> | |
<TD PORT="33" BGCOLOR="#ffbaff">3,3</TD> | |
<TD PORT="42" BGCOLOR="#ffbaff">4,2</TD> | |
<TD PORT="51" BGCOLOR="#ffbaff">5,1</TD> | |
</TR> | |
</TABLE>>] | |
d7 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="16" BGCOLOR="#ffbaff">1,6</TD> | |
<TD PORT="25" BGCOLOR="#ffbaff">2,5</TD> | |
<TD PORT="34" BGCOLOR="#ffbaff">3,4</TD> | |
<TD PORT="43" BGCOLOR="#ffbaff">4,3</TD> | |
<TD PORT="52" BGCOLOR="#ffbaff">5,2</TD> | |
<TD PORT="61" BGCOLOR="#ffbaff">6,1</TD> | |
</TR> | |
</TABLE>>] | |
d8 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="26" BGCOLOR="#ffbaff">2,6</TD> | |
<TD PORT="35" BGCOLOR="#ffbaff">3,5</TD> | |
<TD PORT="44" BGCOLOR="#ffbaff">4,4</TD> | |
<TD PORT="53" BGCOLOR="#ffbaff">5,3</TD> | |
<TD PORT="62" BGCOLOR="#ffbaff">6,2</TD> | |
</TR> | |
</TABLE>>] | |
d9 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="36" BGCOLOR="#ffbaff">3,6</TD> | |
<TD PORT="45" BGCOLOR="#ffbaff">4,5</TD> | |
<TD PORT="54" BGCOLOR="#ffbaff">5,4</TD> | |
<TD PORT="63" BGCOLOR="#ffbaff">6,3</TD> | |
</TR> | |
</TABLE>>] | |
d10 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="46" BGCOLOR="#ffbaff">4,6</TD> | |
<TD PORT="55" BGCOLOR="#ffbaff">5,5</TD> | |
<TD PORT="64" BGCOLOR="#ffbaff">6,4</TD> | |
</TR> | |
</TABLE>>] | |
d11 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR> | |
<TD PORT="56" BGCOLOR="#ffbaff">5,6</TD> | |
<TD PORT="65" BGCOLOR="#ffbaff">6,5</TD> | |
</TR> | |
</TABLE>>] | |
d12 [label=< | |
<TABLE BORDER="0" CELLBORDER="0"> | |
<TR><TD PORT="66" BGCOLOR="#ffbaff">6,6</TD></TR> | |
</TABLE>>] | |
} | |
start:GO -> d2:11:n; d2:11:s -> final:CC1 | |
subgraph cluster_cc { | |
label="Community Chest Cards\n16 cards\n0.2% each" | |
CCopt [label=< | |
<TABLE BORDER="0" CELLBORDER="0" CELLPADDING="0"> | |
<TR><TD PORT="bank" BGCOLOR="#ffe9fe">Bank error in your favor.</TD></TR> | |
<TR><TD PORT="doc" BGCOLOR="#ffe9fe">Doctor's fees.</TD></TR> | |
<TR><TD PORT="stock" BGCOLOR="#ffe9fe">Sale of stock.</TD></TR> | |
<TR><TD PORT="opera" BGCOLOR="#ffe9fe">Grand Opera Night.</TD></TR> | |
<TR><TD PORT="holiday" BGCOLOR="#ffe9fe">Holiday Fund matures.</TD></TR> | |
<TR><TD PORT="refund" BGCOLOR="#ffe9fe">Income tax refund.</TD></TR> | |
<TR><TD PORT="birthday" BGCOLOR="#ffe9fe">It is your birthday.</TD></TR> | |
<TR><TD PORT="life_ins" BGCOLOR="#ffe9fe">Life insurance matures.</TD></TR> | |
<TR><TD PORT="hospital" BGCOLOR="#ffe9fe">Hospital Fees.</TD></TR> | |
<TR><TD PORT="school" BGCOLOR="#ffe9fe">School fees.</TD></TR> | |
<TR><TD PORT="consult" BGCOLOR="#ffe9fe">Receive consultancy fee.</TD></TR> | |
<TR><TD PORT="repairs" BGCOLOR="#ffe9fe">Assessed for street repairs.</TD></TR> | |
<TR><TD PORT="beauty" BGCOLOR="#ffe9fe">Second place in beauty pageant.</TD></TR> | |
<TR><TD PORT="inherit" BGCOLOR="#ffe9fe">You inherit money.</TD></TR> | |
<TR><TD PORT="go" BGCOLOR="#ffe9fe">Advance to "Go".</TD></TR> | |
<TR><TD PORT="jail" BGCOLOR="#ffe9fe">Go to Jail.</TD></TR> | |
</TABLE>>] | |
} | |
final:CC1 -> CCopt [lhead=cluster_cc] | |
CCopt:go:e -> final:GO [constraint=false] | |
CCopt:jail:e -> final:Jail [constraint=false] | |
CCopt:bank -> final:CC1 [constraint=false] | |
CCopt:doc -> final:CC1 [constraint=false] | |
CCopt:stock -> final:CC1 [constraint=false] | |
CCopt:opera -> final:CC1 [constraint=false] | |
CCopt:holiday -> final:CC1 [constraint=false] | |
CCopt:refund -> final:CC1 [constraint=false] | |
CCopt:birthday -> final:CC1 [constraint=false] | |
CCopt:life_ins -> final:CC1 [constraint=false] | |
CCopt:hospital -> final:CC1 [constraint=false] | |
CCopt:school -> final:CC1 [constraint=false] | |
CCopt:consult -> final:CC1 [constraint=false] | |
CCopt:repairs -> final:CC1 [constraint=false] | |
CCopt:beauty -> final:CC1 [constraint=false] | |
CCopt:inherit -> final:CC1 [constraint=false] | |
start:GO -> d3:12:n; d3:12:s -> final:Baltic | |
start:GO -> d3:21:n; d3:21:s -> final:Baltic | |
start:GO -> d4:13:n; d4:13:s -> final:Income_Tax | |
start:GO -> d4:22:n; d4:22:s -> final:Income_Tax | |
start:GO -> d4:31:n; d4:31:s -> final:Income_Tax | |
start:GO -> d5:14:n; d5:14:s -> final:Reading_RR | |
start:GO -> d5:23:n; d5:23:s -> final:Reading_RR | |
start:GO -> d5:32:n; d5:32:s -> final:Reading_RR | |
start:GO -> d5:41:n; d5:41:s -> final:Reading_RR | |
start:GO -> d6:15:n; d6:15:s -> final:Oriental | |
start:GO -> d6:24:n; d6:24:s -> final:Oriental | |
start:GO -> d6:33:n; d6:33:s -> final:Oriental | |
start:GO -> d6:42:n; d6:42:s -> final:Oriental | |
start:GO -> d6:51:n; d6:51:s -> final:Oriental | |
start:GO -> d7:16:n; d7:16:s -> final:Chance1 | |
start:GO -> d7:25:n; d7:25:s -> final:Chance1 | |
start:GO -> d7:34:n; d7:34:s -> final:Chance1 | |
start:GO -> d7:43:n; d7:43:s -> final:Chance1 | |
start:GO -> d7:52:n; d7:52:s -> final:Chance1 | |
start:GO -> d7:61:n; d7:61:s -> final:Chance1 | |
subgraph cluster_chance { | |
label="Chance Cards\n16 cards\n1.0% each" | |
Copt [label=< | |
<TABLE BORDER="0" CELLBORDER="0" CELLPADDING="0"> | |
<TR><TD PORT="go" BGCOLOR="#ffdaff">Advance to "Go".</TD></TR> | |
<TR><TD PORT="back" BGCOLOR="#ffdaff">Go Back Three Spaces.</TD></TR> | |
<TR><TD PORT="reading" BGCOLOR="#ffdaff">Take a trip to Reading Railroad.</TD></TR> | |
<TR><TD PORT="jail" BGCOLOR="#ffdaff">Go to Jail.</TD></TR> | |
<TR><TD PORT="SC" BGCOLOR="#ffdaff">Advance to St. Charles Place.</TD></TR> | |
<TR><TD PORT="dividend" BGCOLOR="#ffdaff">Bank pays you dividend.</TD></TR> | |
<TR><TD PORT="jail_free" BGCOLOR="#ffdaff">Get out of Jail Free.</TD></TR> | |
<TR><TD PORT="repairs" BGCOLOR="#ffdaff">Make general repairs on your property.</TD></TR> | |
<TR><TD PORT="poor_tax" BGCOLOR="#ffdaff">Pay poor tax.</TD></TR> | |
<TR><TD PORT="chair" BGCOLOR="#ffdaff">You're elected Chairman of the Board.</TD></TR> | |
<TR><TD PORT="mature" BGCOLOR="#ffdaff">Building loan matures.</TD></TR> | |
<TR><TD PORT="crossword" BGCOLOR="#ffdaff">Win a crossword competition.</TD></TR> | |
<TR><TD PORT="U" BGCOLOR="#ffdaff">Advance to nearest Utility.</TD></TR> | |
<TR><TD PORT="RR" BGCOLOR="#ffdaff">Advance to nearest Railroad.</TD></TR> | |
<TR><TD PORT="IL" BGCOLOR="#ffdaff">Advance to Illinois Ave.</TD></TR> | |
<TR><TD PORT="boardwalk" BGCOLOR="#ffdaff">Advance to Boardwalk.</TD></TR> | |
</TABLE>>] | |
} | |
final:Chance1 -> Copt [lhead=cluster_chance] | |
Copt:go:e -> final:GO [constraint=false] | |
Copt:IL:e -> final:IL [constraint=false] | |
Copt:SC:e -> final:St_Charles [constraint=false] | |
Copt:U:e -> final:Electric [constraint=false] | |
Copt:RR:e -> final:PA_RR [constraint=false] | |
Copt:dividend -> final:Chance1 [constraint=false] | |
Copt:jail_free -> final:Chance1 [constraint=false] | |
Copt:back:e -> final:Income_Tax [constraint=false] | |
Copt:jail:e -> final:Jail [constraint=false] | |
Copt:repairs -> final:Chance1 [constraint=false] | |
Copt:poor_tax -> final:Chance1 [constraint=false] | |
Copt:reading:e -> final:Reading_RR [constraint=false] | |
Copt:boardwalk:e -> final:Boardwalk [constraint=false] | |
Copt:chair -> final:Chance1 [constraint=false] | |
Copt:mature -> final:Chance1 [constraint=false] | |
Copt:crossword -> final:Chance1 [constraint=false] | |
start:GO -> d8:26:n; d8:26:s -> final:VT | |
start:GO -> d8:35:n; d8:35:s -> final:VT | |
start:GO -> d8:44:n; d8:44:s -> final:VT | |
start:GO -> d8:53:n; d8:53:s -> final:VT | |
start:GO -> d8:62:n; d8:62:s -> final:VT | |
start:GO -> d9:36:n; d9:36:s -> final:CT | |
start:GO -> d9:45:n; d9:45:s -> final:CT | |
start:GO -> d9:54:n; d9:54:s -> final:CT | |
start:GO -> d9:63:n; d9:63:s -> final:CT | |
start:GO -> d10:46:n; d10:46:s -> final:Jail | |
start:GO -> d10:55:n; d10:55:s -> final:Jail | |
start:GO -> d10:64:n; d10:64:s -> final:Jail | |
start:GO -> d11:56:n; d11:56:s -> final:St_Charles | |
start:GO -> d11:65:n; d11:65:s -> final:St_Charles | |
start:GO -> d12:66:n; d12:66:s -> final:Electric | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment