示例#1
0
        private async Task <List <IPlayer> > RequestOnlinePlayer()
        {
            var players = new List <IPlayer>();
            OnlineGameResponse waitingResponse = new OnlineGameResponse();

            isRequestingOnlineGame = true;
            while (!waitingResponse.IsReady && !isOnlineGameRequestCancelled)
            {
                waitingResponse = await proxy.OnlineGameRequest(myOnlineId);

                myOnlineId = waitingResponse.PlayerId;

                //Quit requesting online game when isOnlineGameRequestCancelled is true
                //(user is not in online game page)
                if (isOnlineGameRequestCancelled)
                {
                    break;
                }
                if (waitingResponse.IsReady)
                {
                    StartGameResponse startGameResponse =
                        await proxy.ConfirmToPlay(waitingResponse.PlayerId);

                    if (startGameResponse.IsConfirmed)
                    {
                        if (startGameResponse.YourTurn)
                        {
                            players.Add(playerFactory.Create(PlayerType.Human, waitingResponse.PlayerId));
                            players.Add(playerFactory.Create(PlayerType.OnlinePlayer, 0));
                        }
                        else
                        {
                            players.Add(playerFactory.Create(PlayerType.OnlinePlayer, 0));
                            players.Add(playerFactory.Create(PlayerType.Human, waitingResponse.PlayerId));
                        }
                    }
                    else
                    {
                        waitingResponse.IsReady = false;
                    }
                }
            }
            isRequestingOnlineGame = false;
            return(players);
        }
示例#2
0
        public async Task <OnlineGameResponse> OnlineGameRequest(int playerId)
        {
            OnlineGameResponse response;
            IPlayer            rivalPlayer;

            IPlayer player = Logic.NewPlayer(playerId);

            Logger.Info("Player{0} requested to play", player.OnlineId);
            Logic.WaitingPlayers.Add(player);

            if (Logic.WaitingPlayers.TryTake(out rivalPlayer, 5000, rp => rp.OnlineId != player.OnlineId))
            {
                Logger.Info("Rival (Player{0}) was found for Player{1}", rivalPlayer.OnlineId, player.OnlineId);
                List <IPlayer> players = RandomGenerator.Next(2) == 0 ? new List <IPlayer>()
                {
                    rivalPlayer, player
                }
                                                                     : new List <IPlayer>()
                {
                    player, rivalPlayer
                };
                if (Logic.NewGame(players))
                {
                    Logger.Info("New game created for: Player{0} (will start) and Player{1}.", players[0].OnlineId, players[1].OnlineId);
                }
                response = new OnlineGameResponse(player.OnlineId, true);
            }
            else
            {
                Logger.Info("Rival wasn't found for Player{0}", player.OnlineId);
                Logic.WaitingPlayers.Remove(player);
                response = new OnlineGameResponse(player.OnlineId, false);
            }
            Logger.Info("OnlineGameResponse was send back to client: Player{0}", player.OnlineId);
            return(await Task.Factory.StartNew(() => response));
        }