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 やその他の形式にシリアル化する必要はないと思います。

簡単な方法の 1 つは、配列をコンマ区切りの値としてテキスト ファイルに保存することです。したがって、1 つのレベルには次のようなものがあります。

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()が行われ、それがあなたのケースに役立つ理由をある程度見ることができます。次に、配列の配列を残して各行の分割を実行','できます。これは、探している正確な 2D 配列に非常に簡単に変換できます。

ここでの 1 つの落とし穴は、設計のニーズによっては、ファイル内のすべての行が同じ長さになるという不変条件が必要になる場合があります。または、それを保証できない場合は、以下のテキストを行の配列から配列に変換するときに、幅を最も長い行に等しくし、空白を 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

投票を忘れないでください:_)

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 に答える
0

これに関して他にもいくつかの投稿があると思いますが、XML を使用して考えられる各次元を解析するか、SoapFormatterクラスを使用してすべてを一度にシリアル化することができます。以下は、いくつかの例を含む同様の質問へのリンクです。

多次元配列を文字列に変換して戻す

于 2013-08-29T18:19:42.763 に答える