private async Task SendChessPiecesAndMovesMessageAsync(ChessGameSession session) { var movesAndPiecesMessage = new ChessPiecesAndMovesMessage() { AvailableMoves = session.GetAvailableMoves(), Pieces = session.GetAvailablePieces() }; await messageSender.SendMessageAsync(session.PlayerOne.Socket, movesAndPiecesMessage); await messageSender.SendMessageAsync(session.PlayerTwo.Socket, movesAndPiecesMessage); }
public void NewGame() { // delete cache of last game if (File.Exists(SESSION_CACHE_FILE)) { File.Delete(SESSION_CACHE_FILE); } // show new game dialog var dlg = new NewGameView(); var dlgContext = new NewGameViewModel(dlg); dlg.DataContext = dlgContext; var result = dlg.ShowDialog(); if (result == true) { // init new game session with user inputs from dialog var humanPlayer = new UIChessPlayer(dlgContext.DrawingSide); var artificialPlayer = new ArtificialChessPlayer(dlgContext.DrawingSide.Opponent(), dlgContext.Difficulty); _session = dlgContext.DrawingSide == ChessColor.White ? new ChessGameSession(humanPlayer, artificialPlayer) : new ChessGameSession(artificialPlayer, humanPlayer); _player = humanPlayer; _session.BoardChanged += boardChanged; Board.UpdatePieces(ChessBitboard.StartFormation); // tell the player which side he draws if he choose random side if (dlgContext.SelectedDrawingSideMode == DrawingSideMode.Random) { MessageBox.Show($"You draw the { dlgContext.DrawingSide.ToString() } pieces!", "Random Side Selection", MessageBoxButton.OK, MessageBoxImage.Information); } // update status bar Status.InitNewGame(); // start the game session in a background thread (async) Task.Run(() => { // play game (until one player loses) var final = _session.ExecuteGame(); // update status bar var finalStatus = ChessDrawSimulator.Instance.GetCheckGameStatus(_session.Board, _session.Game.LastDraw); Status.FinishGame(finalStatus); // reset game session Board.UpdateIsEnabled(false); }); } // make the chess board inactive unless a game session is active updateIsBoardActive(); }
private async Task SendStalemateAsync(ChessGameSession session) { var stalemateMsg = new ChessPlayResultMessage() { Message = PlayResult.Draw.ToString() }; await messageSender.SendMessageAsync(session.PlayerOne.Socket, stalemateMsg); await messageSender.SendMessageAsync(session.PlayerTwo.Socket, stalemateMsg); await SendChessPiecesAndMovesMessageAsync(session); }
private async Task SendToBothAsync(ChessGameSession session, IPlayer sender, PlayResult result) { var otherPlayer = GetOtherPlayer(session, sender); var msgToSend = new ChessPlayResultMessage() { Message = result.ToString() }; await messageSender.SendMessageAsync(sender.Socket, msgToSend); msgToSend.IsClientTurn = true; await messageSender.SendMessageAsync(otherPlayer.Socket, msgToSend); await SendChessPiecesAndMovesMessageAsync(session); }
public void ReloadLastGame() { // check if a session cache is existing if (File.Exists(SESSION_CACHE_FILE)) { // reload last session from cache var session = ChessGameSessionSerializer.Instance.Deserialize(SESSION_CACHE_FILE); var humanPlayer = new List <UIChessPlayer>() { session.WhitePlayer as UIChessPlayer, session.BlackPlayer as UIChessPlayer }.First(x => x != null); _session = session; _player = humanPlayer; _session.BoardChanged += boardChanged; updateIsBoardActive(); } }
private async Task SendGameFinishedAsync(ChessGameSession session, IPlayer winner) { var loser = GetOtherPlayer(session, winner); var msgToWinner = new ChessPlayResultMessage() { Message = PlayResult.YouWin.ToString() }; var msgToLoser = new ChessPlayResultMessage() { Message = PlayResult.YouLose.ToString() }; await messageSender.SendMessageAsync(winner.Socket, msgToWinner); await messageSender.SendMessageAsync(loser.Socket, msgToLoser); await SendChessPiecesAndMovesMessageAsync(session); }
public async Task HandleMessageAsync(IPlayer player, IReceivedMessage message) { var findChessGameMessage = (FindChessGameMessage)message; if (player.GameSessionGUID != Guid.Empty) { await collections.RemovePlayer(player); collections.AddPlayer(player); } var expectedGame = new ExpectedChess(); player.SetAsSearchingForGame(expectedGame); try { var opponent = collections.FindPlayerSearchingForGame(player); ChessGameSession session = (ChessGameSession)sessionFactory .Create(player, opponent, expectedGame); collections.AddSession(session); logger.LogInformation("Created new chess game session."); await messageSender.SendMessageAsync(player.Socket, new GameFoundMessage(true)); await messageSender.SendMessageAsync(opponent.Socket, new GameFoundMessage(false)); var piecesAndMovesMessage = new ChessPiecesAndMovesMessage() { AvailableMoves = session.GetAvailableMoves(), Pieces = session.GetAvailablePieces() }; await messageSender.SendMessageAsync(player.Socket, piecesAndMovesMessage); await messageSender.SendMessageAsync(opponent.Socket, piecesAndMovesMessage); } catch (InvalidOperationException) { } }
public void Serialize(string filePath, ChessGameSession session) { // TODO: implement logic }