Ejemplo n.º 1
0
        public async Task <ChessGameState> MovePieceAsync(string gameId, string playerName, string from, string to)
        {
            var dictActiveGames = await GetActiveGameDict();

            var dictCompletedGames = await GetCompletedGameDict();

            ChessGameState newGameState;
            var            board = new Board();

            using (var tx = StateManager.CreateTransaction())
            {
                var game = await GetActiveGameAsync(tx, gameId);

                if (playerName != game.White.Name && playerName != game.Black.Name)
                {
                    throw new ArgumentException("Player not in the game.");
                }

                board.PerformMoves(game.MoveHistory);
                var fromField = ChessGameUtils.FieldFromString(from);
                var toField   = ChessGameUtils.FieldFromString(to);
                var piece     = board[fromField.Item1, fromField.Item2];
                if (!piece.MoveTo(toField.Item1, toField.Item2))
                {
                    throw new ArgumentException("Illegal move.");
                }

                var newGameInfo = new ChessGameInfo(game.GameId, game.White, game.Black, board.ToMovesString());
                if (board.IsCheckmate || board.IsDraw)
                {
                    await dictActiveGames.TryRemoveAsync(tx, gameId);

                    await dictCompletedGames.TryAddAsync(tx, gameId, newGameInfo);
                }
                else
                {
                    await dictActiveGames.TryUpdateAsync(tx, gameId, newGameInfo, game);
                }

                await tx.CommitAsync();

                newGameState = new ChessGameState(newGameInfo);
            }

            var chessSignalRClient = proxyFactory.CreateServiceProxy <IChessFabrickSignalRService>(chessSignalRUri /*, ChessFabrickUtils.GuidPartitionKey(gameId)*/);

            chessSignalRClient.PieceMovedAsync(playerName, from, to, newGameState);

            if (newGameState.GetCurrentPlayer().IsBot() && !board.IsCheckmate && !board.IsDraw)
            {
                var actor = ActorProxy.Create <IChessFabrickActor>(new ActorId(gameId), chessActorUri);
                actor.PerformMove();
            }

            return(newGameState);
        }
Ejemplo n.º 2
0
        public async Task <List <string> > ListPieceMovesAsync(string gameId, string from)
        {
            Board board;

            using (var tx = StateManager.CreateTransaction())
            {
                board = await GetActiveGameBoardAsync(tx, gameId);
            }
            var moves     = new List <string>();
            var fromField = ChessGameUtils.FieldFromString(from);
            var piece     = board[fromField.Item1, fromField.Item2];

            foreach (var move in piece.GetPossibleMoves())
            {
                moves.Add(ChessGameUtils.FieldToString(move.Item1, move.Item2));
            }
            return(moves);
        }
Ejemplo n.º 3
0
        private async void FieldBox_Click(object sender, EventArgs e)
        {
            var fieldBox = sender as ChessFieldBox;
            var field    = fieldBox.Tag as Tuple <int, int>;

            showLastMove = false;

            if (selectedField == null)
            {
                selectedField = field;
                var selectedPiece = board[selectedField.Item1, selectedField.Item2];
                if (selectedPiece?.Color != playerColor || selectedPiece?.Color != gameState.OnTurn)
                {
                    selectedField = null;
                }
                if (selectedField != null)
                {
                    fieldBox.Style = ChessFieldBox.BoxStyle.Selected;
                    fieldBox.Invalidate();
                    try
                    {
                        possibleMoves = new List <Tuple <int, int> >();
                        var newPossibleMoves = new List <Tuple <int, int> >();
                        var moves            = await connection.InvokeAsync <List <string> >("GetPieceMoves", gameId,
                                                                                             ChessGameUtils.FieldToString(selectedField.Item1, selectedField.Item2)
                                                                                             );

                        foreach (var move in moves)
                        {
                            newPossibleMoves.Add(ChessGameUtils.FieldFromString(move));
                        }
                        possibleMoves = newPossibleMoves;
                    } catch (HubException ex)
                    {
                        selectedField = null;
                        possibleMoves = null;
                        Console.Error.WriteLine(ex);
                        txbMessage.Text = ex.Message;
                    }
                }
            }
            else
            {
                if (possibleMoves.Contains(field))
                {
                    try
                    {
                        gameState = await connection.InvokeAsync <ChessGameState>("MovePiece", gameId,
                                                                                  ChessGameUtils.FieldToString(selectedField.Item1, selectedField.Item2),
                                                                                  ChessGameUtils.FieldToString(field.Item1, field.Item2)
                                                                                  );
                    } catch (HubException ex)
                    {
                        Console.Error.WriteLine(ex);
                        txbMessage.Text = ex.Message;
                    }
                }
                selectedField = null;
                possibleMoves = null;
            }
            UpdateBoard();
        }
Ejemplo n.º 4
0
        private void RefreshViews()
        {
            if (board == null)
            {
                return;
            }

            labPlayerNames.Text = $"White: \n{gameState?.GameInfo?.White?.Name} \n\nBlack: \n{gameState?.GameInfo?.Black?.Name}";

            if (gameState == null)
            {
                btnAddBot.Visible = true;
                return;
            }

            btnAddBot.Visible = false;

            if (gameState.IsCheckmate)
            {
                panTable.Enabled = false;
                grbPlaying.Text  = "Checkmate";
                cfbPlaying.Image = PieceImageUtils.King(gameState.OnTurn.Other());
                if (playerColor != null)
                {
                    cfbPlaying.BackColor = gameState.OnTurn != playerColor ? Color.YellowGreen : Color.OrangeRed;
                }
            }
            else if (gameState.IsDraw)
            {
                panTable.Enabled     = false;
                grbPlaying.Text      = "Draw";
                cfbPlaying.Image     = Properties.Resources.king_multi;
                cfbPlaying.BackColor = Control.DefaultBackColor;
            }
            else
            {
                panTable.Enabled = true;
                grbPlaying.Text  = "On turn";
                cfbPlaying.Image = PieceImageUtils.Pawn(gameState.OnTurn);
                if (playerColor != null)
                {
                    cfbPlaying.BackColor = gameState.OnTurn == playerColor ? Color.YellowGreen : Control.DefaultBackColor;
                }
            }

            pieceListPanelBlack.SetPieceChars(gameState.CapturedPieces.Where(c => c >= 'a' && c <= 'z').ToList());
            pieceListPanelWhite.SetPieceChars(gameState.CapturedPieces.Where(c => c >= 'A' && c <= 'Z').ToList());

            for (int i = 0; i < 8; ++i)
            {
                for (int j = 0; j < 8; ++j)
                {
                    var fieldBox = fieldBoxes[i, j];
                    fieldBox.SuspendLayout();
                    fieldBox.Style = ChessFieldBox.BoxStyle.None;
                    fieldBox.Image = board[i, j]?.Image();
                }
            }

            if (gameState.CheckingPieces?.Count > 0)
            {
                var king = board.King(board.TurnColor);
                fieldBoxes[king.X, king.Y].Style = ChessFieldBox.BoxStyle.Checked;
                foreach (var piece in gameState.CheckingPieces)
                {
                    var field = ChessGameUtils.FieldFromString(piece);
                    fieldBoxes[field.Item1, field.Item2].Style = ChessFieldBox.BoxStyle.Checking;
                }
            }

            if (selectedField != null)
            {
                fieldBoxes[selectedField.Item1, selectedField.Item2].Style = ChessFieldBox.BoxStyle.Selected;
                if (possibleMoves != null)
                {
                    var selectedPiece = board[selectedField.Item1, selectedField.Item2];
                    foreach (var field in possibleMoves)
                    {
                        fieldBoxes[field.Item1, field.Item2].Style =
                            board[field.Item1, field.Item2] != null || (selectedPiece is Pawn && selectedPiece.X != field.Item1) ?
                            ChessFieldBox.BoxStyle.Attack : ChessFieldBox.BoxStyle.Move;
                    }
                }
            }

            if (board.LastMove != null)
            {
                var lastMove = board.LastMove;
                if (lastMove.ConnectedMove)
                {
                    lastMove = lastMove.LastMove;
                }
                labLastMove.Text = $"Last move:\n{ChessGameUtils.FieldToString(lastMove.FromX, lastMove.FromY)} => {ChessGameUtils.FieldToString(lastMove.ToX, lastMove.ToY)}";
                if (showLastMove)
                {
                    fieldBoxes[lastMove.FromX, lastMove.FromY].Style = ChessFieldBox.BoxStyle.MoveFrom;
                    fieldBoxes[lastMove.ToX, lastMove.ToY].Style     = lastMove.CapturedPiece != null ?
                                                                       ChessFieldBox.BoxStyle.MoveToCapture : ChessFieldBox.BoxStyle.MoveTo;
                }
            }

            foreach (var fieldBox in fieldBoxes)
            {
                fieldBox.ResumeLayout(false);
                fieldBox.Invalidate();
            }
        }