示例#1
0
        private static bool ExpandConnection(PositionedConnection conn, char[,] artChars)
        {
            Position currentPos            = conn.track[conn.track.Count - 1];
            List <Position.Direction> dirs = new List <Position.Direction>();

            foreach (var direction in PositionedConnection.GetContainedDirections(conn.tailDirection))
            {
                Position newPos = currentPos + direction;
                if (newPos.IsWithin(artChars))
                {
                    Position.Direction thisDir = CharFits(artChars[newPos.x, newPos.y], direction);
                    if (thisDir != Position.Direction.None)
                    {
                        dirs.Add(direction);
                    }
                }
            }
            if (dirs.Count == 0)
            {
                throw new InvalidOperationException("Connection reaches dead end");
            }
            if (dirs.Count > 1)
            {
                throw new InvalidOperationException("Connection reaches splitting point: not allowed");
            }
            Position newPoint = currentPos + dirs[0];

            conn.track.Add(newPoint);
            conn.tailDirection = CharFits(artChars[newPoint.x, newPoint.y], dirs[0]);
            return(!TailAtEnd(artChars[newPoint.x, newPoint.y]));
        }
示例#2
0
        private static Position.Direction CharFits(char found, Position.Direction direction)
        {
            if (found == '+' || found == '#')
            {
                switch (direction)
                {
                case Position.Direction.North:
                    return(Position.Direction.East | Position.Direction.West | Position.Direction.North);

                case Position.Direction.East:
                    return(Position.Direction.North | Position.Direction.East | Position.Direction.South);

                case Position.Direction.South:
                    return(Position.Direction.East | Position.Direction.West | Position.Direction.South);

                case Position.Direction.West:
                    return(Position.Direction.West | Position.Direction.North | Position.Direction.South);

                default: return(Position.Direction.None);
                }
            }
            if (found == '|')
            {
                switch (direction)
                {
                case Position.Direction.North:
                    return(Position.Direction.North);

                case Position.Direction.South:
                    return(Position.Direction.South);

                default:
                    return(Position.Direction.None);
                }
            }
            if (found == '-')
            {
                switch (direction)
                {
                case Position.Direction.East:
                    return(Position.Direction.East);

                case Position.Direction.West:
                    return(Position.Direction.West);

                default:
                    return(Position.Direction.None);
                }
            }
            if (found >= 'a' && found <= 'z')
            {
                return(direction);
            }
            if (found >= '0' && found <= '9')
            {
                return(direction);
            }
            return(Position.Direction.None);
        }
示例#3
0
 public static IEnumerable <Position.Direction> GetContainedDirections(Position.Direction dir)
 {
     foreach (var possibleDir in Position.AllDirections)
     {
         if (possibleDir == Position.Direction.None)
         {
             continue;
         }
         if ((dir & possibleDir) == possibleDir)
         {
             yield return(possibleDir);
         }
     }
 }
示例#4
0
        private static void ExtractConnectionEndFor(Position pos, char[,] artChars, Position.Direction dir, char pointerSymbol, List <PositionedConnection> pointers)
        {
            int difX = (dir == Position.Direction.East ? 1 : (dir == Position.Direction.West ? -1 : 0));
            int difY = (dir == Position.Direction.South ? 1 : (dir == Position.Direction.North ? -1 : 0));

            pos.x += difX; pos.y += difY;
            if (pos.x < 0 || pos.y < 0 || pos.x >= artChars.GetLength(0) || pos.y >= artChars.GetLength(1))
            {
                return;
            }
            if (artChars[pos.x, pos.y] == pointerSymbol)
            {
                PositionedConnection newConn = new PositionedConnection()
                {
                    tailDirection = dir
                };
                newConn.track.Add(pos);
                pointers.Add(newConn);
            }
        }