Esempio n. 1
0
        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"]);
            }
        }