[C#]配列にデータを入れる方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
h24i17

[C#]配列にデータを入れる方法

#1

投稿記事 by h24i17 » 13年前

現在C#で倉庫番のようなものを作っています
そこで、フィールドのデータを配列で管理するようにしているのですが、そのデータの代入方法に手を焼いています

例えば

コード:

namespace game
{
    class Field
    {
        public Maps[,] map = new Maps[10,10];
    }

    class program
    {
        public static void main()
        {
            Field[] field = new Field[10];

            for (int i = 0; i < 10; i++)
            {
                field[i] = new Field();
            }

            //この辺が本題
            field[0].map[0, 0] = Maps.NOTHING;
            field[0].map[0, 1] = Maps.NOTHING;
            field[0].map[0, 2] = Maps.NOTHING;
            field[0].map[0, 3] = Maps.NOTHING;
            field[0].map[0, 4] = Maps.GOAL;
            field[0].map[0, 5] = Maps.NOTHING;
            field[0].map[0, 6] = Maps.STONE;
                :
                :
            field[0].map[9, 9] = Maps.NOTHING;
            //
        }
    }
}
「本題」と書いてある部分のように、マップのデータ代入の処理が単調でやたら長くなってしまいます
初期化と同時にならいっぺんにデータを突っ込めたような気がしましたが、mapがクラスのメンバ変数であるためそれもできません

何か良い方法はありませんでしょうか?

h24i17

Re: [C#]配列にデータを入れる方法

#2

投稿記事 by h24i17 » 13年前

訂正をいくつか

map変数の型はMapsではなくMapでした
あと、mainはMainです

アバター
ookami
記事: 214
登録日時: 14年前
住所: 東京都

Re: [C#]配列にデータを入れる方法

#3

投稿記事 by ookami » 13年前

こんにちは、ookamiです。

単にコードを短くするならマクロか、
あるいはファイルから読み込むようにするかですね。
作ろうとしている規模や、メンテナンス性をどこまで持たせたいかで変わってくると思います。


または、ちょっとアレかもしれませんが、1行分のデータを入力する関数を作るとか。

コード:

void setMapLine(f,l,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9) { // 型が分からなかったので省略
    field[f].map[l,0] = v0;
    field[f].map[l,1] = v1;
    field[f].map[l,2] = v2;
    field[f].map[l,3] = v3;
    field[f].map[l,4] = v4;
    field[f].map[l,5] = v5;
    field[f].map[l,6] = v6;
    field[f].map[l,7] = v7;
    field[f].map[l,8] = v8;
    field[f].map[l,9] = v9;
}

// 使う側
setMapLine(0,0,Maps.NOTHING,Maps.NOTHING,Maps.NOTHING,Maps.NOTHING,Maps.NOTHING,Maps.NOTHING,Maps.NOTHING,Maps.NOTHING,Maps.NOTHING);
さらに、スコープローカルで名前を短くしてやれば、もっと短くなるっちゃなります。

コード:

void setMap(){
    n=Maps.NOTHING; // 型が分からなかったので(ry
    g=Maps.GOAL;
    s=Maps.STONE;
    setMapLine(0,0,n,n,n,n,n,n,n,n,n,n);
    setMapLine(0,1,n,s,n,n,n,n,n,n,n,n);
    setMapLine(0,2,n,s,n,n,g,n,n,n,n,n);
    setMapLine(0,3,n,s,n,n,n,n,n,n,n,n);
    setMapLine(0,4,n,s,n,n,n,n,n,n,n,n);
}

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: [C#]配列にデータを入れる方法

#4

投稿記事 by YuO » 13年前

h24i17 さんが書きました:「本題」と書いてある部分のように、マップのデータ代入の処理が単調でやたら長くなってしまいます
初期化と同時にならいっぺんにデータを突っ込めたような気がしましたが、mapがクラスのメンバ変数であるためそれもできません

コード:

field[0].map = new map[,] {
    { Maps.NOTHING, /* ... */ }
};
なら可能です。

あとは,長くなるなら別のファイルに書く,CSV等からt4 templateで生成するなど,「長くならざるをえない部分を別ファイルに分離する」というのも考え方だと思います。


なお,C#というか.NET Frameworkでは定数やEnum値はPascal Case,つまり単語の頭文字を大文字にして残りを小文字にする書き方が推奨されています。
全部大文字になるのは,実質的に名前空間IOくらいです。
さらに,NothingはVisual Basicのキーワードであるため,利用しないことが推奨されています。
# Emptyあたりが適当でしょうか。

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

Re: [C#]配列にデータを入れる方法

#5

投稿記事 by バグ » 13年前

こういうことかな?
とりあえず、情報がなくて不明な箇所は勝手な解釈で補完して書いてみました。

コード:

namespace game
{
	class Program
	{
		// 仮に全3ステージ、ステージの広さを10*10とする
		const int STAGE_MAX = 3;
		const int STAGE_WIDTH = 10;
		const int STAGE_HEIGHT = 10;

		enum Map
		{
			NOTHING, STONE, GOAL
		}

		class Field
		{
			public Map[,] map = new Map[STAGE_WIDTH, STAGE_HEIGHT];
		}

		static void Main (string[] args)
		{
			Map[][,] stage = new Map[STAGE_MAX][,]
			{
				// ステージ1
				new Map[STAGE_WIDTH, STAGE_HEIGHT]
				{
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING }
				},

				// ステージ2
				new Map[STAGE_WIDTH, STAGE_HEIGHT]
				{
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING }
				},

				// ステージ3
				new Map[STAGE_WIDTH, STAGE_HEIGHT]
				{
					{ Map.STONE, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING },
					{ Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING, Map.NOTHING }
				},
			};


			Field[] field = new Field[STAGE_MAX];
			for (int i = 0; i < STAGE_MAX; ++i)
			{
				field[i] = new Field();
				field[i].map = (Map[,])stage[i].Clone();
			}
		}
	}
}

h24i17

Re: [C#]配列にデータを入れる方法

#6

投稿記事 by h24i17 » 13年前

>ookamiさん
まさかこんな方法があるなんて……
コロンブスの卵とはこういう事を言うのでしょうね
目からうろこです、この方法で書いたらステージのデータがパッと分かるような変数の代入になってすごく見やすかったです
yahoo!知恵袋ならあなたをベストアンサーにしています
本当にありがとうございます

>YuOさん
newの時に初期化する方法もあるのですね、知りませんでした
他にもいろいろな方法を教えていただきましたので、また機会がありましたらそれにも挑戦しようと思います
なお,C#というか.NET Frameworkでは定数やEnum値はPascal Case,つまり単語の頭文字を大文字にして残りを小文字にする書き方が推奨されています。
全部大文字になるのは,実質的に名前空間IOくらいです。
さらに,NothingはVisual Basicのキーワードであるため,利用しないことが推奨されています。
# Emptyあたりが適当でしょうか。
これも知りませんでした
早速ソースコードの当該の部分を訂正します



>バグさんもありがとうござます


この掲示板はやさしく教えてくれる方がたくさんいらっしゃって本当にいいところですね
改めてみなさんありがとうございました

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: [C#]配列にデータを入れる方法

#7

投稿記事 by ISLe » 13年前

YuO さんが書きました:なお,C#というか.NET Frameworkでは定数やEnum値はPascal Case,つまり単語の頭文字を大文字にして残りを小文字にする書き方が推奨されています。
全部大文字になるのは,実質的に名前空間IOくらいです。
さらに,NothingはVisual Basicのキーワードであるため,利用しないことが推奨されています。
これは.NET Frameworkのクラスライブラリに対する命名規則ですよね。
.NET Framework自体は言語に依存してはいけない(C#,VB,C++/CLI等で使う)ので、どんな言語でも使える最低限の文字だけを使い、大文字と小文字が区別されることを期待しないようにしましょうということだと思いますが。
C#,C++/CLIは識別子の大文字小文字を区別しますけど、VBは区別しないですからね。

Nothing識別子もライブラリがVBで使われる場合に問題があるので使わないようにしましょうということであって、C#の中だけで使う分には何も問題ないと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る