コード例 #1
0
ファイル: BoardHelper.cs プロジェクト: krisboyce/Chess
        public static IPeice[] GetSinglePeiceRow(Peice peice, int y)
        {
            var row = new IPeice[8];

            row[y] = peice;
            return(row);
        }
コード例 #2
0
        public static CommandResult Move(IBoard board, IPeice peice, int dX, int dY)
        {
            var moveCheckResult = CanMove(board, peice, dX, dY);

            if (!moveCheckResult.Success)
                return moveCheckResult;

            if (dX != 0)
            {
                var enPassantPeice = board.GetPeice(peice.X + dX, peice.Y);
                if (enPassantPeice != null)
                {
                    board.CapturePeice(enPassantPeice.X, enPassantPeice.Y);
                }
            }

            board.MovePeice(peice.X, peice.Y, peice.X + dX, peice.Y + dY);
            var xCoord = Letters.Coords[peice.X + dX];

            return CommandResult.GetSuccess($"Moved {peice.Type} to {xCoord}{peice.Y + dY}");
        }
コード例 #3
0
        public static bool CanMove(IBoard board, IPeice peice, int dX, int dY)
        {
            if (Math.Abs(dX) > 1 || Math.Abs(dY) > 1)
            {
                if (peice.HasMoved)
                {
                    return(false);
                }

                if (dY != 0)
                {
                    return(false);
                }

                var dir    = dX < 0 ? -1 : 1;
                var cursor = peice.X;
                while (cursor != peice.X + dX)
                {
                    if (new PeiceMovement().IsChecked(board, peice.Side.Equals(Side.White) ? Side.Black : Side.White, cursor, peice.Y))
                    {
                        return(false);
                    }

                    cursor += dir;
                }
            }
            else
            {
                return(false);
            }

            var blockingPeice = board.GetPeice(peice.X + dX, peice.Y + dY);

            if (blockingPeice.Side.Equals(peice.Side) && !(blockingPeice.Type.Equals(PeiceType.Castle) && !blockingPeice.HasMoved && !peice.HasMoved))
            {
                return(false);
            }

            return(!new PeiceMovement().IsChecked(board, peice.Side.Equals(Side.White) ? Side.Black : Side.White, peice.X + dX, peice.Y + dY));
        }
コード例 #4
0
ファイル: PeiceMovement.cs プロジェクト: krisboyce/Chess
        public CommandResult Move(IBoard board, IPeice ipeice, int dX, int dY)
        {
            var result = new CommandResult();
            var peice  = ipeice as Peice;

            if (peice != null)
            {
                switch (peice.Type)
                {
                case PeiceType.Pawn:
                    result = Pawn.Move(board, peice, dX, dY);
                    break;

                case PeiceType.Castle:
                    result = Castle.Move(peice, dX, dY);
                    break;

                case PeiceType.Knight:
                    break;

                case PeiceType.Bishop:
                    break;

                case PeiceType.Queen:
                    break;

                case PeiceType.King:
                    result = King.Move(peice, dX, dY);
                    break;
                }

                var king = board.GetKing(peice.Side);
                if (IsChecked(board, king.Side.Equals(Side.White) ? Side.Black : Side.White, king.X, king.Y))
                {
                    return(CommandResult.GetFail("King is in check."));
                }
            }

            return(result);
        }
コード例 #5
0
        public static CommandResult CanMove(IBoard board, IPeice peice, int dX, int dY) {

            var result = new CommandResult();

            if (peice.Type != PeiceType.Pawn)
            {
                result.Message = "Peice is not a pawn";
                return result;
            }


            if(!(peice.Side == board.Top && dY > 0 || peice.Side == board.Bottom && dY < 0))
                    return CommandResult.GetFail("Can not move in that direction.");

            if (dX == 0)
            {
                if (dY%2 == 0)
                {
                    if (peice.HasMoved)
                    {
                        return CommandResult.GetFail("Double move is only valid as first move.");
                    }
                    var blockPeice = board.GetPeice(peice.X, peice.Y + dY) ?? board.GetPeice(peice.X, peice.Y + dY/2);
                    if (blockPeice == null)
                    {
                        result.Success = true;
                        result.Message = "Peice is not blocked.";
                        return result;
                    }
                }
                else
                {
                    var blockPeice = board.GetPeice(peice.X, peice.Y + dY);
                    if (blockPeice == null)
                    {
                        result.Success = true;
                        result.Message = "Peice is not blocked.";
                        return result;
                    }
                }
            }

            var capturePeice = board.GetPeice(peice.X + dX, peice.Y + dY);
            var enPassantPeice = board.GetPeice(peice.X + dX, peice.Y);

            if (capturePeice != null)
            {
                if (capturePeice.Side.Equals(peice.Side))
                {
                    result.Success = false;
                    result.Message = "Can't capture owned peice.";
                }

                result.Success = true;
                result.Message = "Can capture peice.";
                return result;
            }

            if (enPassantPeice != null && !enPassantPeice.Type.Equals(PeiceType.Pawn))
            {
                result.Success = false;
                result.Message = "Can only en passant a pawn.";
                return result;
            }

            if (enPassantPeice != null)
            {
                if (peice.Side.Equals(enPassantPeice.Side))
                {
                    result.Success = false;
                    result.Message = "Can not capture own peice.";
                    return result;
                }

                if (!enPassantPeice.HasMoved)
                {
                    result.Success = false;
                    result.Message = "Capture peice must have moved";
                    return result;
                }
                if (enPassantPeice.Side == board.Top && enPassantPeice.Y == 3 || enPassantPeice.Side == board.Bottom && enPassantPeice.Y == 4)
                {
                    var lastMove = board.GetLastMove();
                    if (lastMove.Item1 != null && lastMove.Item1.Type.Equals(PeiceType.Pawn))
                    {
                        if (lastMove.Item2.X == enPassantPeice.X && (lastMove.Item2.Y - lastMove.Item1.Y) % 2 == 0)
                        {
                            return CommandResult.GetSuccess("Can capture en passant");
                        }

                        return CommandResult.GetFail("En passant must be done immediatly.");
                    }
                    else
                    {
                        return CommandResult.GetFail("En passant can not be the first move.");
                    }
                }
            }

            return CommandResult.GetFail("Unrecognized pawn move.");
        }
コード例 #6
0
ファイル: Board.cs プロジェクト: krisboyce/Chess
 public void RecordMove(IPeice prevPeice, IPeice afterPeice)
 {
     MoveHistory.Add(new Tuple <IPeice, IPeice>(prevPeice, afterPeice));
 }