C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: 多次元配列の初期化の書き方


(過去ログ 51 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■28254 / inTopicNo.1)  多次元配列の初期化の書き方
  
□投稿者/ orochi (1回)-(2008/11/22(Sat) 02:17:52)

分類:[C#] 

こんにちは。
現在、以下のようなデータがあり、これらをジャグ配列にまとめようとしているのですが、初期化する書き方が分からない状態です

データの内容
1:名前
2:状態
3:必殺技

ここで1の「名前」には以下のような文字列であるとします
"覇王丸","ナコルル","天草四郎時貞"(要素数3)

2の「状態」は以下のような文字列です
"修羅","羅刹"(要素数2)

3の「必殺技」は「名前」と「状態」により異なります
例えば
「覇王丸」「修羅」なら「旋風裂斬」、「孤月斬」の2つ
「覇王丸」「羅刹」なら「旋風破」の1つ
「ナコルル」「修羅」なら「アンヌムツベ」「レラムツベ」「カムイリムセ」の3つ
「ナコルル」「羅刹」なら「狼に乗る」の1つ
「天草四郎時貞」「修羅」なら「汝、暗転入滅せよ」「逢魔刻」の2つ
「天草四郎時貞」「羅刹」なら「降魔招来破」「戒烈掌」の2つ

となります

これらのデータをまとめて「X番目の名前のY状態のときのZ番目の必殺技」を知ることのできる配列を作りたく思っています
ここで初期化として「必殺技」の名前が配列の各要素に入ることになります
ということで、第1次元を「名前」第2次元を「状態」、第3次元を「必殺技」とした以下のような方法で配列を作ろうとしたのですが、
どちらの方法で書こうとしてもどうやって初期化を書いたらいいのかわかりません
書き方がわかる方、教えていただけないでしょうか?



// 方法その1 (普通の配列でやってみようとした)
public class spmove
{
public string[, ,] skillname = new string[,,]
  {
// ここで値を書きたいが、どうやって書いたらいいか分からない(必殺技が入る)
};
}

// 方法その2(ジャグ配列の使用を考えた)
public class spmove
{
public string[][][] skillname = new string[3][][]
{
// ここで値を書きたいが、どうやって書いたらいいか分からない(必殺技が入る)
}
}

例)
skillname[0][1][1]にアクセスした場合"孤月斬"と表示させたい

引用返信 編集キー/
■28255 / inTopicNo.2)  Re[1]: 多次元配列の初期化の書き方
□投稿者/ 倉田 有大 (353回)-(2008/11/22(Sat) 03:37:08)
No28254 (orochi さん) に返信
> こんにちは。
> 現在、以下のようなデータがあり、これらをジャグ配列にまとめようとしているのですが、初期化する書き方が分からない状態です
>
> データの内容
> 1:名前
> 2:状態
> 3:必殺技
>
> ここで1の「名前」には以下のような文字列であるとします
> "覇王丸","ナコルル","天草四郎時貞"(要素数3)
>
> 2の「状態」は以下のような文字列です
> "修羅","羅刹"(要素数2)
>
> 3の「必殺技」は「名前」と「状態」により異なります
> 例えば
> 「覇王丸」「修羅」なら「旋風裂斬」、「孤月斬」の2つ
> 「覇王丸」「羅刹」なら「旋風破」の1つ
> 「ナコルル」「修羅」なら「アンヌムツベ」「レラムツベ」「カムイリムセ」の3つ
> 「ナコルル」「羅刹」なら「狼に乗る」の1つ
> 「天草四郎時貞」「修羅」なら「汝、暗転入滅せよ」「逢魔刻」の2つ
> 「天草四郎時貞」「羅刹」なら「降魔招来破」「戒烈掌」の2つ
>
> となります
>
> これらのデータをまとめて「X番目の名前のY状態のときのZ番目の必殺技」を知ることのできる配列を作りたく思っています
> ここで初期化として「必殺技」の名前が配列の各要素に入ることになります
> ということで、第1次元を「名前」第2次元を「状態」、第3次元を「必殺技」とした以下のような方法で配列を作ろうとしたのですが、
> どちらの方法で書こうとしてもどうやって初期化を書いたらいいのかわかりません
> 書き方がわかる方、教えていただけないでしょうか?
>
>
>
> // 方法その1 (普通の配列でやってみようとした)
> public class spmove
> {
> public string[, ,] skillname = new string[,,]
>   {
> // ここで値を書きたいが、どうやって書いたらいいか分からない(必殺技が入る)
> };
> }
>
> // 方法その2(ジャグ配列の使用を考えた)
> public class spmove
> {
> public string[][][] skillname = new string[3][][]
> {
> // ここで値を書きたいが、どうやって書いたらいいか分からない(必殺技が入る)
> }
> }
>
> 例)
> skillname[0][1][1]にアクセスした場合"孤月斬"と表示させたい
>

ジャグ配列は使ったことがないですが、classや構造体じゃだめですか?
多分、あつかいやすく、よみやすくなると思いますよ。

class
{
string name;
string status;
arraylist hissatu;
}

wiiからなのでいい加減なソースで失礼。
引用返信 編集キー/
■28256 / inTopicNo.3)  Re[2]: 多次元配列の初期化の書き方
□投稿者/ やじゅ (792回)-(2008/11/22(Sat) 08:54:21)
やじゅ さんの Web サイト
> ■No28254 (orochi さん) に返信
>>「覇王丸」「修羅」なら「旋風裂斬」、「孤月斬」の2つ

多次元配列 (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/2yd9wwz4(VS.80).aspx
.NET の多次元配列とジャグ配列
http://d.hatena.ne.jp/fyts/20071104/array

たぶん、こんな感じ。間違ってるかも(^^;

string[, ,] skillnam = new string[,,] { 
  {  { "覇王丸", "修羅", "旋風裂斬" } }, 
  {  { "覇王丸", "修羅", "孤月斬" }   },
  {  { "覇王丸", "羅刹", "旋風破" }   }, 
  {  { "ナコルル", "修羅", "アンヌムツベ" } },
  {  { "ナコルル", "修羅", "レラムツベ"   } },
  {  { "ナコルル", "修羅", "カムイリムセ" } },
  {  { "ナコルル", "羅刹", "狼に乗る"     } },
  {  { "天草四郎時貞", "修羅", "汝、暗転入滅せよ" } },
  {  { "天草四郎時貞", "修羅", "逢魔刻"           } },
  {  { "天草四郎時貞", "羅刹", "降魔招来破"       } },
  {  { "天草四郎時貞", "羅刹", "戒烈掌"           } }
};


引用返信 編集キー/
■28260 / inTopicNo.4)  Re[1]: 多次元配列の初期化の書き方
□投稿者/ .SHO (139回)-(2008/11/22(Sat) 12:11:45)
No28254 (orochi さん) に返信

> 例)
> skillname[0][1][1]にアクセスした場合"孤月斬"と表示させたい

skillname[0][0][1]じゃなくて?
skillname[0][1][1]だと、どうしたいのかよくわからないです。
引用返信 編集キー/
■28261 / inTopicNo.5)  Re[2]: 多次元配列の初期化の書き方
□投稿者/ orochi (2回)-(2008/11/22(Sat) 12:33:02)
2008/11/22(Sat) 12:49:18 編集(投稿者)
2008/11/22(Sat) 12:43:29 編集(投稿者)

No28255 (倉田 有大 さん) に返信
> ■No28254 (orochi さん) に返信
>>こんにちは。
>>現在、以下のようなデータがあり、これらをジャグ配列にまとめようとしているのですが、初期化する書き方が分からない状態です
>>
>>データの内容
>>1:名前
>>2:状態
>>3:必殺技
>>
>>ここで1の「名前」には以下のような文字列であるとします
>>"覇王丸","ナコルル","天草四郎時貞"(要素数3)
>>
>>2の「状態」は以下のような文字列です
>>"修羅","羅刹"(要素数2)
>>
>>3の「必殺技」は「名前」と「状態」により異なります
>>例えば
>>「覇王丸」「修羅」なら「旋風裂斬」、「孤月斬」の2つ
>>「覇王丸」「羅刹」なら「旋風破」の1つ
>>「ナコルル」「修羅」なら「アンヌムツベ」「レラムツベ」「カムイリムセ」の3つ
>>「ナコルル」「羅刹」なら「狼に乗る」の1つ
>>「天草四郎時貞」「修羅」なら「汝、暗転入滅せよ」「逢魔刻」の2つ
>>「天草四郎時貞」「羅刹」なら「降魔招来破」「戒烈掌」の2つ
>>
>>となります
>>
>>これらのデータをまとめて「X番目の名前のY状態のときのZ番目の必殺技」を知ることのできる配列を作りたく思っています
>>ここで初期化として「必殺技」の名前が配列の各要素に入ることになります
>>ということで、第1次元を「名前」第2次元を「状態」、第3次元を「必殺技」とした以下のような方法で配列を作ろうとしたのですが、
>>どちらの方法で書こうとしてもどうやって初期化を書いたらいいのかわかりません
>>書き方がわかる方、教えていただけないでしょうか?
>>
>>
>>
>>// 方法その1 (普通の配列でやってみようとした)
>>public class spmove
>>{
>> public string[, ,] skillname = new string[,,]
>>  {
>> // ここで値を書きたいが、どうやって書いたらいいか分からない(必殺技が入る)
>> };
>>}
>>
>>// 方法その2(ジャグ配列の使用を考えた)
>>public class spmove
>>{
>> public string[][][] skillname = new string[3][][]
>> {
>> // ここで値を書きたいが、どうやって書いたらいいか分からない(必殺技が入る)
>> }
>>}
>>
>>例)
>>skillname[0][1][1]にアクセスした場合"孤月斬"と表示させたい
>>
>
> ジャグ配列は使ったことがないですが、classや構造体じゃだめですか?
> 多分、あつかいやすく、よみやすくなると思いますよ。
>
> class
> {
> string name;
> string status;
> arraylist hissatu;
> }
>
> wiiからなのでいい加減なソースで失礼。

一応クラスを使う方法も考えてみました。もともとこの配列自体データセット用のクラスにあり、外部から参照するだけのものなので。
書くとしたらこんな感じでしょうか?
class
{
string []name = new string[] {"覇王丸","ナコルル","天草四郎時貞"};
string [] status = new string[] {"修羅","羅刹"};
string [] haohmaru_syura = new string[]{"旋風裂斬","孤月斬"};
string [] haohmaru_rasetu = new string[]{"旋風破"};
(以下、ほかの場合についても同様に)
}

最後の配列だけがどうしても名前×状態分必要になるのは止むを得ないでしょうか?

引用返信 編集キー/
■28262 / inTopicNo.6)  Re[2]: 多次元配列の初期化の書き方
□投稿者/ orochi (3回)-(2008/11/22(Sat) 12:34:49)
No28260 (.SHO さん) に返信
> ■No28254 (orochi さん) に返信
>
>>例)
>>skillname[0][1][1]にアクセスした場合"孤月斬"と表示させたい
>
> skillname[0][0][1]じゃなくて?
> skillname[0][1][1]だと、どうしたいのかよくわからないです。

失礼しました
「孤月斬」はskillname[0][0][1]のときです
引用返信 編集キー/
■28263 / inTopicNo.7)  Re[3]: 多次元配列の初期化の書き方
□投稿者/ .SHO (140回)-(2008/11/22(Sat) 12:50:37)
2008/11/22(Sat) 12:51:03 編集(投稿者)
No28262 (orochi さん) に返信

> 失礼しました
> 「孤月斬」はskillname[0][0][1]のときです

全ての要素(名前や状態名も含める)を1つのジャグ変数に収めるのは不可能なので
必殺技をご希望どおりに引き出せるジャグ配列の初期化を以下に示します。

string[][][] skillname = new string [][][] {
    new string [][] {
        new string[] { "旋風裂斬", "孤月斬" },
        new string[] { "旋風破" }
    },
    new string [][] {
         new string[] { "アンヌムツベ", "レラムツベ", "カムイリムセ" },
         new string[] { "狼に乗る" }
    },
    new string [][] {
         new string[] { "汝、暗転入滅せよ", "逢魔刻" },
         new string[] { "降魔招来破", "戒烈掌" }
    }
};

引用返信 編集キー/
■28264 / inTopicNo.8)  Re[3]: 多次元配列の初期化の書き方
□投稿者/ orochi (4回)-(2008/11/22(Sat) 12:51:19)
No28256 (やじゅ さん) に返信

やはり普通に書くと全要素が必要なようですね。
ただしこの場合次元ごとに次の次元の要素数がばらばらなので、そこはやはり空("")で埋めるしかないでしょうか?
引用返信 編集キー/
■28265 / inTopicNo.9)  Re[3]: 多次元配列の初期化の書き方
□投稿者/ .SHO (141回)-(2008/11/22(Sat) 13:02:50)
2008/11/22(Sat) 14:35:14 編集(投稿者)

No28261 (orochi さん) に返信

> string []name = new string[] {"覇王丸","ナコルル","天草四郎時貞"};
> string [] status = new string[] {"修羅","羅刹"};

> 最後の配列だけがどうしても名前×状態分必要になるのは止むを得ないでしょうか?

name と status は別配列にしているので No28263(2個上) で OK ですね。
引用返信 編集キー/
■28267 / inTopicNo.10)  Re[4]: 多次元配列の初期化の書き方
□投稿者/ orochi (5回)-(2008/11/22(Sat) 13:21:59)
No28263 (.SHO さん) に返信
> 2008/11/22(Sat) 12:51:03 編集(投稿者)
>
> ■No28262 (orochi さん) に返信
>
>>失礼しました
>>「孤月斬」はskillname[0][0][1]のときです
>
> 全ての要素(名前や状態名も含める)を1つのジャグ変数に収めるのは不可能なので
> 必殺技をご希望どおりに引き出せるジャグ配列の初期化を以下に示します。
>
> string[][][] skillname = new string [][][] {
> new string [][] {
> new string[] { "旋風裂斬", "孤月斬" },
> new string[] { "旋風破" }
> },
> new string [][] {
> new string[] { "アンヌムツベ", "レラムツベ", "カムイリムセ" },
> new string[] { "狼に乗る" }
> },
> new string [][] {
> new string[] { "汝、暗転入滅せよ", "逢魔刻" },
> new string[] { "降魔招来破", "戒烈掌" }
> }
> };
>

ありがとうございました。要素を順に書くということですね。
大変参考になりました
解決済み
引用返信 編集キー/
■28273 / inTopicNo.11)  Re[5]: 多次元配列の初期化の書き方
□投稿者/ 倉田 有大 (356回)-(2008/11/22(Sat) 14:52:42)
> ありがとうございました。要素を順に書くということですね。
> 大変参考になりました

むう、扱いにくそう。
慣れたらclassの移行をお勧めします。
かかれているように名前も重複してますしね。

僕だったら、しゅら、らせつはenumつかって、技はarraylist
それらをプロパティにしclass作るかな。
解決済み
引用返信 編集キー/
■28274 / inTopicNo.12)  Re[6]: 多次元配列の初期化の書き方
□投稿者/ .SHO (146回)-(2008/11/22(Sat) 15:23:36)
No28273 (倉田 有大 さん) に返信

> むう、扱いにくそう。
> 慣れたらclassの移行をお勧めします。
> かかれているように名前も重複してますしね。

必殺技をジャグ配列にしてしまえば名前は重複しないですね。

逆に
class
{
string name;
string status;
arraylist hissatu;
}
というクラスだと、名前に対して複数の状態があり、それぞれの状態に対して
必殺技が複数あるので、必殺技だけ arraylist にしても名前が重複します。
解決済み
引用返信 編集キー/
■28275 / inTopicNo.13)  Re[7]: 多次元配列の初期化の書き方
□投稿者/ .SHO (147回)-(2008/11/22(Sat) 15:34:00)
あっ、でも、状態が しゅらとらせつ の2つしかないという前提なら

class
{
string name;
string[2] status;
Arraylist[2] hissatu;
}

で、名前を重複させないようにできますが
こうなってくるとジャグ配列の方が便利そう。
解決済み
引用返信 編集キー/
■28278 / inTopicNo.14)  Re[8]: 多次元配列の初期化の書き方
□投稿者/ .SHO (149回)-(2008/11/22(Sat) 17:03:22)
2008/11/22(Sat) 17:03:51 編集(投稿者)
よくよく考えてみると…

話してる内容が、ゲームで使用する全てのデータを保存するテーブルなのか
プレーヤーの状態を保存する変数なのかの違いですね。

全てのデータはジャグ配列で、プレーヤーの状態はclassで実装が良いかと。

で、classは

class Player {
  string name;
  string status;
  string hissatu( int n ) {
    return skillname[name][status][n];
  }
}

みたいな感じじゃないかな。

解決済み
引用返信 編集キー/
■28288 / inTopicNo.15)  Re[9]: 多次元配列の初期化の書き方
□投稿者/ orochi (6回)-(2008/11/23(Sun) 00:28:45)
No28278 (.SHO さん) に返信
> 2008/11/22(Sat) 17:03:51 編集(投稿者)
>
> よくよく考えてみると…
>
> 話してる内容が、ゲームで使用する全てのデータを保存するテーブルなのか
> プレーヤーの状態を保存する変数なのかの違いですね。
>

使用目的は前者のほうです。
全プレイヤーキャラの技をそこで書いておいて、ゲーム中に参照するという目的なので。
そのため配列にしておいた方がアクセスするとき楽かなと思ったのがジャグ配列使用の理由です
引用返信 編集キー/
■28375 / inTopicNo.16)  Re[10]: 多次元配列の初期化の書き方
□投稿者/ .SHO (163回)-(2008/11/25(Tue) 13:49:13)
No28288 (orochi さん) に返信

>>話してる内容が、ゲームで使用する全てのデータを保存するテーブルなのか
>>プレーヤーの状態を保存する変数なのかの違いですね。
>
> 使用目的は前者のほうです。
> 全プレイヤーキャラの技をそこで書いておいて、ゲーム中に参照するという目的なので。
> そのため配列にしておいた方がアクセスするとき楽かなと思ったのがジャグ配列使用の理由です

たぶん、私もそういう実装にすると思います。
解決済み
引用返信 編集キー/
■28379 / inTopicNo.17)  Re[10]: 多次元配列の初期化の書き方
□投稿者/ みきぬ (242回)-(2008/11/25(Tue) 14:10:51)
No28288 (orochi さん) に返信
> 全プレイヤーキャラの技をそこで書いておいて、ゲーム中に参照するという目的なので。
> そのため配列にしておいた方がアクセスするとき楽かなと思ったのがジャグ配列使用の理由です

必殺技マスタを別で持ったほうがよさげな気が。

# 同じ名前の技でも、修羅と羅刹で性能が違ったりするし。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -