Exemplo n.º 1
0
        public async void PlayGame(Game game)
        {
            bool gameOver = false;

            while (!gameOver)
            {
                ResetQuestion(game);

                //Get a new question
                Question newQuestion = await _triviaService.GetQuestion(game.Difficulty);

                game.CurrentQuestion = newQuestion;
                SendDataToPlayers(game, "newQuestion", newQuestion);

                //Every half-second, check if all players have responded. End after 30 seconds.
                for (int i = 0; i < 60; i++)
                {
                    Thread.Sleep(500);
                    if (game.Players.All(x => !string.IsNullOrWhiteSpace(x.LastAnswer)))
                    {
                        break;
                    }
                }
                SendDataToPlayers(game, "endQuestion");

                game.Players.Where(x => string.IsNullOrWhiteSpace(x.LastAnswer)).ToList().ForEach(player => {
                    player.LastAnswer        = "None";
                    player.LastAnswerCorrect = false;
                });
                game.LastAnswer       = newQuestion.Answer;
                game.IsQuestionActive = false;

                if (game.Players.FirstOrDefault(x => x.Score >= 100) != null)
                {
                    gameOver = true;
                    break;
                }

                if (game.Players.Count == 0)
                {
                    return;
                }

                SendDataToPlayers(game, "gameStateChange", game);

                //Wait 15 seconds before next question
                Thread.Sleep(15000);
            }

            game.IsStarted = false;

            int           topScore = game.Players.OrderByDescending(x => x.Score).First().Score;
            List <Player> winners  = game.Players.Where(x => x.Score == topScore).ToList();

            if (winners.Count == 1)
            {
                game.WinnerText = string.Format("{0} wins!", winners[0].Username);
            }
            else
            {
                for (int i = 0; i < winners.Count; i++)
                {
                    if (i == 0)
                    {
                        game.WinnerText += winners[i].Username;
                    }
                    else
                    {
                        game.WinnerText += " and " + winners[i].Username;
                    }
                }

                game.WinnerText += " win!";
            }

            SendDataToPlayers(game, "gameStateChange", game);
        }