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); }
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)}"); } }
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); }
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); }
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)}"); } } }
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); }
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); }
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)}"); } }
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); }
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); } }
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); } }
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); }
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); } }
public async Task UpdateTokenAsync(string gameToken) { GameStateResponse response = await CheckStatusSafe(gameToken); AddToken(gameToken, response); }
public void UpdateToken(string gameToken) { GameStateResponse response = CheckStatusSafe(gameToken).GetAwaiter().GetResult(); AddToken(gameToken, response); }