コード例 #1
0
ファイル: Maze.cs プロジェクト: Witcher47/TEST_NAME
        public bool CanPass2(LocationInMaze from, LocationInMaze to, int currentGameTurn, bool checkPassibility = true)
        {
            if (from.Equals(to))
            {
                return(false);
            }

            var fromSegment = Segments[from.SegmentId];
            //If something stands on destination cell
            var objectsOnCell = GetObjects(to);

            if (checkPassibility && objectsOnCell != null && objectsOnCell.Any(o => !o.IsPassable))
            {
                return(false);
            }

            //Moving on same segment
            if (from.SegmentId == to.SegmentId)
            {
                return(fromSegment.CanPass(from.CoordsInSegment, to.CoordsInSegment));
            }

            //Current maze is blocked
            if (Segments[from.SegmentId].HasEffect(MazeSegmentEffectType.Blocked, currentGameTurn) ||
                Segments[to.SegmentId].HasEffect(MazeSegmentEffectType.Blocked, currentGameTurn))
            {
                return(false);
            }

            var sideLength     = (int)Math.Sqrt(fromSegment.Matrix.GetLength(0));
            var mazeSideCenter = (int)Math.Round((double)sideLength / 2);

            if (from.CoordsInSegment.Equals(to.CoordsInSegment))
            {
                return(false);
            }

            //Check we are standing before the gate
            if (from.CoordsInSegment.X != mazeSideCenter && from.CoordsInSegment.Y != mazeSideCenter)
            {
                return(false);
            }

            //One of coords has to be the same
            if (from.CoordsInSegment.X != to.CoordsInSegment.X && from.CoordsInSegment.Y != to.CoordsInSegment.Y)
            {
                return(false);
            }

            var isSameRow    = from.SegmentId / 2 == to.SegmentId / 2;
            var isSameColumn = from.SegmentId % 2 == to.SegmentId % 2;

            var isFromSmallest = from.SegmentId < to.SegmentId;

            if (isSameRow)
            {
                if (from.CoordsInSegment.Y != mazeSideCenter || to.CoordsInSegment.Y != mazeSideCenter)
                {
                    return(false);
                }

                //One coord has to have max x and other min x
                if (Math.Abs(from.CoordsInSegment.X - to.CoordsInSegment.X) != sideLength - 1)
                {
                    return(false);
                }

                if (isFromSmallest && from.CoordsInSegment.X != sideLength - 1 ||
                    !isFromSmallest && to.CoordsInSegment.X != sideLength - 1)
                {
                    return(false);
                }
            }
            else
            {
                if (isSameColumn)
                {
                    if (from.CoordsInSegment.X != mazeSideCenter || to.CoordsInSegment.X != mazeSideCenter)
                    {
                        return(false);
                    }

                    //One coord has to have max y and other min y
                    if (Math.Abs(from.CoordsInSegment.Y - to.CoordsInSegment.Y) != sideLength - 1)
                    {
                        return(false);
                    }

                    if (isFromSmallest && from.CoordsInSegment.Y != sideLength - 1 ||
                        !isFromSmallest && to.CoordsInSegment.Y != sideLength - 1)
                    {
                        return(false);
                    }
                }
                else// different row and column
                {
                    var isRightColumnFrom = from.SegmentId % 2 == 0;
                    if (isRightColumnFrom && (from.CoordsInSegment.X == sideLength - 1))
                    {
                        return(false);
                    }

                    var isFirstRowFrom = from.SegmentId / 2 == 0;
                    if (isFirstRowFrom && (from.CoordsInSegment.Y == sideLength - 1))
                    {
                        return(false);
                    }

                    if (!isRightColumnFrom && (from.CoordsInSegment.X == 0))
                    {
                        return(false);
                    }
                    if (!isFirstRowFrom && (from.CoordsInSegment.Y == 0))
                    {
                        return(false);
                    }

                    //We are moving verticaly
                    if (from.CoordsInSegment.X == mazeSideCenter && to.CoordsInSegment.X != mazeSideCenter)
                    {
                        return(false);
                    }
                    if (to.CoordsInSegment.X == mazeSideCenter && from.CoordsInSegment.X != mazeSideCenter)
                    {
                        return(false);
                    }
                    if (from.CoordsInSegment.Y == mazeSideCenter && to.CoordsInSegment.Y != mazeSideCenter)
                    {
                        return(false);
                    }
                    if (to.CoordsInSegment.Y == mazeSideCenter && from.CoordsInSegment.Y != mazeSideCenter)
                    {
                        return(false);
                    }
                    if (from.CoordsInSegment.X == sideLength - 1 && to.CoordsInSegment.X != 0)
                    {
                        return(false);
                    }
                    if (to.CoordsInSegment.X == sideLength - 1 && from.CoordsInSegment.X != 0)
                    {
                        return(false);
                    }
                    if (from.CoordsInSegment.Y == sideLength - 1 && to.CoordsInSegment.Y != 0)
                    {
                        return(false);
                    }
                    if (to.CoordsInSegment.Y == sideLength - 1 && from.CoordsInSegment.Y != 0)
                    {
                        return(false);
                    }
                    if (from.CoordsInSegment.X == 0 && to.CoordsInSegment.X != sideLength - 1)
                    {
                        return(false);
                    }
                    if (to.CoordsInSegment.X == 0 && from.CoordsInSegment.X != sideLength - 1)
                    {
                        return(false);
                    }
                    if (from.CoordsInSegment.Y == 0 && to.CoordsInSegment.Y != sideLength - 1)
                    {
                        return(false);
                    }
                    if (to.CoordsInSegment.Y == 0 && from.CoordsInSegment.Y != sideLength - 1)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
コード例 #2
0
ファイル: Maze.cs プロジェクト: Witcher47/TEST_NAME
        public bool CanPass(LocationInMaze from, LocationInMaze to, int currentGameTurn, bool checkImpassibleObjects = true)
        {
            if (from.Equals(to))
            {
                return(false);
            }

            var objectsOnCell = GetObjects(to);

            if (checkImpassibleObjects && objectsOnCell != null && objectsOnCell.Any(o => !o.IsPassable))
            {
                return(false);
            }

            if (from.SegmentId == to.SegmentId)
            {
                return(Segments[from.SegmentId].CanPass(from.CoordsInSegment, to.CoordsInSegment));
            }

            if (Segments[from.SegmentId].HasEffect(MazeSegmentEffectType.Blocked, currentGameTurn) ||
                Segments[to.SegmentId].HasEffect(MazeSegmentEffectType.Blocked, currentGameTurn))
            {
                return(false);
            }

            if (from.CoordsInSegment.X != to.CoordsInSegment.X && from.CoordsInSegment.Y != to.CoordsInSegment.Y)
            {
                return(false);
            }


            var fromSegment      = Segments[from.SegmentId];
            var mazeSide         = (int)Math.Sqrt(fromSegment.Matrix.GetLength(0));
            var mazeSideCenter   = mazeSide / 2;
            var isFromLeftGate   = from.CoordsInSegment.X == 0 && from.CoordsInSegment.Y == mazeSideCenter;
            var isFromRightGate  = from.CoordsInSegment.X == mazeSide - 1 && from.CoordsInSegment.Y == mazeSideCenter;
            var isFromTopGate    = from.CoordsInSegment.Y == 0 && from.CoordsInSegment.X == mazeSideCenter;
            var isFromBottomGate = from.CoordsInSegment.Y == mazeSide - 1 && from.CoordsInSegment.X == mazeSideCenter;

            var isToLeftGate   = to.CoordsInSegment.X == 0 && to.CoordsInSegment.Y == mazeSideCenter;
            var isToRightGate  = to.CoordsInSegment.X == mazeSide - 1 && to.CoordsInSegment.Y == mazeSideCenter;
            var isToTopGate    = to.CoordsInSegment.Y == 0 && to.CoordsInSegment.X == mazeSideCenter;
            var isToBottomGate = to.CoordsInSegment.Y == mazeSide - 1 && to.CoordsInSegment.X == mazeSideCenter;

            var isFromFirstRow    = from.SegmentId / 2 == 0;
            var isFromFirstColumn = from.SegmentId % 2 == 0;
            var onSameRow         = from.SegmentId / 2 == to.SegmentId / 2;
            var onSameColumn      = from.SegmentId % 2 == to.SegmentId % 2;

            if (!isFromRightGate && !isFromLeftGate && !isFromTopGate && !isFromBottomGate)
            {
                return(false);
            }

            if (!isToRightGate && !isToLeftGate && !isToTopGate && !isToBottomGate)
            {
                return(false);
            }

            if (isFromRightGate)
            {
                if (!isToLeftGate)
                {
                    return(false);
                }

                var neighbourSegment = (to.SegmentId - from.SegmentId) == 1;

                if (!neighbourSegment)
                {
                    var isDiagonal = (!onSameColumn && !onSameRow);
                    if (!isDiagonal)
                    {
                        return(false);
                    }

                    if (isDiagonal && (from.SegmentId == 0 && from.CoordsInSegment.X != 0))
                    {
                        return(false);
                    }

                    if (isDiagonal && (from.SegmentId == 3 && from.CoordsInSegment.X == 0))
                    {
                        return(false);
                    }
                    if (isDiagonal && (from.SegmentId == 2 && from.CoordsInSegment.X == mazeSide - 1))
                    {
                        return(false);
                    }
                }
                //)}
                //  return false;
            }

            if (isFromLeftGate)
            {
                if (!isToRightGate)
                {
                    return(false);
                }

                var isDiagonal = (!onSameColumn && !onSameRow);
                if (((from.SegmentId - to.SegmentId) != 1) && (!isDiagonal || from.SegmentId == 1))
                {
                    return(false);
                }

                if (isDiagonal && (from.SegmentId == 3 && from.CoordsInSegment.X == 0))
                {
                    return(false);
                }
            }

            if (isFromTopGate)
            {
                if (!isToBottomGate)
                {
                    return(false);
                }

                if (isFromFirstRow)
                {
                    if (isFromFirstColumn && to.SegmentId != 3)
                    {
                        return(false);
                    }
                    if (!isFromFirstColumn && to.SegmentId != 2)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (isFromFirstColumn && to.SegmentId != 0)
                    {
                        return(false);
                    }
                    if (!isFromFirstColumn && to.SegmentId != 1)
                    {
                        return(false);
                    }
                }
            }

            if (isFromBottomGate)
            {
                if (!isToTopGate)
                {
                    return(false);
                }

                if (isFromFirstRow)
                {
                    if (isFromFirstColumn && to.SegmentId != 2)
                    {
                        return(false);
                    }
                    if (!isFromFirstColumn && to.SegmentId != 3)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (isFromFirstColumn && to.SegmentId != 1)
                    {
                        return(false);
                    }
                    if (!isFromFirstColumn && to.SegmentId != 0)
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }