示例#1
0
        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);
        }
示例#2
0
        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();
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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();
            }
        }
示例#6
0
        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);
        }
示例#7
0
        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) { }
        }
示例#8
0
 public void Serialize(string filePath, ChessGameSession session)
 {
     // TODO: implement logic
 }