Example #1
0
        public virtual bool isValidMove(Coordinate i_Target)
        {
            bool isValid = false;

            if (i_Target != null)
            {
                eVerticalDirections   vertical   = movesForwardOrBackward(this, i_Target);
                eHorizontalDirections horizontal = movesRightOrLeft(this, i_Target);
                Coin copy = new Coin(CoinType, Board);
                copy.Coordinates.CopyCoordinates(Coordinates);

                Coordinate newSquare = GetNextSquare(ref copy, vertical, horizontal);
                if (newSquare.Equals(i_Target))
                {
                    isValid = !isValid; // true
                }

                else if (IsAbleToEat(newSquare, out Coordinate target))
                {
                    isValid = !isValid; // true
                }
            }

            return(isValid);
        }
Example #2
0
        public static eHorizontalDirections movesRightOrLeft(
            Coin i_Coin,
            Coordinate i_target)
        {
            eHorizontalDirections move = eHorizontalDirections.SamePlace;
            int targetColumn           = i_target.Column;
            int sourceColumn           = i_Coin.Coordinates.Column;

            int diff = targetColumn - sourceColumn;

            if (diff != 0)
            {
                // This coin belongs to the first player.
                if (i_Coin.CoinType == eCoinType.O)
                {
                    move = (diff < 0) ?
                           eHorizontalDirections.Right :
                           eHorizontalDirections.Left;
                }

                // This coin belongs to the second player
                // (moves from down ---> up).
                else
                {
                    move = (diff > 0) ?
                           eHorizontalDirections.Right :
                           eHorizontalDirections.Left;
                }
            }

            return(move);
        }
Example #3
0
        public virtual bool IsAbleToEat(Coordinate i_Rival, out Coordinate o_Target)
        {
            bool isEatingPossibility = false;
            eVerticalDirections   forwordOrBackword = movesForwardOrBackward(this, i_Rival);
            eHorizontalDirections rightOrLeft       = movesRightOrLeft(this, i_Rival);

            Coordinate currentSquare = new Coordinate();

            currentSquare.CopyCoordinates(Coordinates);
            o_Target = new Coordinate();

            Coin copy = new Coin(CoinType, Board);

            copy.Coordinates.CopyCoordinates(Coordinates);
            currentSquare = GetNextSquare(ref copy, forwordOrBackword, rightOrLeft);

            // Eating possibility detected
            if (i_Rival.Equals(currentSquare) &&
                Board.GetCoinType(currentSquare) != CoinType && Board.GetCoinType(currentSquare) != eCoinType.None)
            {
                copy.Coordinates.CopyCoordinates(currentSquare);
                currentSquare = GetNextSquare(ref copy, forwordOrBackword, rightOrLeft);

                if (Board.IsEmptyValidSquare(currentSquare))
                {
                    isEatingPossibility = !isEatingPossibility; // true
                    o_Target.CopyCoordinates(currentSquare);
                }
            }
            return(isEatingPossibility);
        }
Example #4
0
        public override bool HasEatingMoves()
        {
            bool hasEatingMoves = false;

            foreach (Coordinate currentCoordinate in AvailableCoordinates)
            {
                eVerticalDirections   vertical   = movesForwardOrBackward(this, currentCoordinate);
                eHorizontalDirections horizontal = movesRightOrLeft(this, currentCoordinate);

                if (IsEatingMove(currentCoordinate, out Coordinate rival))
                {
                    hasEatingMoves = !hasEatingMoves; // true
                }
            }
            return(hasEatingMoves);
        }
Example #5
0
        public override bool IsEatingMove(Coordinate i_Target, out Coordinate o_RivalCoord)
        {
            bool isEatingMove = false;

            o_RivalCoord = new Coordinate();
            eVerticalDirections   vertical   = movesForwardOrBackward(this, i_Target);
            eHorizontalDirections horizontal = movesRightOrLeft(this, i_Target);

            Coordinate prevSquare = new Coordinate();

            prevSquare.CopyCoordinates(Coordinates);

            Coin kingCopy = new Coin(CoinType, Board);

            kingCopy.Coordinates.CopyCoordinates(Coordinates);
            Coordinate nextSquare = GetNextSquare(ref kingCopy, vertical, horizontal);

            kingCopy.Coordinates = prevSquare;

            while (Board.IsEmptyValidSquare(nextSquare))
            {
                prevSquare.CopyCoordinates(nextSquare);
                nextSquare = GetNextSquare(ref kingCopy, vertical, horizontal);
            }

            if (kingCopy.IsAbleToEat(nextSquare, out Coordinate target))
            {
                isEatingMove = !isEatingMove; // true
                isEatingMove = (isEatingMove && i_Target.Equals(target));
                if (isEatingMove)
                {
                    o_RivalCoord.CopyCoordinates(nextSquare);
                }
            }

            return(isEatingMove);
        }
Example #6
0
        public override bool isValidMove(Coordinate i_Target)
        {
            bool isValid = false;

            if (i_Target != null)
            {
                eVerticalDirections   vertical   = movesForwardOrBackward(this, i_Target);
                eHorizontalDirections horizontal = movesRightOrLeft(this, i_Target);

                Coordinate prevSquare = new Coordinate();
                prevSquare.CopyCoordinates(Coordinates);

                Coin kingCopy = new Coin(CoinType, Board);
                kingCopy.Coordinates.CopyCoordinates(Coordinates);
                Coordinate nextSquare = GetNextSquare(ref kingCopy, vertical, horizontal);
                kingCopy.Coordinates = prevSquare;

                while (Board.IsValid(nextSquare))
                {
                    if (Board.IsEmptySquare(nextSquare) && nextSquare.Equals(i_Target))
                    {
                        isValid = !isValid; // true
                        break;
                    }
                    else if (kingCopy.IsAbleToEat(nextSquare, out Coordinate target) &&
                             i_Target.Equals(target))
                    {
                        isValid = !isValid; // true
                        break;
                    }
                    prevSquare.CopyCoordinates(nextSquare);
                    nextSquare = GetNextSquare(ref kingCopy, vertical, horizontal);
                }
            }

            return(isValid);
        }
Example #7
0
        /*********************************************** Virtual Methods ************************************************/
        /// <summary>
        /// Returns true iff it is possible to go to the i_Target coordinate AND eat a rival coin during.
        /// </summary>
        /// <param name="i_Target"></param>
        /// <returns></returns>
        public virtual bool IsEatingMove(Coordinate i_Target, out Coordinate o_RivalCoord)
        {
            bool isEatingMove = false;
            eVerticalDirections   vertical   = movesForwardOrBackward(this, i_Target);
            eHorizontalDirections horizontal = movesRightOrLeft(this, i_Target);

            o_RivalCoord = null;
            Coin copy = new Coin(CoinType, Board);

            copy.Coordinates.CopyCoordinates(Coordinates);

            if (vertical == eVerticalDirections.Forword && horizontal != eHorizontalDirections.SamePlace)
            {
                Coordinate nextSquare = GetNextSquare(ref copy, vertical, horizontal);
                if (IsAbleToEat(nextSquare, out Coordinate target))
                {
                    isEatingMove = !isEatingMove;
                    isEatingMove = (isEatingMove && i_Target.Equals(target));
                    o_RivalCoord = new Coordinate();
                    o_RivalCoord.CopyCoordinates(nextSquare);
                }
            }
            return(isEatingMove);
        }
Example #8
0
        public override bool IsAbleToEat(Coordinate i_Rival, out Coordinate o_Target)
        {
            o_Target = new Coordinate();

            Coordinate prevSquare = new Coordinate();

            prevSquare.CopyCoordinates(Coordinates);

            bool isEatingPossibility = false;
            eVerticalDirections   forwordOrBackword = movesForwardOrBackward(this, i_Rival);
            eHorizontalDirections rightOrLeft       = movesRightOrLeft(this, i_Rival);

            Coordinate currentSquare = new Coordinate();
            Coin       kingCopy      = new Coin(CoinType, Board);

            kingCopy.Coordinates.CopyCoordinates(Coordinates);
            currentSquare        = GetNextSquare(ref kingCopy, forwordOrBackword, rightOrLeft);
            kingCopy.Coordinates = prevSquare;

            while (currentSquare != null && Board.IsEmptyValidSquare(currentSquare))
            {
                prevSquare.CopyCoordinates(currentSquare);
                currentSquare = GetNextSquare(ref kingCopy, forwordOrBackword, rightOrLeft);
            }

            if (Board.IsValid(currentSquare))
            {
                isEatingPossibility = kingCopy.IsAbleToEat(currentSquare, out Coordinate target);
                if (isEatingPossibility)
                {
                    o_Target.CopyCoordinates(target);
                }
            }

            return(isEatingPossibility);
        }
Example #9
0
        private List <Coordinate> getNextMovesByDirections(eVerticalDirections i_Vertical, eHorizontalDirections i_Horizontal)
        {
            List <Coordinate> moves = new List <Coordinate>();

            Coordinate prevSquare = new Coordinate();

            prevSquare.CopyCoordinates(Coordinates);

            Coin kingCopy = new KingCoin(CoinType, Board);

            kingCopy.Coordinates.CopyCoordinates(Coordinates);
            Coordinate nextSquare = GetNextSquare(ref kingCopy, i_Vertical, i_Horizontal);

            kingCopy.Coordinates = prevSquare;


            while (Board.IsValid(nextSquare))
            {
                if (Board.IsEmptySquare(nextSquare))
                {
                    moves.Add(nextSquare);
                }
                else if (kingCopy.IsAbleToEat(nextSquare, out Coordinate target))
                {
                    moves.Add(target);
                    break;
                }
                else
                {
                    break;
                }
                prevSquare.CopyCoordinates(nextSquare);
                nextSquare = GetNextSquare(ref kingCopy, i_Vertical, i_Horizontal);
            }

            return(moves);
        }
Example #10
0
        /// <summary>
        /// Gets the next coordinate on the board in relevence to the given i_Coin,
        /// and with respect to the vertical and horizonatl directions.
        /// </summary>
        /// <param name="i_Coin"></param>
        /// <param name="i_Vertical"></param>
        /// <param name="i_Horizontal"></param>
        /// <returns></returns>
        public static Coordinate GetNextSquare(ref Coin i_Coin, eVerticalDirections i_Vertical, eHorizontalDirections i_Horizontal)     // Added ref 07.06.18
        {
            Coordinate newCoord = new Coordinate();

            if (i_Coin != null)
            {
                if (i_Vertical == eVerticalDirections.Forword)
                {
                    if (i_Horizontal == eHorizontalDirections.Right)
                    {
                        newCoord = NextForwordRight(i_Coin);
                    }
                    else if (i_Horizontal == eHorizontalDirections.Left)
                    {
                        newCoord = NextForwordLeft(i_Coin);
                    }
                }
                else if (i_Vertical == eVerticalDirections.Backword)
                {
                    if (i_Horizontal == eHorizontalDirections.Right)
                    {
                        newCoord = NextBackwordRight(i_Coin);
                    }
                    else if (i_Horizontal == eHorizontalDirections.Left)
                    {
                        newCoord = NextBackwordLeft(i_Coin);
                    }
                }
            }
            return(newCoord);
        }