private void GameLoop() { // TODO: Refactor think about switching over to static (class based) json desererialization result = client.CurrentUserGames(); var user = result["user"]; var friends = result["user"]["friends"]; var games = result["user"]["games"]; int activeGamesCount = 0; foreach (var game in games) { string game_id = (string)game["game_id"]; var gameState = (GameState)(int)game["state"]; var opponent = game["opponent"]; List <int> opponent_answers = game["opponent_answers"].Select(i => (int)i).ToList(); List <int> my_answers = game["your_answers"].Select(i => (int)i).ToList(); bool my_turn = (bool)game["your_turn"]; int elapsed_min = (int)game["elapsed_min"]; // Count the Active Games, and GiveUp on any games that are beyond the timeout if (gameState == GameState.Active) { activeGamesCount++; if (!my_turn && elapsed_min > maxGameTime) { activeGamesCount--; Console.WriteLine("Giving up game {0} against {1}", game_id, opponent["name"]); client.GiveUp(game_id); } } // First we accept any game requests, answer them the next iteration if (gameState == GameState.Waiting && my_turn) { activeGamesCount++; Console.WriteLine("Accepting game {0} invite from: {1}", game_id, opponent["name"]); client.AcceptGame(game_id); } // Answer the questions else if (gameState == GameState.Active && my_turn) { int answerCount = client.GetRequiredAnswerCount(game); int category_id = client.GetCorrectCategoryID(game, answerCount); int[] roundAnswers = new int[answerCount]; // This is the final round, so we can remove it from the activeGames if (answerCount == 3 && opponent_answers.Count > 0) { activeGamesCount--; } int correctCount = 0; for (int i = 0; i < roundAnswers.Length; i++) { int answer = client.GetAnswer(correctAnswerChance); if (answer == 0) { correctCount++; } roundAnswers[i] = answer; } // TODO: Refactor this list madness. Console.WriteLine("Answering {0} questions against: {1} [correct: {2}]", answerCount, opponent["name"], correctCount); var answers = new List <int>(my_answers); answers.AddRange(roundAnswers); client.UploadRoundAnswers(game_id, answers.ToArray(), category_id); } } // Stats var stats = client.CategoryStats(); int rank = (int)stats["rank"]; int numberOfUsers = (int)stats["n_users"]; Console.WriteLine("---\nCurrently playing in {0} active games.", activeGamesCount); Console.WriteLine("My current rank is {0}/{1}", rank, numberOfUsers); Console.WriteLine("---"); // Create new Games int gamesToStart = this.gamesToStart; if ((activeGamesCount + gamesToStart) < maxGameCount) { gamesToStart += maxGameCount - (activeGamesCount + gamesToStart); } for (int i = 0; i < gamesToStart; i++) { var newGame = client.StartRandomGame(); Console.WriteLine("Starting random game against: {0}", newGame["game"]["opponent"]["name"]); } }