Пример #1
0
        private void CheckCardinalDirections(Board board)
        {
            foreach (int fileOffset in new[] { -1, 0, 1 })
            {
                foreach (int rankOffset in Math.Abs(fileOffset) == 1 ? new[] { 0 } : new[] { -1, 1 })
                {
                    Square   testSquare = new Square(Position, fileOffset, rankOffset);
                    Movement testMove   = new Movement(Position, testSquare);

                    while (testSquare.IsValid)
                    {
                        Square enemyKingPosition = Color == Side.White ? board.BlackKing.Position : board.WhiteKing.Position;
                        if (board.IsOccupied(testSquare))
                        {
                            if (!board.IsOccupiedBySide(testSquare, Color) && Rules.MoveObeysRules(board, testMove, Color) && testSquare != enemyKingPosition)
                            {
                                LegalMoves.Add(new Movement(testMove));
                            }

                            break;
                        }

                        if (Rules.MoveObeysRules(board, testMove, Color) && testSquare != enemyKingPosition)
                        {
                            LegalMoves.Add(new Movement(testMove));
                        }

                        testSquare = new Square(testSquare, fileOffset, rankOffset);
                        testMove   = new Movement(Position, testSquare);
                    }
                }
            }
        }
Пример #2
0
        public override void UpdateLegalMoves(Board board, Square enPassantEligibleSquare)
        {
            LegalMoves.Clear();

            CheckSurroundingSquares(board);
            CheckCastlingMoves(board);
        }
Пример #3
0
        public override void UpdateLegalMoves(Board board, Square enPassantEligibleSquare)
        {
            LegalMoves.Clear();

            CheckForwardMovingSquares(board);
            CheckAttackingSquares(board);
            CheckEnPassantCaptures(board, enPassantEligibleSquare);
        }
Пример #4
0
 // make the chosen move, update board, game result and moves
 internal BoardModel MakeMove(int index)
 {
     if (!(index >= 0 && index < LegalMoves.Count()))
     {
         throw Error.Argument("index out of range");
     }
     return(CreateMoved(this, LegalMoves[index]));
 }
    void Awake()
    {
        instance = this;
        board    = GetComponent <GameBoard>();
        legal    = GetComponent <LegalMoves>();

        devUI.SetActive(inDevMode);
        gameUI.SetActive(!inDevMode);
    }
Пример #6
0
    public bool canCastleQueenside() //returns true if the king can castle queenside (from E file to C file)
    {
        Piece      rook = new Piece();
        Coordinate pTmp = new Coordinate(Position);

        pTmp.changeFile(-4); //moves from E file to A file
        rook = board.board[pTmp.Rank, pTmp.File];
        if (rook == null)    //there is no piece where rook should be
        {
            return(false);
        }
        if (!(rook is Rook)) //the piece there is not a rook
        {
            return(false);
        }
        if (rook.hasMoved == true) //the rook there has already moved
        {
            return(false);
        }
        //figure out if the squares between the rook and king are empty MOVE TO POSSIBLE/LEGAL MOVES
        pTmp.changeFile(1);
        if (board.isTherePiece(pTmp) == true) //if there is a piece on B file
        {
            return(false);
        }

        pTmp.changeFile(1);
        if (board.isTherePiece(pTmp) == true) //if there is a piece on C file
        {
            return(false);
        }
        if (IntoCheck(pTmp)) //if being on C file would cause check
        {
            return(false);
        }
        pTmp.changeFile(1);
        if (board.isTherePiece(pTmp) == true) //if there is a piece on the D file
        {
            return(false);
        }
        if (IntoCheck(pTmp)) //if being on the D file would cause check
        {
            return(false);
        }
        if (board.inCheck(Color)) //if the king is already in check
        {
            return(false);
        }
        //if all of these are false and it has reached here, castling kingside is legal
        pTmp.changeFile(-1); //moves pTmp from D file to C file
        LegalMoves.Add(pTmp);

        return(true);
    }
Пример #7
0
 public World(IPlayer p1, IPlayer p2)
 {
     this.player1 = p1;
     this.player2 = p2;
     this.board   = new Board();
     p1.setBoard(board);
     p2.setBoard(board);
     cowBox = new CowBox(board);
     p1.setCowBox(cowBox);
     p2.setCowBox(cowBox);
     referee               = new Referee(board, p1.symbol);
     legalMoves            = new LegalMoves(board, cowBox);
     referee.currentPlayer = p1.symbol;
 }
Пример #8
0
    void Awake()
    {
        localBest        = PlayerPrefs.GetInt("localbest", 0);
        localBestUI.text = localBest + "";
        worldBest        = PlayerPrefs.GetInt("worldbest", localBest);
        worldBestUI.text = worldBest + "";

        board   = GetComponent <GameBoard>();
        puzzles = GetComponent <PuzzleManager>();
        legal   = GetComponent <LegalMoves>();
        ai      = GetComponent <AI>();
        cam     = Camera.main;

        inGameMode = !DeveloperMode.InDevMode();
    }
Пример #9
0
    void Start()
    {
        if (DeveloperMode.InDevMode())
        {
            legalMoves = GetComponent <LegalMoves>();
            board      = GetComponent <GameBoard>();
            devMode    = GetComponent <DeveloperMode>();

            StreamReader reader = new StreamReader("Assets/Puzzles/PGN.txt");
            CustomMethods.MeasureExecutionTime(false);
            pgn = reader.ReadToEnd();
            CustomMethods.MeasureExecutionTime(true);
            reader.Close();
            ReadPGN(pgn);
        }
    }
Пример #10
0
 // generate actual moves if not done already during condition checking
 // assumes CurrentPlayer set already
 internal void GenerateMoves()
 {
     if (!_donemovegen)
     {
         LegalMoves.AddRange(_game.CreateDrops(this));
         LegalMoves.AddRange(_game.CreateMoves(this));
         var passoption = _game.Def.GetProperty("pass turn") ?? OptionValue.False;
         var allowpass  = passoption.Equals(OptionValue.True) ||
                          (LegalMoves.Count == 0 && passoption.Equals(OptionValue.Forced));
         if (allowpass)
         {
             LegalMoves.Insert(0, MoveModel.Create(Turn.TurnPlayer, PositionValue.None, PieceValue.None));
         }
         _donemovegen = true;
     }
 }
Пример #11
0
        private void CheckAttackingSquares(Board board)
        {
            foreach (int fileOffset in new[] { -1, 1 })
            {
                int      rankOffset = Color == Side.White ? 1 : -1;
                Square   testSquare = new Square(Position, fileOffset, rankOffset);
                Movement testMove   = new Movement(Position, testSquare);

                Square enemyKingPosition = Color == Side.White ? board.BlackKing.Position : board.WhiteKing.Position;
                if (testSquare.IsValid && board.IsOccupiedBySide(testSquare, Color.Complement()) && Rules.MoveObeysRules(board, testMove, Color) && testSquare != enemyKingPosition)
                {
                    bool     pawnAtSecondToLastRank = Position.Rank == (Color == Side.White ? 7 : 2);
                    Movement move = pawnAtSecondToLastRank ? new PromotionMove(Position, testSquare) : new Movement(testMove);
                    LegalMoves.Add(move);
                }
            }
        }
Пример #12
0
        private void CheckSurroundingSquares(Board board)
        {
            for (int fileOffset = -1; fileOffset <= 1; fileOffset++)
            {
                for (int rankOffset = -1; rankOffset <= 1; rankOffset++)
                {
                    if (fileOffset == 0 && rankOffset == 0)
                    {
                        continue;
                    }

                    Square   testSquare        = new Square(Position, fileOffset, rankOffset);
                    Movement testMove          = new Movement(Position, testSquare);
                    Square   enemyKingPosition = Color == Side.White ? board.BlackKing.Position : board.WhiteKing.Position;
                    if (testSquare.IsValid && !board.IsOccupiedBySide(testSquare, Color) && Rules.MoveObeysRules(board, testMove, Color) && testSquare != enemyKingPosition)
                    {
                        LegalMoves.Add(new Movement(testMove));
                    }
                }
            }
        }
Пример #13
0
        private void CheckCastlingMoves(Board board)
        {
            if (!HasMoved && !Rules.IsPlayerInCheck(board, Color))
            {
                int           castlingRank = Color == Side.White ? 1 : 8;
                List <Square> rookSquares  = new List <Square> {
                    new Square(1, castlingRank), new Square(8, castlingRank)
                };
                List <Square>   inBetweenSquares = new List <Square>();
                List <Movement> inBetweenMoves   = new List <Movement>();

                for (int rookSquareIndex = 0; rookSquareIndex < rookSquares.Count; rookSquareIndex++)
                {
                    if (board[rookSquares[rookSquareIndex]] is Rook rook && !rook.HasMoved && rook.Color == Color)
                    {
                        bool checkingQueensideCastle = rookSquareIndex == 0;
                        inBetweenSquares.Add(new Square(checkingQueensideCastle ? 4 : 6, castlingRank));
                        inBetweenSquares.Add(new Square(checkingQueensideCastle ? 3 : 7, castlingRank));
                        if (checkingQueensideCastle)
                        {
                            inBetweenSquares.Add(new Square(2, castlingRank));
                        }

                        if (!board.IsOccupied(inBetweenSquares[0]) && !board.IsOccupied(inBetweenSquares[1]) && (!checkingQueensideCastle || !board.IsOccupied(inBetweenSquares[2])))
                        {
                            inBetweenMoves.Add(new Movement(Position, inBetweenSquares[0]));
                            inBetweenMoves.Add(new Movement(Position, inBetweenSquares[1]));

                            if (Rules.MoveObeysRules(board, inBetweenMoves[0], Color) && Rules.MoveObeysRules(board, inBetweenMoves[1], Color))
                            {
                                LegalMoves.Add(new CastlingMove(Position, inBetweenSquares[1], rook));
                            }
                        }

                        inBetweenSquares.Clear();
                        inBetweenMoves.Clear();
                    }
                }
            }
        }
Пример #14
0
        private void CheckForwardMovingSquares(Board board)
        {
            int      advancingDirection = Color == Side.White ? 1 : -1;
            Square   testSquare         = new Square(Position, 0, advancingDirection);
            Movement testMove           = new Movement(Position, testSquare);

            if (!board.IsOccupied(testSquare) && Rules.MoveObeysRules(board, testMove, Color))
            {
                bool amOnSecondToLastRank = Position.Rank == (Color == Side.White ? 7 : 2);
                LegalMoves.Add(amOnSecondToLastRank ? new PromotionMove(Position, testSquare) : new Movement(testMove));
            }

            if (!HasMoved)
            {
                testSquare = new Square(testSquare, 0, advancingDirection);
                testMove   = new Movement(Position, testSquare);
                if (!board.IsOccupied(testSquare) && Rules.MoveObeysRules(board, testMove, Color))
                {
                    LegalMoves.Add(new Movement(testMove));
                }
            }
        }
        // Returns all the legal moves for the given cell
        public ArrayList GetLegalMoves(Cell source)
        {
            ArrayList LegalMoves;

            LegalMoves = GetPossibleMoves(source);              // Get the legal moves
            ArrayList ToRemove = new ArrayList();               // contains a list of all the moves to remove

            // Now check and mark all the moves which moves user under check
            foreach (Cell target in LegalMoves)
            {
                // if the move place or leave the user under check
                if (CauseCheck(new Move(source, target)))
                {
                    ToRemove.Add(target);
                }
            }

            //  When checking the moves for the king, don't allow tower/caslting, if
            // the king is under check

            if (source.piece.Type == Piece.PieceType.King && IsUnderCheck(source.piece.Side.type))
            {
                foreach (Cell target in LegalMoves)
                {
                    //if the move place or leave the user under check
                    if (Math.Abs(target.col - source.col) > 1)
                    {
                        ToRemove.Add(target);
                    }
                }
            }

            // remove all the illegal moves
            foreach (Cell cell in ToRemove)
            {
                LegalMoves.Remove(cell);        // remove the illegal move
            }
            return(LegalMoves);
        }
Пример #16
0
        private void CheckKnightCircleSquares(Board board)
        {
            for (int fileOffset = -2; fileOffset <= 2; fileOffset++)
            {
                if (fileOffset == 0)
                {
                    continue;
                }

                foreach (int rankOffset in Math.Abs(fileOffset) == 2 ? new[] { -1, 1 } : new[] { -2, 2 })
                {
                    Square   testSquare = new Square(Position, fileOffset, rankOffset);
                    Movement testMove   = new Movement(Position, testSquare);

                    Square enemyKingPosition = Color == Side.White ? board.BlackKing.Position : board.WhiteKing.Position;
                    if (testSquare.IsValid && !board.IsOccupiedBySide(testSquare, Color) && Rules.MoveObeysRules(board, testMove, Color) && testSquare != enemyKingPosition)
                    {
                        LegalMoves.Add(new Movement(testMove));
                    }
                }
            }
        }
Пример #17
0
        private void CheckEnPassantCaptures(Board board, Square enPassantEligibleSquare)
        {
            if (Color == Side.White ? Position.Rank == 5 : Position.Rank == 4)
            {
                foreach (int fileOffset in new[] { -1, 1 })
                {
                    Square lateralSquare = new Square(Position, fileOffset, 0);

                    if (lateralSquare.IsValid && board[lateralSquare] is Pawn enemyLateralPawn && enemyLateralPawn.Color != Color)
                    {
                        Square squareToCheckWithEligibleSquare = new Square(enemyLateralPawn.Position, 0, enemyLateralPawn.Color == Side.White ? -1 : 1);
                        if (squareToCheckWithEligibleSquare.Equals(enPassantEligibleSquare))
                        {
                            EnPassantMove testMove = new EnPassantMove(Position, enPassantEligibleSquare, enemyLateralPawn);

                            if (Rules.MoveObeysRules(board, testMove, Color))
                            {
                                LegalMoves.Add(new EnPassantMove(Position, enPassantEligibleSquare, enemyLateralPawn));
                            }
                        }
                    }
                }
            }
        }
Пример #18
0
    void Awake()
    {
        legalMoves    = GetComponent <LegalMoves>();
        manager       = GetComponent <GameManager>();
        drawBoard     = GetComponent <DrawBoard>();
        ai            = GetComponent <AI>();
        analysisBoard = new Square[8, 8];

        board = new Piece[8, 8];

        for (int ranks = 0; ranks < 8; ranks++)
        {
            for (int files = 0; files < 8; files++)
            {
                board[files, ranks]             = drawBoard.GetSquare(files, ranks);
                board[files, ranks].piece       = Pieces.Empty;
                board[files, ranks].coordinates = new Coord(files, ranks);
            }
        }



        SetupFromFEN(startFEN);
    }
Пример #19
0
        // Returns all the legal moves for the given cell
        public ArrayList GetLegalMoves(Cell source)
        {
            ArrayList LegalMoves;

            LegalMoves = GetPossibleMoves(source);              // Get the legal moves
            ArrayList ToRemove = new ArrayList();               // contains a list of all the moves to remove

            // Now check and mark all the moves which moves user under check
            foreach (Cell target in  LegalMoves)
            {
                // if the move place or leave the user under check
                if (CauseCheck(new Move(source, target)))
                {
                    ToRemove.Add(target);
                }
            }

            // remove all the illegal moves
            foreach (Cell cell in  ToRemove)
            {
                LegalMoves.Remove(cell);                        // remove the illegal move
            }
            return(LegalMoves);
        }
Пример #20
0
 void Awake()
 {
     legalMoves = GetComponent <LegalMoves>();
     board      = GetComponent <GameBoard>();
 }
Пример #21
0
        public override void UpdateLegalMoves(Board board, Square enPassantEligibleSquare)
        {
            LegalMoves.Clear();

            CheckCardinalDirections(board);
        }
Пример #22
0
 public override void UpdateLegalMoves(Board board, Square enPassantEligibleSquare)
 {
     LegalMoves.Clear();
     CheckKnightCircleSquares(board);
 }
Пример #23
0
    // Write puzzle to file (position is the game position - white to move and mate, finalMove is black's previous move that resulted in this position, and difficulty is a range from 0-100)
    public static string GetPuzzleFEN(Square[,] position, Coord finalMoveFrom, Coord finalMoveTo, LegalMoves legal)
    {
        string puzzleFEN = "";
        int    skipCount = 0;

        Coord epSquare = new Coord();
        bool  isEP     = false;

        for (int ranks = 7; ranks >= 0; ranks--)
        {
            for (int files = 0; files < 8; files++)
            {
                if (position[files, ranks].piece == GameBoard.Pieces.Empty)
                {
                    skipCount++;
                }
                else
                {
                    if (skipCount > 0)
                    {
                        puzzleFEN += skipCount.ToString();
                        skipCount  = 0;
                    }
                    puzzleFEN += PieceToNotation(position[files, ranks].piece, position[files, ranks].pieceColour);

                    if (position[files, ranks].isEnPassantSquare)
                    {
                        isEP     = true;
                        epSquare = new Coord(files, ranks);
                    }
                }
            }
            if (skipCount > 0)
            {
                puzzleFEN += skipCount.ToString();
                skipCount  = 0;
            }
            if (ranks != 0)
            {
                puzzleFEN += "/";
            }
        }
        puzzleFEN += " w ";

        if (legal.whiteCanCastleKingside)
        {
            puzzleFEN += "K";
        }
        if (legal.whiteCanCastleQueenside)
        {
            puzzleFEN += "Q";
        }
        if (legal.blackCanCastleKingside)
        {
            puzzleFEN += "k";
        }
        if (legal.blackCanCastleQueenside)
        {
            puzzleFEN += "q";
        }

        if (!legal.whiteCanCastleKingside && !legal.whiteCanCastleQueenside && !legal.blackCanCastleKingside && !legal.blackCanCastleQueenside)
        {
            puzzleFEN += "-";
        }

        if (isEP)
        {
            puzzleFEN += " " + "abcdefgh"[epSquare.x] + (epSquare.y + 1) + " ";
        }
        else
        {
            puzzleFEN += " - ";
        }

        puzzleFEN += "[" + finalMoveFrom.x + "" + finalMoveFrom.y + "" + finalMoveTo.x + "" + finalMoveTo.y + "]";

        return(puzzleFEN);
    }