-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgame_simulator.py
110 lines (101 loc) · 3.53 KB
/
game_simulator.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
from game_controller import GameController
from log import logger
import config
import bot
import copy
import time
import sys
class GameSimulator:
'''
Class manages one game match.
Usage:
>> eng = GameSimulator(config, players, start_state, game_signature)
>> eng.play()
Examples:
# Getting class to Bot instance
>> game_simulator.get_move(player, player_state, serializer, deserializer)
'''
def __init__(self, players, start_state, game_signature):
'''
Constructor of class GameSimulator.
Creates an object of the class, gets config, players list,
jury_state and game_signature
'''
self._start_state = start_state
self._game_controller = GameController(
players, game_signature, start_state, self
)
def _create_bots(self):
'''
Creates bots for each player
'''
self.bots = {}
for player in self._game_controller._players:
self.bots[player] = bot.Bot(player.command_line)
self.bots[player].create_process()
logger.debug('created bot \'%s\'', player.bot_name)
logger.info('all bots created')
def get_move(self, player, player_state, serializer, deserializer):
'''
Gets move to Bot instance
'''
new_move = self.bots[player].get_move(player_state,
serializer, deserializer)
logger.debug('bot \'%s\' made a move', player.bot_name)
print('.', end='')
sys.stdout.flush()
return new_move
def _kill_bots(self):
'''
Killes ALL running bots
'''
for bot in self.bots.values():
bot.kill_process()
logger.info('all bots killed')
def report_state(self, jury_state):
'''
Saves jury states to array
'''
copied_js = copy.deepcopy(jury_state)
self._game_controller.jury_states.append(copied_js)
def play(self):
'''
Starts the game, executes master game program and updates
game_controller, then finishes the game and kills
all the bots.
'''
try:
self._create_bots()
start_time = time.time()
#game_master = config.GameMaster(self._game_controller,
# self._start_state)
game_master = config.GameMaster(self, self._start_state)
while not self._game_controller.is_finished:
copied_js =\
copy.deepcopy(self._game_controller.jury_states[-1])
try:
game_master.tick(copied_js)
except:
logger.critical('game master was raised an '
'unhandled exception, aborting')
self._kill_bots()
logger.critical('re-raising game master\'s exception')
raise
end_time = time.time()
logger.info('time spent on the game: %f sec',
end_time - start_time)
return self._game_controller
finally:
self._kill_bots()
def get_players(self):
'''
Gets players list as an list of instances
'''
return self._game_controller._players
def finish_game(self, scores):
'''
Finishes game with `scores`
'''
self._game_controller.is_finished = True
self._game_controller._scores = scores
logger.info('game finished')