Esempio n. 1
0
        protected virtual SolutionPack MoveRightSolves(BoardPosition position)
        {
            var solutions = new SolutionPack(position.ArrayPosition,
                                             new Point(position.ArrayPosition.X + 1, position.ArrayPosition.Y));

            int hyperCubeWeight = (position.Piece == BoardPiece.HyperCube) ? (int)position.Piece.Weight : 0;

            var firstRightOf = board.RightOf(position);

            if (firstRightOf == null || firstRightOf.Piece == position.Piece)
            {
                return(solutions);
            }

            var secondRightOf = board.RightOf(firstRightOf);
            var thirdRightOf  = board.RightOf(secondRightOf);

            var firstNewTopOf  = board.TopOf(firstRightOf);
            var secondNewTopOf = board.TopOf(firstNewTopOf);

            var firstNewBottomOf  = board.BottomOf(firstRightOf);
            var secondNewBottomOf = board.BottomOf(firstNewBottomOf);

            bool alignsRight = (secondRightOf != null && thirdRightOf != null) &&
                               (position.Piece == secondRightOf.Piece) &&
                               (position.Piece == thirdRightOf.Piece);

            bool alignsTop = (firstNewTopOf != null && secondNewTopOf != null) &&
                             (position.Piece == firstNewTopOf.Piece) &&
                             (position.Piece == secondNewTopOf.Piece);

            bool alignsBottom = (firstNewBottomOf != null && secondNewBottomOf != null) &&
                                (position.Piece == firstNewBottomOf.Piece) &&
                                (position.Piece == secondNewBottomOf.Piece);

            bool alignsTopBottom = (firstNewTopOf != null && firstNewBottomOf != null) &&
                                   (position.Piece == firstNewTopOf.Piece) &&
                                   (position.Piece == firstNewBottomOf.Piece);

            bool alignsTopBottom4a = (firstNewTopOf != null && firstNewBottomOf != null && secondNewBottomOf != null) &&
                                     position.Piece == firstNewTopOf.Piece &&
                                     position.Piece == firstNewBottomOf.Piece &&
                                     position.Piece == secondNewBottomOf.Piece;

            bool alignsTopBottom4b = (firstNewTopOf != null && secondNewTopOf != null && firstNewBottomOf != null) &&
                                     position.Piece == firstNewTopOf.Piece && position.Piece == secondNewTopOf.Piece &&
                                     position.Piece == firstNewBottomOf.Piece;

            bool alignsTopBottom5 = alignsTopBottom4a && (secondNewTopOf != null) &&
                                    position.Piece == secondNewTopOf.Piece;

            if (alignsRight)
            {
                solutions.Solution1.Weight = position.Piece.Weight + secondRightOf.Piece.Weight
                                             + thirdRightOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsTop)
            {
                solutions.Solution2.Weight = position.Piece.Weight + firstNewTopOf.Piece.Weight
                                             + secondNewTopOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsBottom)
            {
                solutions.Solution3.Weight = position.Piece.Weight + firstNewBottomOf.Piece.Weight
                                             + secondNewBottomOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsTopBottom)
            {
                solutions.Solution4.Weight = position.Piece.Weight + firstNewTopOf.Piece.Weight
                                             + firstNewBottomOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsTopBottom4a)
            {
                solutions.Solution5.Weight = position.Piece.Weight + firstNewTopOf.Piece.Weight
                                             + firstNewBottomOf.Piece.Weight + secondNewBottomOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsTopBottom4b)
            {
                solutions.Solution6.Weight = position.Piece.Weight + firstNewTopOf.Piece.Weight
                                             + secondNewTopOf.Piece.Weight + firstNewBottomOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsTopBottom5)
            {
                solutions.Solution7.Weight = position.Piece.Weight + firstNewTopOf.Piece.Weight
                                             + secondNewTopOf.Piece.Weight + firstNewBottomOf.Piece.Weight
                                             + secondNewBottomOf.Piece.Weight + hyperCubeWeight;
            }

            return(solutions);
        }
Esempio n. 2
0
        protected virtual SolutionPack MoveDownSolves(BoardPosition position)
        {
            var solutions = new SolutionPack(position.ArrayPosition,
                                             new Point(position.ArrayPosition.X, position.ArrayPosition.Y + 1));

            decimal hyperCubeWeight = (position.Piece == BoardPiece.HyperCube) ? position.Piece.Weight : 0;

            var firstBottomOf = board.BottomOf(position);

            if (firstBottomOf == null || firstBottomOf.Piece == position.Piece)
            {
                return(solutions);
            }

            var secondBottomOf = board.BottomOf(firstBottomOf);
            var thirdBottomOf  = board.BottomOf(secondBottomOf);

            var firstNewLeftOf  = board.LeftOf(firstBottomOf);
            var secondNewLeftOf = board.LeftOf(firstNewLeftOf);

            var firstNewRightOf  = board.RightOf(firstBottomOf);
            var secondNewRightOf = board.RightOf(firstNewRightOf);

            bool alignsBottom = (secondBottomOf != null && thirdBottomOf != null) &&
                                (position.Piece == secondBottomOf.Piece) &&
                                (position.Piece == thirdBottomOf.Piece);

            bool alignsLeft = (firstNewLeftOf != null && secondNewLeftOf != null) &&
                              (position.Piece == firstNewLeftOf.Piece) &&
                              (position.Piece == secondNewLeftOf.Piece);

            bool alignsRight = (firstNewRightOf != null && secondNewRightOf != null) &&
                               (position.Piece == firstNewRightOf.Piece) &&
                               (position.Piece == secondNewRightOf.Piece);

            bool alignsLeftRight = (firstNewLeftOf != null && firstNewRightOf != null) &&
                                   (position.Piece == firstNewLeftOf.Piece) &&
                                   (position.Piece == firstNewRightOf.Piece);

            bool alignsLeftRight4a = (firstNewLeftOf != null && firstNewRightOf != null && secondNewRightOf != null) &&
                                     position.Piece == firstNewLeftOf.Piece &&
                                     position.Piece == firstNewRightOf.Piece &&
                                     position.Piece == secondNewRightOf.Piece;

            bool alignsLeftRight4b = (firstNewLeftOf != null && secondNewLeftOf != null && firstNewRightOf != null) &&
                                     position.Piece == firstNewLeftOf.Piece && position.Piece == secondNewLeftOf.Piece &&
                                     position.Piece == firstNewRightOf.Piece;

            bool alignsLeftRight5 = alignsLeftRight4a && (secondNewLeftOf != null) &&
                                    position.Piece == secondNewLeftOf.Piece;

            if (alignsBottom)
            {
                solutions.Solution1.Weight = position.Piece.Weight + secondBottomOf.Piece.Weight
                                             + thirdBottomOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsLeft)
            {
                solutions.Solution2.Weight = position.Piece.Weight + firstNewLeftOf.Piece.Weight
                                             + secondNewLeftOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsRight)
            {
                solutions.Solution3.Weight = position.Piece.Weight + firstNewRightOf.Piece.Weight
                                             + secondNewRightOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsLeftRight)
            {
                solutions.Solution4.Weight = position.Piece.Weight + firstNewLeftOf.Piece.Weight
                                             + firstNewRightOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsLeftRight4a)
            {
                solutions.Solution5.Weight = position.Piece.Weight + firstNewLeftOf.Piece.Weight
                                             + firstNewRightOf.Piece.Weight + secondNewRightOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsLeftRight4b)
            {
                solutions.Solution6.Weight = position.Piece.Weight + firstNewLeftOf.Piece.Weight
                                             + secondNewLeftOf.Piece.Weight + firstNewRightOf.Piece.Weight + hyperCubeWeight;
            }

            if (alignsLeftRight5)
            {
                solutions.Solution7.Weight = position.Piece.Weight + firstNewLeftOf.Piece.Weight
                                             + secondNewLeftOf.Piece.Weight + firstNewRightOf.Piece.Weight
                                             + secondNewRightOf.Piece.Weight + hyperCubeWeight;
            }

            return(solutions);
        }