-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGame.py
85 lines (70 loc) · 2.7 KB
/
Game.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from Support import Board, Chain
from Player import Player
import random
class Game:
def __init__(self, *players):
self.board = Board()
self.players: list[Player] = list(players)
self.tiles: list[tuple[int, int]] = []
for i in range(9):
for j in range(12):
self.tiles.append((i, j))
for player in players:
for _ in range(6):
self.draw(player)
self.chains: list[Chain] = [Chain("Tower", 1), Chain("Luxor", 1),
Chain("American", 2), Chain("Worldwide", 2),
Chain("Festival", 2), Chain("Imperial", 3),
Chain("Continental", 3)]
def start(self):
while True:
for player in self.players:
self.turn(player)
if not self.any_valid_moves():
results = self.end_game()
return results
def any_valid_moves(self) -> bool:
amt = 0
for player in self.players:
amt += len(player.tiles)
def draw(self, player: Player):
# Assumes only valid moves in game pile
tile = self.tiles[random.randint(0, len(self.tiles))]
player.tiles.append(tile)
self.tiles.remove(tile)
def turn(self, player):
print(self.board)
tile = player.place_tile()
print(f"{player.name} placed ", tile)
chains = self.board.place_tile(tile)
if chains:
#Merger
print(chains)
print("Oh NOOOOOOOO")
self.merge(chains, player)
print(self.board)
def merge(self, chains: list[Chain], merger_maker: Player):
sorted_chains = reversed(sorted(chains, key=lambda x: x.size)) # large to small chain size
merge_order: list[Chain] = []
groups = []
for chain in sorted_chains:
if not groups or groups[-1][0].size != chain.size:
groups.append([chain])
else:
groups[-1].append(chain)
for chain_group in groups:
merge_order.append(merger_maker.choose_merge_order(chain_group))
acquirer = merge_order[0]
for defunct_chain in merge_order[1:]:
self.award_bonuses(defunct_chain)
index = self.players.index(merger_maker)
for player in self.players[index:] + self.players[:index]:
player.dispose_stocks(defunct_chain, acquirer)
acquirer.expand_chain(*defunct_chain.hotels)
defunct_chain.reset_chain()
def award_bonuses(self, defunct_chain: Chain):
#TODO
return None
def end_game(self):
#TODO
return None