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); }