22
33import logging
44import os
5- from random import Random
65import subprocess
76import sys
87import time
1413from .gamestate_filters import noiser , update_food_age , relocate_expired_food
1514from .layout import initial_positions , get_legal_positions
1615from .network import setup_controller , ZMQPublisher
16+ from .base_utils import default_rng
1717from .team import make_team
1818from .viewer import ProgressViewer , AsciiViewer , ReplyToViewer , ReplayWriter , ResultPrinter
1919
@@ -88,7 +88,7 @@ def controller_exit(state, await_action='play_step'):
8888 return False
8989
9090def run_game (team_specs , * , layout_dict , layout_name = "" , max_rounds = 300 ,
91- seed = None , allow_camping = False , error_limit = 5 , timeout_length = 3 ,
91+ rng = None , allow_camping = False , error_limit = 5 , timeout_length = 3 ,
9292 viewers = None , viewer_options = None , store_output = False ,
9393 team_names = (None , None ), team_infos = (None , None ),
9494 allow_exceptions = False , print_result = True ):
@@ -119,8 +119,8 @@ def run_game(team_specs, *, layout_dict, layout_name="", max_rounds=300,
119119 max_rounds : int
120120 The maximum number of rounds to play before the game is over. Default: 300.
121121
122- seed : int
123- seed used to initialize the random number generator .
122+ rng : random.Random | int | None
123+ random number generator or a seed used to initialize a new one .
124124
125125 error_limit : int
126126 The limit of non fatal errors to reach for a team before the
@@ -196,7 +196,7 @@ def run_game(team_specs, *, layout_dict, layout_name="", max_rounds=300,
196196 layout_name = layout_name , max_rounds = max_rounds ,
197197 allow_camping = allow_camping ,
198198 error_limit = error_limit , timeout_length = timeout_length ,
199- seed = seed , viewers = viewers ,
199+ rng = rng , viewers = viewers ,
200200 viewer_options = viewer_options ,
201201 store_output = store_output , team_names = team_names ,
202202 team_infos = team_infos ,
@@ -271,7 +271,7 @@ def setup_viewers(viewers=None, options=None, print_result=True):
271271 return viewer_state
272272
273273
274- def setup_game (team_specs , * , layout_dict , max_rounds = 300 , layout_name = "" , seed = None ,
274+ def setup_game (team_specs , * , layout_dict , max_rounds = 300 , layout_name = "" , rng = None ,
275275 allow_camping = False , error_limit = 5 , timeout_length = 3 ,
276276 viewers = None , viewer_options = None , store_output = False ,
277277 team_names = (None , None ), team_infos = (None , None ),
@@ -313,6 +313,8 @@ def setup_game(team_specs, *, layout_dict, max_rounds=300, layout_name="", seed=
313313
314314 viewer_state = setup_viewers (viewers , options = viewer_options , print_result = print_result )
315315
316+ rng = default_rng (rng )
317+
316318 # Initialize the game state.
317319
318320 game_state = dict (
@@ -415,7 +417,7 @@ def setup_game(team_specs, *, layout_dict, max_rounds=300, layout_name="", seed=
415417 teams = [None ] * 2 ,
416418
417419 #: Random number generator
418- rnd = Random ( seed ) ,
420+ rng = rng ,
419421
420422 #: Timeout length, int, None
421423 timeout_length = timeout_length ,
@@ -534,7 +536,7 @@ def prepare_bot_state(game_state, idx=None):
534536 # We assume that we are in get_initial phase
535537 turn = idx
536538 bot_turn = None
537- seed = game_state ['rnd ' ].randint (0 , sys .maxsize )
539+ seed = game_state ['rng ' ].randint (0 , sys .maxsize )
538540 elif bot_finalization :
539541 # Called for remote players in _exit
540542 turn = idx
@@ -555,7 +557,7 @@ def prepare_bot_state(game_state, idx=None):
555557 enemy_positions = enemy_positions ,
556558 noise_radius = game_state ['noise_radius' ],
557559 sight_distance = game_state ['sight_distance' ],
558- rnd = game_state ['rnd ' ])
560+ rng = game_state ['rng ' ])
559561
560562
561563 # Update noisy_positions in the game_state
@@ -669,7 +671,7 @@ def prepare_viewer_state(game_state):
669671
670672 # remove unserializable values
671673 del viewer_state ['teams' ]
672- del viewer_state ['rnd ' ]
674+ del viewer_state ['rng ' ]
673675 del viewer_state ['viewers' ]
674676 del viewer_state ['controller' ]
675677
@@ -855,7 +857,7 @@ def apply_move(gamestate, bot_position):
855857 # There was an error for this round and turn
856858 # but the game is not over.
857859 # We execute a random move
858- bot_position = gamestate ['rnd ' ].choice (legal_positions )
860+ bot_position = gamestate ['rng ' ].choice (legal_positions )
859861 game_print (turn , f"Setting a legal position at random: { bot_position } " )
860862
861863 # take step
0 commit comments