예제 #1
0
파일: Rook.cs 프로젝트: mwillia95/Projects
    public override void findPossibleMoves() //can move along file or rank, as long as it is not blocked
    {
        PossibleMoves.Clear();
        Coordinate   pTmp = new Coordinate(Position);
        string       color;
        Action <int> checkFile = (direction) =>
        {
            pTmp = new Coordinate(Position);
            for (; pTmp.changeFile(direction);)
            {
                color = board.CheckColor(pTmp);
                if (color == "none") //no piece, continue normally
                {
                    PossibleMoves.Add(pTmp);
                }
                else if (color != Color) //opposite piece, add its position and stop
                {
                    PossibleMoves.Add(pTmp);
                    break;
                }
                else //same color piece, don't add and stop
                {
                    break;
                }
                pTmp = new Coordinate(pTmp);
            }
            pTmp = new Coordinate(Position); //new coordinate object, resets position as well
        };
        Action <int> checkRank = (direction) =>
        {
            pTmp = new Coordinate(Position);
            for (; pTmp.changeRank(direction);)
            {
                color = board.CheckColor(pTmp);
                if (color == Color)
                {
                    break;
                }
                else if (color == "none")
                {
                    PossibleMoves.Add(pTmp);
                    pTmp = new Coordinate(pTmp);
                }
                else //opposite piece, add its position and stop
                { //bug occurs somewhere here, goes one position further than it should, or perhaps even past
                    PossibleMoves.Add(pTmp);
                    Console.WriteLine("Ocuured attempting position " + pTmp);
                    break;
                }
            }
            pTmp = new Coordinate(Position); //new coordinate object, resets position as well
        };

        checkFile(1);  //check right
        checkFile(-1); //check left
        checkRank(1);  //check up
        checkRank(-1); //check down
    }
예제 #2
0
파일: Pawn.cs 프로젝트: mwillia95/Projects
    public override void findPossibleMoves() //move forward one, direction dependent on color. can also capture diagonally
    {
        PossibleMoves.Clear();
        int direction = 0;

        if (Color == "white")
        {
            direction = 1;
        }
        else if (Color == "black")
        {
            direction = -1;
        }
        Coordinate mPosition = new Coordinate(Position); //creates a duplicate of pawn's position

        mPosition.changeRank(direction);                 //to check one in front of the pawn

        string front = board.CheckColor(mPosition);

        if (front == "none") //has opposite colored piece or no piece
        {
            PossibleMoves.Add(mPosition);
            if (hasMoved == false) //can move two spaces up if it has not yet moved and there is no piece already in front of it
            {
                mPosition = new Coordinate(mPosition);
                mPosition.changeRank(direction);
                if (board.CheckColor(mPosition) == "none")
                {
                    PossibleMoves.Add(mPosition);
                }
            }
        }
        mPosition = new Coordinate(Position);


        mPosition.changeRank(direction);
        if (mPosition.changeFile(1))        //checks in front and to the right of the pawn
        {
            if (isOppositeColor(mPosition)) //must have an opposite colored piece
            {
                PossibleMoves.Add(mPosition);
            }
        }

        mPosition = new Coordinate(Position);
        mPosition.changeRank(direction);
        if (mPosition.changeFile(-1)) //checks in front and to the left of the pawn
        {
            if (isOppositeColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
    }
예제 #3
0
        public override void Sorcery(ref Cell[,] gameBoard)
        {
            Logic.DetermineUsableCells(CellTypes.Player2, CellTypes.Player1);
            GetPossibleMoves(gameBoard, ref PossibleMoves);
            Cell selected = GetRandomCell();

            if (selected != null)
            {
                gameBoard[selected.Y, selected.X].Type = CellTypes.Selected;
            }
            PossibleMoves.Clear();
        }
예제 #4
0
    /// <summary>
    /// Shows possible moves that can be done from given Field.
    /// </summary>
    /// <param name="InField">The Field for which we want to show possible moves.</param>
    public void ShowPossibleMoves(FieldController InField)
    {
        Logger.Log(this, "Trying to show possible moves from field {0}.", GetIndexOf(InField));
        if (InField)
        {
            PawnController topPawn = InField.GetPawn();
            if (topPawn && CanPawnBeMoved(topPawn))
            {
                // Clearing possible moves if needed
                if (PossibleMoves != null)
                {
                    PossibleMoves.Clear();
                }

                PossibleMoves = new PossibleMoves(this, InField, Dices);
            }
        }
    }
예제 #5
0
        public override void ClearMoves(List <IMove> illegalMoves = null)
        {
            if (illegalMoves == null)
            {
                PossibleMoves.Clear();
                CastleMoves.Clear();
                return;
            }

            foreach (var move in illegalMoves)
            {
                if (move.GetMoveMeta().Contains("Castle"))
                {
                    CastleMoves.Remove((Castle)move);
                }

                else
                {
                    PossibleMoves.Remove(move);
                }
            }
        }
예제 #6
0
    public override void findPossibleMoves() //bishop can move along any diagonal as long as it is not blocked
    {
        PossibleMoves.Clear();
        Coordinate        mPosition = new Coordinate(Position);
        string            color;
        Action <int, int> checkDiagonal = (x, y) =>
        {
            for (; mPosition.changeDiagonal(x, y);)
            {
                color = board.CheckColor(mPosition);
                if (color == "none")
                {
                    //if (!IntoCheck(mPosition))
                    PossibleMoves.Add(mPosition);
                    mPosition = new Coordinate(mPosition);
                }

                else if (color != Color)
                {
                    //if (!IntoCheck(mPosition))
                    PossibleMoves.Add(mPosition);
                    break;
                }
                else
                {
                    break;
                }
            }
            mPosition = new Coordinate(Position);
        };

        checkDiagonal(1, 1);   //up right
        checkDiagonal(1, -1);  //up left
        checkDiagonal(-1, 1);  //down right
        checkDiagonal(-1, -1); //down left
    }
예제 #7
0
        public override void Update(GameManager gameManager, int deltaTime)
        {
            var realPoint = gameManager.Input.PointerPosition.ToVector2() + gameManager.Camera.Offset;

            Coordinate = GetCoordinate(realPoint);

            if (gameManager.Input.IsLeftButtonPressed)
            {
                if (!Hexes.ContainsKey(Coordinate))
                {
                    return;
                }

                var pawn = Hexes[Coordinate].Pawn;
                if (pawn == null)
                {
                    if (_selectedPawn != null)
                    {
                        _selectedPawn.Selected = false;
                        _selectedPawn          = null;
                        PossibleMoves.Clear();
                    }

                    return;
                }

                pawn.Selected = true;
                _selectedPawn = pawn;

                var moveQueue = new Queue <Move>();

                var openingMoves = GetNeighbours(Coordinate);
                foreach (var openingMove in openingMoves)
                {
                    var hex = Hexes[openingMove];
                    if (!hex.Passable)
                    {
                        continue;
                    }

                    moveQueue.Enqueue(new Move(hex));
                }

                var possibleMoves      = new List <Coordinate>();
                var visitedCoordinates = new HashSet <Coordinate>();

                while (moveQueue.Count > 0)
                {
                    var move = moveQueue.Dequeue();
                    if (visitedCoordinates.Contains(move.Hex.Coordinate))
                    {
                        continue;
                    }

                    visitedCoordinates.Add(move.Hex.Coordinate);

                    if (move.TotalMoveCost > pawn.MoveSpeed)
                    {
                        continue;
                    }

                    possibleMoves.Add(move.Hex.Coordinate);

                    var newMoves = GetNeighbours(move.Hex.Coordinate);
                    foreach (var newMove in newMoves)
                    {
                        if (visitedCoordinates.Contains(newMove))
                        {
                            continue;
                        }

                        var hex = Hexes[newMove];
                        if (!hex.Passable)
                        {
                            continue;
                        }

                        moveQueue.Enqueue(new Move(move, hex));
                    }
                }

                PossibleMoves = possibleMoves;
            }

            if (gameManager.Input.IsRightButtonPressed && _selectedPawn != null)
            {
                if (PossibleMoves.Contains(Coordinate))
                {
                    _selectedPawn.Hex.Pawn = null;
                    _selectedPawn.Hex      = Hexes[Coordinate];
                    _selectedPawn.Hex.Pawn = _selectedPawn;
                    _selectedPawn.Selected = false;
                    PossibleMoves.Clear();
                }
            }
        }
예제 #8
0
 private void DisablePlacement()
 {
     PossibleMoves.Clear();
     PotentialPlacedWall.Clear();
     allPossibleWalls = null;
 }
예제 #9
0
    public override void findPossibleMoves() //can move in L shapes, can also move over pieces
    {
        PossibleMoves.Clear();
        Coordinate mPosition = new Coordinate(Position);

        if (mPosition.changeDiagonal(2, 1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }

        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(1, 2))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }

        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(-2, 1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }

        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(-1, 2))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }

        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(2, -1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }

        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(1, -2))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }

        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(-2, -1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }

        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(-1, -2))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
    }
예제 #10
0
파일: Queen.cs 프로젝트: mwillia95/Projects
    public override void findPossibleMoves() //combines the moves of a rook and bishop, along files, ranks, and diagonals
    {
        PossibleMoves.Clear();
        Coordinate        mPosition = new Coordinate(Position);
        string            color;
        Action <int, int> checkDiagonal = (x, y) =>
        {
            for (; mPosition.changeDiagonal(x, y);)
            {
                color = board.CheckColor(mPosition);
                if (color == "none")
                {
                    PossibleMoves.Add(mPosition);
                    mPosition = new Coordinate(mPosition);
                }

                else if (color != Color)
                {
                    // if (!IntoCheck(mPosition))
                    PossibleMoves.Add(mPosition);
                    break;
                }
                else
                {
                    break;
                }
            }
            mPosition = new Coordinate(Position);
        };
        Action <int> checkFile = (direction) =>
        {
            mPosition = new Coordinate(Position);
            for (; mPosition.changeFile(direction);)
            {
                color = board.CheckColor(mPosition);
                if (color == "none") //no piece, continue normally
                {
                    PossibleMoves.Add(mPosition);
                }
                else if (color != Color) //opposite piece, add its position and stop
                {
                    PossibleMoves.Add(mPosition);
                    break;
                }
                else //same color piece, don't add and stop
                {
                    break;
                }
                mPosition = new Coordinate(mPosition);
            }
            mPosition = new Coordinate(Position); //new coordinate object, resets position as well
        };
        Action <int> checkRank = (direction) =>
        {
            mPosition = new Coordinate(Position);
            for (; mPosition.changeRank(direction);)
            {
                color = board.CheckColor(mPosition);
                if (color == Color)
                {
                    break;
                }
                else if (color == "none")
                {
                    PossibleMoves.Add(mPosition);
                    mPosition = new Coordinate(mPosition);
                }
                else //opposite piece, add its position and stop
                { //bug occurs somewhere here, goes one position further than it should, or perhaps even past
                    PossibleMoves.Add(mPosition);
                    break;
                }
            }
            mPosition = new Coordinate(Position); //new coordinate object, resets position as well
        };

        checkFile(1);          //check right
        checkFile(-1);         //check left
        checkRank(1);          //check up
        checkRank(-1);         //check down

        checkDiagonal(1, 1);   //up right
        checkDiagonal(1, -1);  //up left
        checkDiagonal(-1, 1);  //down right
        checkDiagonal(-1, -1); //down left
    }
예제 #11
0
파일: King.cs 프로젝트: mwillia95/Projects
    public override void findPossibleMoves() //king can move in any direction by one square
    {
        PossibleMoves.Clear();
        //check up
        Coordinate mPosition = new Coordinate(Position);

        if (mPosition.changeRank(1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
        //check down
        mPosition = new Coordinate(Position);
        if (mPosition.changeRank(-1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
        //check right
        mPosition = new Coordinate(Position);
        if (mPosition.changeFile(1))
        {
            if (board.CheckColor(mPosition) == "none")
            {
                PossibleMoves.Add(mPosition);
            }
        }

        //check left
        mPosition = new Coordinate(Position);
        if (mPosition.changeFile(-1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
        //check up right
        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(1, 1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
        //check up left
        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(1, -1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
        //check down right
        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(-1, 1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
        //check down left
        mPosition = new Coordinate(Position);
        if (mPosition.changeDiagonal(-1, -1))
        {
            if (!isSameColor(mPosition))
            {
                PossibleMoves.Add(mPosition);
            }
        }
    }
예제 #12
0
파일: Piece.cs 프로젝트: Robertk92/ChessAI
        public void UpdatePossibleMoves()
        {
            PossibleMoves.Clear();

            switch (PieceType)
            {
            case PieceType.Pawn:
                CheckAndSetPossibleMoves(MoveDirection.Up, 2, 0, true);
                break;

            case PieceType.Knight:
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Right, 1, 2, false);
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Left, 1, 2, false);
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Left, 2, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Right, 2, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Right, 1, 2, false);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Left, 1, 2, false);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Left, 2, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Right, 2, 1, false);
                break;

            case PieceType.Bishop:
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Left, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Right, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Right, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Left, 8, 8, true);
                break;

            case PieceType.Rook:
                CheckAndSetPossibleMoves(MoveDirection.Down, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Up, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Left, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Right, 8, 8, true);
                break;

            case PieceType.Queen:
                CheckAndSetPossibleMoves(MoveDirection.Down, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Up, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Left, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Right, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Left, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Right, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Right, 8, 8, true);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Left, 8, 8, true);
                break;

            case PieceType.King:
                CheckAndSetPossibleMoves(MoveDirection.Down, 1, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Up, 1, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Left, 1, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Right, 1, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Left, 1, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Up | MoveDirection.Right, 1, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Right, 1, 1, false);
                CheckAndSetPossibleMoves(MoveDirection.Down | MoveDirection.Left, 1, 1, false);
                break;

            default:
                break;
            }
        }