0

i'm trying to convert a string from file to 2d array. Is it possible to make the array dynamic? And how can i return the array, so i can work with it? I'm really confused.

public interface IMazeLoader
{
    Maze LoadMaze(string src);
}

class MazeLoader : IMazeLoader
{
    public Maze LoadMaze(string filepath)
    {
        var width = 5;
        var height = 5;
        var map = new char[width, height];
        var file = new StreamReader(filepath);
        string line;
        var lineCount = 0;
        while ((line = file.ReadLine()) != null)
        {
            if (lineCount < height)
            {
                for (int i = 0; i < width && i < line.Length; i++)
                {
                    map[i, lineCount] = line[i];
                }
            }
            lineCount++;
        }

        file.Close();

        return;
    }
}

Here is my Maze class :

public class Maze
    {
    public static readonly char CHAR_WALL = '#';
    public static readonly char CHAR_START = 'S';
    public static readonly char CHAR_FINISH = 'F';

    public int Width { get; internal set; }
    public int Height { get; internal set; }

    public int StartX { get; private set;}
    public int StartY { get; private set; }
    public int StartAngle { get; private set; }

    private char[,] _plan;

    public char[,] Plan { get { return _plan; } }

    public Maze(char[,] plan)
    {

    }

Thanks for any reply, happy Eastern btw. :)

1
  • Can you also share the file's contents? Commented Apr 16, 2022 at 1:27

1 Answer 1

1

Something like this should allow you to load any rectangular dimension map:

public class MazeLoader : IMazeLoader
{
    public Maze LoadMaze(string filepath)
    {
        char[][] loaded =
            File
                .ReadLines(filepath)
                .Select(x => x.ToCharArray())
                .ToArray();
        
        int[] widths =
            loaded
                .Select(x => x.Length)
                .Distinct()
                .ToArray();
                
        if (widths.Length != 1)
        {
            throw new InvalidDataException("Map Data Not Rectangular");
        }
        else
        {
            var width = widths[0];
            var height = loaded.Length;
            var map = new char[height, width];

            for (int i = 0; i < height; i++)
                for (int j = 0; j < width; j++)
                    map[i, j] = loaded[i][j];

            return new Maze(map);
        }
    }
}

Now I tested this on this input:

aaaa
aaaa
bbbb
bbbb
bbbb

And got this map:

map

Please note that the file orientation and the map orientation are the same. I had to flip around how you were building our your map to get that to work.

Here's my alterations to Maze itself:

public class Maze
{
    public int Width => this.Plan.GetUpperBound(1) - this.Plan.GetLowerBound(1) + 1;
    public int Height => this.Plan.GetUpperBound(0) - this.Plan.GetLowerBound(0) + 1;

    public char[,] Plan { get; private set; }
    
    public Maze(char[,] plan)
    {
        this.Plan = plan;
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.