Пример #1
0
        public bool CheckForAttackerVictory()
        {
            //Check to see if King is surrounded on 4 sides
            try
            {
                SimpleSquare kingSquare = FindTheKing(this.board, true);
                if (kingSquare == null)
                {
                    return(false);
                }
                SimpleSquare up    = GetSquare(kingSquare.Row - 1, kingSquare.Column);
                SimpleSquare down  = GetSquare(kingSquare.Row + 1, kingSquare.Column);
                SimpleSquare left  = GetSquare(kingSquare.Row, kingSquare.Column - 1);
                SimpleSquare right = GetSquare(kingSquare.Row, kingSquare.Column + 1);

                if (up != null && down != null && left != null && right != null)
                {
                    if ((up.AttackerPresent || up.SquareType == Square.square_type.Throne) && (down.AttackerPresent || down.SquareType == Square.square_type.Throne) && (left.AttackerPresent || left.SquareType == Square.square_type.Throne) && (right.AttackerPresent || right.SquareType == Square.square_type.Throne))
                    {
                        return(true);
                    }
                }
            }
            catch (Exception ex)
            {
                return(false);
            }

            return(false);
        }
Пример #2
0
        public SimpleSquare FindTheKing(SimpleBoard board, bool quick)
        {
            if (quick)
            {
                return(board.kingSquare);
            }
            else
            {
                SimpleSquare kingSquare = null;
                for (int i = 0; i < board.OccupationArray.GetLength(0); i++)     //Rows
                {
                    for (int j = 0; j < board.OccupationArray.GetLength(1); j++) //Columns
                    {
                        if (board.OccupationArray[j, i] == Square.occupation_type.King)
                        {
                            kingSquare = new SimpleSquare(j, i, Square.occupation_type.King, board.SquareTypeArray[j, i]);
                            return(kingSquare);
                        }
                    }
                }
                if (kingSquare == null)
                {
                    return(null);
                }

                return(kingSquare);
            }
        }
Пример #3
0
        public int NumberOfAttackersAroundKing()
        {
            int          numberOfAttackers = 0;
            SimpleSquare kingSquare        = FindTheKing(board, true);
            SimpleSquare up    = GetSquare(kingSquare.Row - 1, kingSquare.Column);
            SimpleSquare down  = GetSquare(kingSquare.Row + 1, kingSquare.Column);
            SimpleSquare left  = GetSquare(kingSquare.Row, kingSquare.Column - 1);
            SimpleSquare right = GetSquare(kingSquare.Row, kingSquare.Column + 1);

            if (up != null && up.AttackerPresent)
            {
                numberOfAttackers++;
            }
            if (down != null && down.AttackerPresent)
            {
                numberOfAttackers++;
            }
            if (left != null && left.AttackerPresent)
            {
                numberOfAttackers++;
            }
            if (right != null && right.AttackerPresent)
            {
                numberOfAttackers++;
            }


            return(numberOfAttackers);
        }
Пример #4
0
        private void CheckAndProcessTake()
        {
            SimpleSquare endSquare = GetSquare(this.endRow, this.endColumn);
            //Check UP 1 ROW

            SimpleSquare squareToCheck = GetSquare(endSquare.Row - 1, endSquare.Column);

            if (squareToCheck != null) //Is a valid square
            {
                SearchAroundForTake(squareToCheck, endSquare, direction.FromBelow);
            }

            //Check DOWN 1 ROW
            squareToCheck = GetSquare(endSquare.Row + 1, endSquare.Column);
            if (squareToCheck != null) //Is a valid square
            {
                SearchAroundForTake(squareToCheck, endSquare, direction.FromAbove);
            }

            //Check LEFT 1 COLUMN
            squareToCheck = GetSquare(endSquare.Row, endSquare.Column - 1);
            if (squareToCheck != null) //Is a valid square
            {
                SearchAroundForTake(squareToCheck, endSquare, direction.FromRight);
            }

            //Check RIGHT 1 COLUMN
            squareToCheck = GetSquare(endSquare.Row, endSquare.Column + 1);
            if (squareToCheck != null) //Is a valid square
            {
                SearchAroundForTake(squareToCheck, endSquare, direction.FromLeft);
            }
        }
Пример #5
0
        public SimpleSquare GetSquare(int row, int column)   //Need to be careful throughout as have a habit of swapping these.  Using row, column (y,x) here and in Check and process take
        {
            SimpleSquare retSquare = new SimpleSquare();

            try
            {
                if (column >= board.OccupationArray.GetLength(0) || column < 0 || row >= board.OccupationArray.GetLength(1) || row < 0)
                {
                    return(null);
                }
                retSquare.Occupation = board.OccupationArray[column, row];
                retSquare.SquareType = board.SquareTypeArray[column, row];
                retSquare.Row        = row;
                retSquare.Column     = column;
            }
            catch (Exception ex)
            {
                return(null);
            }

            return(retSquare);
        }
Пример #6
0
        //Copy constructor
        public SimpleBoard(SimpleBoard input)
        {
            int SizeX = input.OccupationArray.GetLength(0);
            int SizeY = input.OccupationArray.GetLength(1);

            Square.occupation_type[,] newOcc = new Square.occupation_type[SizeX, SizeY];
            Square.square_type[,] newTypes   = new Square.square_type[SizeX, SizeY];

            for (int i = 0; i < SizeY; i++)     //Rows
            {
                for (int j = 0; j < SizeX; j++) //Columns
                {
                    newOcc[j, i] = input.OccupationArray[j, i];
                    if (input.OccupationArray[j, i] == Square.occupation_type.King)
                    {
                        this.kingSquare = new SimpleSquare(j, i, Square.occupation_type.King, input.SquareTypeArray[j, i]);
                    }
                    newTypes[j, i] = input.SquareTypeArray[j, i];
                }
            }

            this.OccupationArray = newOcc;
            this.SquareTypeArray = newTypes;
        }
Пример #7
0
        private void SearchAroundForTake(SimpleSquare squareToCheck, SimpleSquare endSquare, direction dir)
        {
            //squareToCheck is the square with the possible piece to be taken,  endSquare is the square into which the possible taker moved, direction is the direction that the taker moved w.r.t takee.
            SimpleSquare squareTwoAway = null;

            if (squareToCheck.Occupation != Square.occupation_type.Empty && squareToCheck.Occupation != Square.occupation_type.King) //Something in the square
            {
                if (squareToCheck.AttackerPresent && (endSquare.KingPresent || endSquare.DefenderPresent))
                {
                    //Defender or King moved next to Attacker
                    //Look 2 squares away in given direction for defender or King
                    switch (dir)
                    {
                    case direction.FromAbove:
                        squareTwoAway = GetSquare(endSquare.Row + 2, endSquare.Column);
                        break;

                    case direction.FromBelow:
                        squareTwoAway = GetSquare(endSquare.Row - 2, endSquare.Column);
                        break;

                    case direction.FromLeft:
                        squareTwoAway = GetSquare(endSquare.Row, endSquare.Column + 2);
                        break;

                    case direction.FromRight:
                        squareTwoAway = GetSquare(endSquare.Row, endSquare.Column - 2);
                        break;
                    }
                    if (squareTwoAway != null)
                    {
                        if (squareTwoAway.DefenderPresent || squareTwoAway.KingPresent || squareTwoAway.SquareType == Square.square_type.Corner)
                        {
                            board.OccupationArray[squareToCheck.Column, squareToCheck.Row] = Square.occupation_type.Empty;
                            numberTakesDefender++;
                        }
                    }
                }
                if (squareToCheck.DefenderPresent && endSquare.AttackerPresent)
                {
                    //Attacker moved next to defender
                    switch (dir)
                    {
                    case direction.FromAbove:
                        squareTwoAway = GetSquare(endSquare.Row + 2, endSquare.Column);
                        break;

                    case direction.FromBelow:
                        squareTwoAway = GetSquare(endSquare.Row - 2, endSquare.Column);
                        break;

                    case direction.FromLeft:
                        squareTwoAway = GetSquare(endSquare.Row, endSquare.Column + 2);
                        break;

                    case direction.FromRight:
                        squareTwoAway = GetSquare(endSquare.Row, endSquare.Column - 2);
                        break;
                    }
                    if (squareTwoAway != null)
                    {
                        if (squareTwoAway.AttackerPresent || squareTwoAway.SquareType == Square.square_type.Corner)
                        {
                            board.OccupationArray[squareToCheck.Column, squareToCheck.Row] = Square.occupation_type.Empty;
                            numberTakesAttacker++;
                        }
                    }
                }
            }
        }