Как реализовать неблокирующие, последовательные ходы ИИ в многопользовательской шахматной игре в каналах django?

Я разрабатываю сайт для игры в специальную разновидность шахмат с помощью React и Django.

Для этого необходимо играть в две игры одновременно. Сайт позволяет добавлять игроков с искусственным интеллектом, так что общий сценарий состоит в том, что есть доска 1 (человек против AI) и доска 2 (AI против AI). Я хочу, чтобы компьютерные игроки вели себя так, чтобы они играли ход, ждали секунду, а затем позволяли играть другому игроку, не блокируя другие игры. Проблема в том, что следующий код заставляет всю игру AI vs AI играть в мгновение ока и делает невозможным отправку и получение каких-либо событий (даже событие game.start не отправляется).

Вот мой код, который запускает компьютеры, играющие друг против друга:

   for game in started_games:
            await self.channel_layer.group_send(
                self.room_group_name, {'type': 'game.start'})

            if self.is_ai_turn_in_game(game):
                if game.gamemode == GameMode.CLASSICAL.value:
                    board = chess.Board(fen=game.fen)
                else:
                    board = chess.variant.CrazyhouseBoard(fen=game.fen)

                print(self.is_ai_turn_in_game(game))
                while self.is_ai_turn_in_game(game):
                    await self.handle_ai_turn(game, board)
                    await self.send_move_to_clients(game)

self.send_move_to_clients обрабатывает некоторые данные, затем вызывает

            await self.channel_layer.group_send(
                self.room_group_name, {'type': 'game.move', 'message': response_data}
            )

, который выполняет следующий код:

    async def game_move(self, event):
        move = event['message']
        await self.send(json.dumps(move))
        await asyncio.sleep(1)

Мне интересно, должен ли я использовать здесь поток, или, возможно, я неправильно понимаю, как функционируют циклы событий async.

Вернуться на верх