コード例 #1
0
ファイル: Game.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task <(GameStateResponse, bool)> WaitTillGameIsReady(string gameToken)
        {
            GameStateResponse gs = await CheckStatusSafe(gameToken);

            int pauseCount = 0;

            if (gs.winnerId == null)
            {
                while (!(gs.actualPlayerId == UserId && gs.playerCrossId != null && gs.playerCircleId != null) && pauseCount < 15 && gs.winnerId == null)
                {
                    if (pauseCount < 10)
                    {
                        await Task.Delay(250);
                    }
                    else
                    {
                        await Task.Delay(4000);
                    }
                    gs = await CheckStatusSafe(gameToken);

                    if (Verbose)
                    {
                        Console.Write(".");
                    }
                    pauseCount++;
                }
                if (Verbose)
                {
                    Console.WriteLine();
                }
                PrepareBoard(gs);
            }
            return(gs, pauseCount < 15);
        }
コード例 #2
0
ファイル: GameLocal.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task Run(string gameToken = null, bool infinite = true, bool returnIfNotMyTurn = false, int workerNum = 0)
        {
            bool runFirstTime           = true;
            GameStateResponse gameState = new GameStateResponse();
            bool waitingSuccessfull     = true;

            while (infinite || runFirstTime)
            {
                runFirstTime = false;
                if (Debug)
                {
                    Console.WriteLine($"1 runFirstTime {runFirstTime} infinite {infinite}");
                }

                if (gameToken == null)
                {
                    Console.WriteLine($"WorkerNum: {workerNum} \tWaiting for game.");
                    gameToken = await ConnectSafe();
                }

                gameState = await CheckStatusSafe(gameToken);

                if (returnIfNotMyTurn && gameState.winnerId == null && CheckPlayer(gameState.actualPlayerId) == 2)
                {
                    Console.WriteLine($"WorkerNum: {workerNum} \tWaiting for other player, resuming.");
                    return;
                }

                if (gameState.winnerId == null)
                {
                    Console.WriteLine($"WorkerNum: {workerNum} \tStarting a new game.");
                    Console.WriteLine($"WorkerNum: {workerNum} \tgameToken: {gameToken}");
                    try
                    {
                        waitingSuccessfull = true;
                        while (gameState.winnerId == null && waitingSuccessfull)
                        {
                            (gameState, waitingSuccessfull) = await WaitTillGameIsReady(gameToken);

                            if (Verbose)
                            {
                                Console.WriteLine($"gameToken: {gameToken}");
                            }
                            if (waitingSuccessfull)
                            {
                                gameState = await PlayMove(gameToken, gameState);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        log.Information(gameToken);
                        log.Information(e.ToString());
                    }
                }
                Console.WriteLine($"WorkerNum: {workerNum} \tFinishing game, WinningPlayer: {CheckPlayer(gameState.winnerId)}");
            }
        }
コード例 #3
0
ファイル: Game.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task <(Board, GameStateResponse)> Resume(string gameToken)
        {
            Board             board     = new Board(BoardSize, BoardSize, BoardStartPos, BoardStartPos);
            GameStateResponse gameState = await CheckStatusSafe(gameToken);

            board = PrepareBoard(gameState);

            return(board, gameState);
        }
コード例 #4
0
ファイル: Game.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task <GameStateResponse> PlayMove(string gameToken, GameStateResponse gs)
        {
            if (gs.winnerId == null && gs.actualPlayerId == UserId)
            {
                Board board = PrepareBoard(gs);
                int   moveX = 0; int moveY = 0;

                if (board.BoardIsEmpty)
                {
                    moveX = -BoardStartPos; moveY = -BoardStartPos;
                }
                else
                {
                    string boardString = board.BoardToString();
                    if (!MoveCache.ContainsKey(boardString))
                    {
                        EngineResponse result = await engineHandler.GetMoveAsync(
                            boardString, CheckPlayer(gs.actualPlayerId), threadNum : 1
                            );

                        moveX = Int32.Parse(result.result["move_c"]);
                        moveY = Int32.Parse(result.result["move_r"]);
                        MoveCache[boardString] = new Move
                        {
                            playerId = null,
                            x        = moveX,
                            y        = moveY
                        };
                    }
                    else
                    {
                        Move move = MoveCache[boardString];
                        moveX = move.x;
                        moveY = move.y;
                    }

                    if (Debug)
                    {
                        Console.WriteLine($"{moveX} {moveY}");
                    }
                }
                gs = await SendMoveSafe(gameToken, moveX, moveY);

                if (Verbose)
                {
                    Console.WriteLine($"{CheckPlayer(gs.actualPlayerId)} {moveX} {moveY}");
                }

                if (Verbose)
                {
                    board.PrintBoard(offset: 20);
                }
            }
            return(gs);
        }
コード例 #5
0
        public async Task Run(int workerNum = 0)
        {
            GameStateResponse gameState = new GameStateResponse();
            string            gameToken = null;
            bool waitingSuccessfull     = true;

            while (true)
            {
                long currentQueueLength = await db.RecordsLengthAsync <GameState>("WaitingQueue");

                if (currentQueueLength == 0)
                {
                    Console.WriteLine($"WorkerNum: {workerNum} \tWaiting for game.");
                    await Task.Delay(500);
                }
                else
                {
                    var gameStateWrapper = await db.LoadRecordAsync <GameState>("WaitingQueue");

                    db.DeleteRecord <GameState>("WaitingQueue", gameStateWrapper.GameToken);
                    gameToken = gameStateWrapper.GameToken;
                    gameState = await CheckStatusSafe(gameToken);

                    if (gameState.winnerId == null && CheckPlayer(gameState.actualPlayerId) == 2)
                    {
                        Console.WriteLine($"WorkerNum: {workerNum} \tWaiting for other player, skipping.");
                        continue;
                    }

                    if (gameState.winnerId == null)
                    {
                        Console.WriteLine($"WorkerNum: {workerNum} \tStarting a new game.");
                        Console.WriteLine($"WorkerNum: {workerNum} \tgameToken: {gameToken}");

                        waitingSuccessfull = true;
                        while (gameState.winnerId == null && waitingSuccessfull)
                        {
                            (gameState, waitingSuccessfull) = await WaitTillGameIsReady(gameToken);

                            if (Verbose)
                            {
                                Console.WriteLine($"gameToken: {gameToken}");
                            }
                            if (waitingSuccessfull)
                            {
                                gameState = await PlayMove(gameToken, gameState);
                            }
                            await Task.Delay(333);
                        }
                    }
                    Console.WriteLine($"WorkerNum: {workerNum} \tFinishing game, WinningPlayer: {CheckPlayer(gameState.winnerId)}");
                }
            }
        }
コード例 #6
0
ファイル: Database.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task <GameStateResponse> CheckStatus(string gameToken)
        {
            var payload = new Dictionary <string, object> {
                { "userToken", UserToken },
                { "gameToken", gameToken }
            };
            Stream resultStream = await PostMethod("/api/v1/checkStatus", payload);

            GameStateResponse response = await JsonSerializer.DeserializeAsync <GameStateResponse>(resultStream);

            return(response);
        }
コード例 #7
0
ファイル: Game.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task <GameStateResponse> SendMove(string gameToken, int moveX, int moveY)
        {
            var payload = new Dictionary <string, object> {
                { "userToken", UserToken },
                { "gameToken", gameToken },
                { "positionX", moveX + BoardStartPos },
                { "positionY", moveY + BoardStartPos }
            };
            Stream resultStream = await PostMethod("/api/v1/play", payload);

            GameStateResponse response = await JsonSerializer.DeserializeAsync <GameStateResponse>(resultStream);

            return(response);
        }
コード例 #8
0
ファイル: GameLocal.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task RunWithTokenFeeder(int workerNum = 0, bool skipIfNotMyTurn = false)
        {
            string            gameToken = null;
            GameStateResponse gameState = new GameStateResponse();
            bool waitingSuccessfull     = true;

            while (true)
            {
                if (GameTokenQueue.Count == 0)
                {
                    return;
                }
                Console.WriteLine($"WorkerNum: {workerNum} \tWaiting for game.");
                gameToken = await WaitForTokenFeeder(workerNum : workerNum);

                if (gameToken == "")
                {
                    return;
                }
                gameState = await CheckStatusSafe(gameToken);

                if (skipIfNotMyTurn && gameState.winnerId == null && CheckPlayer(gameState.actualPlayerId) == 2)
                {
                    Console.WriteLine($"WorkerNum: {workerNum} \tWaiting for other player, skipping.");
                    continue;
                }

                if (gameState.winnerId == null)
                {
                    Console.WriteLine($"WorkerNum: {workerNum} \tStarting a new game.");
                    Console.WriteLine($"WorkerNum: {workerNum} \tgameToken: {gameToken}");

                    waitingSuccessfull = true;
                    while (gameState.winnerId == null && waitingSuccessfull)
                    {
                        (gameState, waitingSuccessfull) = await WaitTillGameIsReady(gameToken);

                        if (waitingSuccessfull)
                        {
                            gameState = await PlayMove(gameToken, gameState);
                        }
                        await Task.Delay(333);
                    }
                }
                Console.WriteLine($"WorkerNum: {workerNum} \tFinishing game, WinningPlayer: {CheckPlayer(gameState.winnerId)}");
            }
        }
コード例 #9
0
ファイル: Database.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task <GameStateResponse> CheckStatusSafe(string gameToken)
        {
            bool success = true;
            GameStateResponse response = new GameStateResponse();

            try
            {
                response = await CheckStatus(gameToken);

                success = true;
            }
            catch (Exception e)
            {
                if (e.ToString().Contains("System.Text.Json.JsonReaderException"))
                {
                    Console.WriteLine("Failed web API request.");
                }
                log.Information(e.ToString());
                success = false;
            }
            while (!success)
            {
                await Task.Delay(CatchDelay);

                try
                {
                    response = await CheckStatus(gameToken);

                    success = true;
                }
                catch (Exception e)
                {
                    if (e.ToString().Contains("System.Text.Json.JsonReaderException"))
                    {
                        Console.WriteLine("Failed web API request.");
                    }
                    log.Information(e.ToString());
                    success = false;
                }
            }
            return(response);
        }
コード例 #10
0
        public async Task WaitForMaturedTokens()
        {
            List <GameState> maturingGameStates = new List <GameState>();

            while (true)
            {
                maturingGameStates = await db.LoadRecordsAsync <GameState>("MaturingQueue");

                foreach (GameState gs in maturingGameStates)
                {
                    GameStateResponse response = await CheckStatusSafe(gs.GameToken);

                    GameState gs_new = new GameState
                    {
                        GameToken      = gs.GameToken, // new Guid(gameToken),
                        PlayerCrossId  = response.playerCrossId,
                        PlayerCircleId = response.playerCircleId,
                        ActualPlayerId = response.actualPlayerId,
                        WinnerId       = response.winnerId
                    };

                    if (gs_new.PlayerCrossId != null & gs_new.PlayerCircleId != null && gs_new.ActualPlayerId == UserId)
                    {
                        db.DeleteRecord <GameState>("MaturingQueue", gs.GameToken);
                        GameState gsWaiting = db.LoadRecordsById <GameState>("WaitingQueue", gs.GameToken);
                        if (gsWaiting == null)
                        {
                            db.InsertRecord <GameState>("WaitingQueue", gs_new);
                        }
                        else
                        {
                            db.UpsertRecord <GameState>("WaitingQueue", gs.GameToken, gs_new);
                        }
                        Console.WriteLine($"TokenMaturer: \tPassed token: {gs.GameToken}");
                    }
                    await Task.Delay(100);
                }
                await Task.Delay(500);
            }
        }
コード例 #11
0
ファイル: Database.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public void AddToken(string gameToken, GameStateResponse gameStateResponse)
        {
            GameState gameState = new GameState
            {
                GameToken      = gameToken, // new Guid(gameToken),
                PlayerCrossId  = gameStateResponse.playerCrossId,
                PlayerCircleId = gameStateResponse.playerCircleId,
                ActualPlayerId = gameStateResponse.actualPlayerId,
                WinnerId       = gameStateResponse.winnerId
            };


            GameState response = db.LoadRecordsById <GameState>("GameTokens", gameToken);

            if (response == null)
            {
                db.InsertRecord <GameState>("GameTokens", gameState);
            }
            else
            {
                db.UpsertRecord <GameState>("GameTokens", gameToken, gameState);
            }
        }
コード例 #12
0
ファイル: Game.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public Board PrepareBoard(GameStateResponse gameState)
        {
            Board board     = new Board(BoardSize, BoardSize, BoardStartPos, BoardStartPos);
            int   playerNum = 1;

            foreach (Move move in gameState.coordinates)
            {
                if (move.playerId == UserId)
                {
                    playerNum = 1;
                }
                else
                {
                    playerNum = 2;
                }

                board.Move(playerNum, move.x, move.y, relative: true);
                if (Debug)
                {
                    Console.WriteLine($"{move.x} {move.y}");
                }
            }
            return(board);
        }
コード例 #13
0
        public async Task AddToMaturingQueue(string gameToken)
        {
            GameStateResponse response = await CheckStatusSafe(gameToken);

            GameState gameState = new GameState
            {
                GameToken      = gameToken, // new Guid(gameToken),
                PlayerCrossId  = response.playerCrossId,
                PlayerCircleId = response.playerCircleId,
                ActualPlayerId = response.actualPlayerId,
                WinnerId       = response.winnerId
            };

            GameState checkResponse = db.LoadRecordsById <GameState>("MaturingQueue", gameToken);

            if (checkResponse == null)
            {
                db.InsertRecord <GameState>("MaturingQueue", gameState);
            }
            else
            {
                db.UpsertRecord <GameState>("MaturingQueue", gameToken, gameState);
            }
        }
コード例 #14
0
ファイル: Database.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public async Task UpdateTokenAsync(string gameToken)
        {
            GameStateResponse response = await CheckStatusSafe(gameToken);

            AddToken(gameToken, response);
        }
コード例 #15
0
ファイル: Database.cs プロジェクト: detrin/PiskvorkyJobsCZ
        public void UpdateToken(string gameToken)
        {
            GameStateResponse response = CheckStatusSafe(gameToken).GetAwaiter().GetResult();

            AddToken(gameToken, response);
        }