|
| 1 | +import math |
| 2 | +import time |
1 | 3 | import random |
2 | 4 | from enum import Enum |
3 | 5 | from .robot import Robot |
|
19 | 21 | from typing import Generator |
20 | 22 | from .message import Message |
21 | 23 |
|
22 | | -import math |
23 | | - |
24 | 24 | class Game: |
25 | 25 |
|
26 | 26 | def __init__(self, code, initial_map: InitialMap, game_fb: GameFB, game_args): |
@@ -66,12 +66,20 @@ def __init__(self, code, initial_map: InitialMap, game_fb: GameFB, game_args): |
66 | 66 | self.update_defense_towers(robot.team, new_type) |
67 | 67 |
|
68 | 68 | def run_round(self): |
| 69 | + def run_turn(robot: Robot): |
| 70 | + start_time = time.time_ns() |
| 71 | + robot.turn() |
| 72 | + run_time = time.time_ns() - start_time |
| 73 | + self.team_info.add_execution_time(robot.team, run_time) |
| 74 | + if self.team_info.get_execution_time(robot.team) >= GameConstants.MAX_TEAM_EXECUTION_TIME: |
| 75 | + self.resign(robot.team) |
| 76 | + |
69 | 77 | if self.running: |
70 | 78 | self.round += 1 |
71 | 79 | self.game_fb.start_round(self.round) |
72 | 80 | self.update_resource_patterns() |
73 | 81 | self.each_robot(lambda robot: robot.process_beginning_of_round()) |
74 | | - self.each_robot_update(lambda robot: robot.turn()) |
| 82 | + self.each_robot_update(run_turn) |
75 | 83 | self.serialize_team_info() |
76 | 84 | self.team_info.process_end_of_round() |
77 | 85 | self.game_fb.end_round() |
@@ -250,6 +258,9 @@ def set_winner_arbitrary(self): |
250 | 258 | self.set_winner(Team.A if random.random() < 0.5 else Team.B, DominationFactor.WON_BY_DUBIOUS_REASONS) |
251 | 259 | return True |
252 | 260 |
|
| 261 | + def resign(self, team: Team): |
| 262 | + self.set_winner(team.opponent(), DominationFactor.RESIGNATION) |
| 263 | + |
253 | 264 | def run_tiebreakers(self): |
254 | 265 | if self.set_winner_if_more_area(): return |
255 | 266 | if self.set_winner_if_more_allied_towers(): return |
@@ -584,12 +595,17 @@ def create_methods(self, rc: RobotController): |
584 | 595 | 'upgrade_tower': rc.upgrade_tower, |
585 | 596 | 'resign': rc.resign, |
586 | 597 | 'disintegrate': rc.disintegrate, |
| 598 | + 'yield_turn': (rc.yield_turn, 0), |
| 599 | + 'get_bytecode_num': (rc.get_bytecode_num, 0), |
| 600 | + 'get_bytecodes_left': (rc.get_bytecodes_left, 0), |
| 601 | + 'get_time_elapsed': (rc.get_time_elapsed, 0), |
| 602 | + 'get_time_left': (rc.get_time_left, 0), |
587 | 603 | 'set_indicator_string': rc.set_indicator_string, |
588 | 604 | 'set_indicator_dot': rc.set_indicator_dot, |
589 | 605 | 'set_indicator_line': rc.set_indicator_line, |
590 | | - 'set_timeline_marker': rc.set_timeline_marker, |
| 606 | + 'set_timeline_marker': rc.set_timeline_marker |
591 | 607 | } |
592 | | - |
| 608 | + |
593 | 609 | def create_patterns(self): |
594 | 610 | resource_pattern = [ |
595 | 611 | [True, True, False, True, True], |
|
0 commit comments