0

我制作了一个使用多维数组的图块级别系统,例如:

new int[,]{
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,},
            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},

每个特定数字代表一个块(瓦片)。这只是在代码中。我想编写一个可以加载级别的系统(一个多维 int 数组)该数组需要从字符串转换。我怎么做?

    public static int[,] getLvl(string lvlName = "")
    {
        string readed = "";
        using (StreamReader read = new StreamReader(path))
        {
            readed = read.ReadToEnd();
        }
        return null; //What to put here?!?!?!
    }

编辑:我还没有要读取的文件格式。所以你可以灵活处理。

4

4 回答 4

1

我认为您真的不需要或不应该尝试将其序列化为 XML 或其他格式,因为您的数据存储非常简单。

一种简单的方法是将数组作为逗号分隔值存储在文本文件中。所以一个级别可能有:

0,0,0,1
0,1,1,0
0,1,1,3
3,3,4,1

String.Split()方法对于解析像这样简单的东西非常有用。它允许您根据某个定界字符将字符串拆分为子字符串数组。

一步步:

首先,您可以使用var RowArray = MyString.Split('\n')(换行符)将字符串拆分为行数组。这给你留下了数组:

[0]: "0,0,0,1"
[1]: "0,1,1,0"
[2]: "0,1,1,3"
[3]: "3,3,4,1"

您可以在这里看到什么Split()以及为什么这对您的案例有用。您可以依次运行拆分每一行,','留下一个数组数组,您可以很容易地将其转换为您正在寻找的二维数组。

这里的一个陷阱在某个地方,根据您的设计需要,一个不变量可能必须是文件中所有行的长度都相同。或者如果你不能保证,你将不得不编写一些代码,以便在将下面的文本从行数组转换为数组时,使宽度等于最长行并用 0 或一些填充空白其他方法。

0,0,0,1,6,4
0,1,1,0
0,1,1,3,2,6,3,7,1
3,3,4,1,2,4
于 2013-08-29T19:03:34.890 回答
1

对于这种格式,最短的方法是使用 linq:

 0,0,0,0,0
 1,0,1,0,1
 ....

你可以使用这句话:

 int[][] Data =   File.ReadAllLines( path )
                      .Select( s => s.Trim())
                      .Where( s => !string.IsNullOrempty(s))
                      .Select( s => s.Split( ',' )
                                     .Select( token => int.Parse( token ) )
                                     .ToArray( ) )
                      .ToArray( );

 var DataToOneDim = Data.SelectMany( a => a).ToArray();
 var Result = new int[Data[0].Length, Data.Length];
 Buffer.BlockCopy( DataToOneDim, 0, Result, 0, DataToOneDim.Length );
于 2013-08-29T22:23:59.803 回答
0

我相信还有其他一些关于此的帖子,但是您可以使用 XML 并解析每个可能的维度,或者使用SoapFormatter该类一次序列化所有内容。下面是一个类似问题的链接,其中包含一些示例:

将多维数组转换为字符串并返回

于 2013-08-29T18:19:42.763 回答
0

我为你做的很快,你可以做得更好,不要忘记投票:_)

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{

    var array =
        "{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,} , {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}";

    string input = array;
    string pattern = @"{|}";
    var index = 0;
    var results = new int[100,100];
    foreach (var result in Regex.Split(input, pattern))
    {
        var sp = result.Split(',');
        if (sp.Length <4)
        continue;

        for (int i = 0; i < sp.Count(); i++)
        {
            if (!string.IsNullOrEmpty(sp[i]))
             results[index,i] = Convert.ToInt32(sp[i]);
        }

        index++;
    }
   }
  }
 }
于 2013-08-29T18:38:42.597 回答