def start_game(self, snake_ids): """ Start a game given a tuple of snake id's. Returning a game id. """ if len(snake_ids) == 1: return game = Game(width=11, height=11, max_turns_to_next_food_spawn=12) game.save() logger.info(f"starting game id={game.id}") for s in Snake.objects.filter(id__in=snake_ids): game.snakes.add(s) GameSnake.objects.create(snake=s, game=game) game.save() game.create() game.run() GameLeaderboard(game=game).save()
def create(self, *args, **kwargs): heat = kwargs.get("heat") previous_game = heat.latest_game skip = [w.snake.id for w in heat.winners] if previous_game is not None: if previous_game.winner is None: raise PreviousGameTiedException() skip.append(previous_game.winner.snake.id) next_snakes = [ sh.snake for sh in previous_game.snakes if sh.snake.id not in skip ] else: next_snakes = [sh.snake for sh in heat.snakes] max_turns = 15 if heat.round.tournament_bracket.board_max_turns_to_next_food_spawn is not None: max_turns = heat.round.tournament_bracket.board_max_turns_to_next_food_spawn game = Game( width=heat.round.tournament_bracket.board_width, height=heat.round.tournament_bracket.board_height, max_turns_to_next_food_spawn=max_turns, engine_url=heat.round.tournament_bracket.tournament.engine_url, ) game.save() snake_ids = [snake.id for snake in next_snakes] snakes = (TournamentSnake.objects.filter( snake__id__in=snake_ids, bracket=heat.round.tournament_bracket).prefetch_related( "snake").prefetch_related("team")) for ts in snakes: game.snakes.add(ts.snake) GameSnake.objects.create(snake=ts.snake, game=game, name=ts.team.name) game.save() game.create() return super(HeatGameManager, self).create(*args, **kwargs, game=game)