예제 #1
0
    async def take_turn(self, message):
        player = getattr(self.game, f"player_{message.body['player_id']}")
        player.drawing_block()
        await self.pick_block(player=player, index=message.body['block_index'])
        request = await player.ws.recv()
        request = Request.deserialize(value=request)
        guess = Guess(**request.body)

        await self.guess_block(player, guess=guess)
예제 #2
0
    async def guess_block(self, player, guess: Guess):
        from_player = player  # type: Player
        to_player = getattr(self.game,
                            f'player_{guess.to_player_id}')  # type: Player
        success = from_player.guess_block(target_player=to_player,
                                          target_block_index=guess.target,
                                          guess=guess.guess)
        await self.distribute_game()
        if success:
            response = Response(action=Actions.GUESS_SUCCESS.value,
                                message="Guess Succeeded!",
                                body="")
            from_player.guessing_more()
            await self.distribute_response(response=response)
            await self.distribute_game()
            next_action_message = await player.ws.recv()
            request = Request.deserialize(value=next_action_message)

            if request.action == Actions.MAKE_GUESS.value:
                guess = Guess(**request.body)
                await self.guess_block(player, guess)

            elif request.action == Actions.YIELD_TURN.value:
                from_player.get_ready()
                self.game.swap_turn()
                next_player = getattr(self.game, f'player_{self.game.turn}')
                next_player.drawing_block()
            else:
                raise TypeError('Invalid Action type.')

        else:
            response = Response(action=Actions.GUESS_FAIL.value,
                                message="Guess Failed!",
                                body="")
            await self.distribute_response(response=response)
            from_player.get_ready()
            self.game.swap_turn()
            next_player = getattr(self.game, f'player_{self.game.turn}')
            next_player.drawing_block()
        return self.game
예제 #3
0
async def feed(request, ws, *args, **kwargs):
    session_id = kwargs.get('session_id')
    manager = on_going_sessions.get(session_id)
    if not manager:
        manager = GameManager(session_id)
        on_going_sessions[session_id] = manager
        message = "Game created!!"
    else:
        message = f"Joined the session {session_id}"

    await ws.send(ujson.dumps({
        "message": message
    }))
    manager.add_waiting(ws=ws)
    await manager.distribute_game(to_waiting=True)

    while True:
        message = await ws.recv()
        message = Request.deserialize(message)
        print(message.to_dict())

        if GameState(manager.game.state) == GameState.CREATED:
            print('Waiting for players...')
            if Actions(message.action) == Actions.ADD_PLAYER:
                await manager.add_player(name=message.body['name'], ws=ws)

            elif Actions(message.action) == Actions.START_GAME:
                print('Game started!!')
                await manager.initiate_new_game()

        elif GameState(manager.game.state) == GameState.INITIATED:
            print('pick starting blocks!!')
            await manager.update_game(message=message)

        elif GameState(manager.game.state) == GameState.PLAYING:
            print('running!!')
            await manager.update_game(message=message)