同じ二次元配列を複数つくる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
heyman
記事: 99
登録日時: 11年前

同じ二次元配列を複数つくる

#1

投稿記事 by heyman » 10年前

またわからないことがでてきたので質問させていただきます。
今僕は、rpgゲームを作ってるんですが、
家の中は、基本の形をおんなじにしたいので、
おんなじ配列を使いたいのですが、
同じ二次元配列を複製する方法がわかりません。
どうしたらいいんでしょうか?
分かりやすくいうと、
i変数を配列でi[]として同じ変数で使用できるように
i[][]という二次配列で、同じようにするには
どうすればいいかということです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#2

投稿記事 by softya(ソフト屋) » 10年前

同じ配列ならば複製しなくて良いのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#3

投稿記事 by heyman » 10年前

確かに・・
何言ってんだろ俺…
なんかこんがらがってました、すいません。
配列じゃなくて、構造体みたいな感じですね、すいません。
ゲームの都合上、建物は自分で建てるので、
建てた時に、元ある部屋の地形(仮にaとします)を
家を作った分だけ複製して、個々の地形データとして、
作りたいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#4

投稿記事 by softya(ソフト屋) » 10年前

ゲームとしてマップエディタを内蔵しているんでしょうか?
であれば、mallocとか勉強されたほうが良いですし、ファイルセーブロードも勉強されたほうが良いです。
あと2次元配列はファイルセーブロードにとって厄介なので一次元配列にしましょう。 計算で2次元配列の様にアクセスできます。
それに同時に全部の建物のデータをプログラム中で保持している理由は無いはずです。必要に応じて読み込むのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#5

投稿記事 by heyman » 10年前

softya(ソフト屋) さんが書きました:ゲームとしてマップエディタを内蔵しているんでしょうか?
マップエディタと言えばそうなのかもしれませんが、ゲームの流れは、
平地のステージ => 場所を決める => 家を建てて住む(拠点を建てる) => そこで暮らす
という流れになっています。
ので、エディタと言うより、家の絵をフィールド上に書いて、その家を建てた時に、
その家に入るイベントの設置、イベントに触れると家(部屋の地形a)に移動するようになってます。(これはエディタになるのかな?)
で、建てる家が、1つだけならいいのですが、複数作るときに、仮に立てる家の数を10とすると、
建てれる制限の10この地形データ1つ1つ用意するのも面倒なんで、建てた時に、その数だけ
家の地形aを複製しようということになったので質問させていただきました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#6

投稿記事 by softya(ソフト屋) » 10年前

例えば平原地形に家をコピペして貼り付けたいと言うことでしょうか?
であれば、メモリ上だけ再現されていればよいで
平原地形読み込み → 家を読み込み → 平原の上に家を貼り付ける
って事ではないでしょうか?
保存するのは家を貼り付ける場所の情報だけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#7

投稿記事 by heyman » 10年前

softya(ソフト屋) さんが書きました:例えば平原地形に家をコピペして貼り付けたいと言うことでしょうか?
であれば、メモリ上だけ再現されていればよいで
平原地形読み込み → 家を読み込み → 平原の上に家を貼り付ける
って事ではないでしょうか?
はい、家の画像はそんな感じです。
やりたいことは、貼り付けた家の数(仮に2つとするなら、)
2つ分の、移動イベント、部屋の地形(部屋の地形aを複製した者)を用意し、
家を別々に扱いたいです。(別々というのは、今現在の段階では、家を複数建てられるけど、
移動イベントも、部屋の地形データも、1つずつしかないから、どの家に入っても、同じ
部屋に行ってしまうので、そうならないために、部屋の地形aを複製して、
家の数分振り分けるということ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#8

投稿記事 by softya(ソフト屋) » 10年前

> 同じ部屋に行ってしまう

シナリオやシステムで振り分ければ良いのではないでしょうか。
部屋も作り置きのものを使うなら、わざわざデータとして複製する意味が無いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#9

投稿記事 by heyman » 10年前

softya(ソフト屋) さんが書きました:> 同じ部屋に行ってしまう

シナリオやシステムで振り分ければ良いのではないでしょうか。
俺の説明不足ですね。すいません。
同じ部屋というのは、別の部屋の地形を用意してないので、
部屋の地形aにしか行けないということです。
softya(ソフト屋) さんが書きました:部屋も作り置きのものを使うなら、わざわざデータとして複製する意味が無いですよ。
作り置きではなくて、家を建てるとすのと、今、頭の中にある構成は、
プレイヤーが操作して、家を作る(1つめ) => とりあえずその家の移動イベントを家の上に作る。(イベントの
つくり方は、なんとなくわかる) => 部屋の地形aを複製する。(これを、1つ目の家の部屋の地形にする、複製の仕方がわからない) =>
部屋の数が増えると、その分イベントと、部屋の地形を部屋の地形aをもとに複製するという流れを考えてたんですが、
複製の仕方がわかりません。a[w*h]の配列にいれた値をi[][]のi[][]<=こっち側にだけ入れる方法とかありませんかね?
あとつかぬことをお聞きしますが、この前マップ移動について質問させていただいたときに、
いったんデータを破棄するとのことでしたが、やっぱり残しときたいデータは消す前に保存しますよね?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#10

投稿記事 by softya(ソフト屋) » 10年前

コピーするならforループで代入するだけです。難しいことは何もありません。

>いったんデータを破棄するとのことでしたが、やっぱり残しときたいデータは消す前に保存しますよね?

全部を保存しないと再現できないようなものなら保存します。
私には必要無さそうに見えるのですが、ご本人が必要と思うならやった方が良いでしょう。
なによりよい修行に成るでしょう。

【補足】 こっちの意見を押し付けても何なので、やってみて疑問があればまた全部保存しなくて良い方法について別途質問して下さい。
今はコピーの話に絞り込みます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#11

投稿記事 by heyman » 10年前

とりあえずやってみます。
あといまさらですが、
softya(ソフト屋) さんが書きました:あと2次元配列はファイルセーブロードにとって厄介なので一次元配列にしましょう。
なぜ2次配列はファイルセーブロードにとって厄介なんですか?できるだけ一次配列で組んだ方がいですか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#12

投稿記事 by usao » 10年前

失礼ながら,何を言いたいのかまるでわからないですね.

・部屋の地形(=見た目?) は全部屋で共通であるという「仕様」

なのか

・各部屋別々の地形 にする予定であり,それを実現できるようにコード作成しているけれども,
 現段階では地形aという一種類のデータしか用意できていないので
 「とりあえず現段階では仮に」地形データaを全部屋で使う形にしておきたい

という話なのか.あるいは別の何かなのか.
で,それはそれとして,

【単に「ある配列から別の配列に値をコピーしたい.その方法は?」というだけの質問だ】ということであれば
RPGがどうのとか家が云々という話は全く不要ですよね.

コード:

int Src[100] = { ... };
int Dst[100];
for( int i=0; i<100; i++ ){  Dst[i] = Src[i];  }  //Src[]の全ての要素をDst[]にコピーする
とかいう話であれば.

論点が何処にあるのか(本当に必要な情報は何か)をはっきりさせてみては?
「C言語(なのかどうか不明ですけど)での値コピーの書き方」なのか,それとも
「RPGがどうの」という話が絡む内容なのか.

アバター
usao
記事: 1887
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#13

投稿記事 by usao » 10年前

>なぜ2次配列はファイルセーブロードにとって厄介なんですか?できるだけ一次配列で組んだ方がいですか?

「厄介」かどうかは極論すれば主観ですから,実際にやってみて
楽だと思う側を採用されてはいかがでしょうか.
オフトピック
つい最近,2次元的なものを実装するのに 「おい,おまえ,A[][] のように書けや」 という話があって
それを A[] で書く方向で納得してもらうのに ものすごーく苦労しました.
【要素アクセスを A[3][5] みたくコード上で書けること(利便性??)】を重要視する人もおられるみたいです.

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#14

投稿記事 by heyman » 10年前

usao さんが書きました:・各部屋別々の地形 にする予定であり,それを実現できるようにコード作成しているけれども,
 現段階では地形aという一種類のデータしか用意できていないので
 「とりあえず現段階では仮に」地形データaを全部屋で使う形にしておきたい

という話なのか.あるいは別の何かなのか.
二次配列a[][]が部屋のデータを入れとく配列です。
最初考えてのは、建てれる家の数が不定なので、
最初に、部屋の配列だけを何個も作っておくのも大変なので、
執拗に応じてa[][]のような配列をその場で増やして管理したい
ということです。
たとえば、ゲームをやってる途中で、配列などを宣言できますか?

無理ならやっぱり作り置きしないとダメですかね?
あと、なに言ってるかわからなかったら、遠慮せずに言ってください。
出来るだけ伝わるように努力します。
usao さんが書きました:論点が何処にあるのか(本当に必要な情報は何か)をはっきりさせてみては?
「C言語(なのかどうか不明ですけど)での値コピーの書き方」なのか,それとも
「RPGがどうの」という話が絡む内容なのか.
RPGという語を出したのは、今俺の質問の事じゃない別のやり方でも
似たようなことができるよといったアドバイスが得られるかもしれないので、
まず何がしたいのか書きました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#15

投稿記事 by softya(ソフト屋) » 10年前

> たとえば、ゲームをやってる途中で、配列などを宣言できますか?

メモリ空間を動的に確保するのはmallocです。動的に配列を作ることが出来ます。すでに私が書いてますね。
ポインタを理解していないとmallocは使いこなせません。mallocを使うなら、とこれ以上は書かないことにします。

>最初考えてのは、建てれる家の数が不定なので、
>最初に、部屋の配列だけを何個も作っておくのも大変なので、
>執拗に応じてa[][]のような配列をその場で増やして管理したい
>ということです。

前から書いているように家の数が不定なのと部屋マップが同じ数だけ必要なのは=では結べません。
必要でないかもしれませんし、必要かもしれません。
必要な理由が未だに説明されていないのです。
なので、やってみたら?と言う話を書きました。
説明できない以上はよく分かっていないのだという判断です。
やってみれば見えてくるものもあります。

【補足】
もし処理的に無駄なものを作っても、自分で無駄だと理解したなら確実に前進していますので、やる価値があります。
無駄じゃないなら本当に必要です。
今の段階では、提示された情報から私には無駄か無駄でないか判断が出来ません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#16

投稿記事 by heyman » 10年前

softya(ソフト屋) さんが書きました:前から書いているように家の数が不定なのと部屋マップが同じ数だけ必要なのは=では結べません。
必要でないかもしれませんし、必要かもしれません。
必要な理由が未だに説明されていないのです。
なぜ家と同じだけ部屋の数が必要かということでしょうか?
それは、部屋に、家具を置きたいからです(しかもプレイヤーの決めた家具を
プレイヤーの決めた位置で)部屋の配列が1つだと、1つの家だけに家具を置いても
他の家にも反映してしまう(当たり前ですが)からです。
だから、家に個々の配列を用意したいのです。
厳密に言えば、部屋の数というよりも、家具の位置を保存しとく配列(レイヤー)の数です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#17

投稿記事 by softya(ソフト屋) » 10年前

>それは、部屋に、家具を置きたいからです(しかもプレイヤーの決めた家具をプレイヤーの決めた位置で)部屋の配列が1つだと、1つの家だけに家具を置いても他の家にも反映してしまう(当たり前ですが)からです。

その説明は今初めてされました。
はじめにマップエディタですか?と聞いた時にフィールドの話で完結してしまったのです。

この場合、家具はどうぶつの森の様なカスタマイズと想定しますが、家具マップ・レイヤを作っても良いですし、家具配置リストデータ構造を作っても良いです。
お好みで分かりやすい方で作ると良いと思います。
家の持てる最大数が決まっているのなら、mallocする必要がないので家具マップ・レイヤを必要個数分3次元配列で確保しておく手もあります。
こちらのほうがmallocが苦手なら安全かもしれません。いずれはmallocも克服しないと行けませんが。
プロトタイプなら、とりあえず3次元配列が確実かなと思います。
でも、mallocに挑戦するのも良いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#18

投稿記事 by heyman » 10年前

softya(ソフト屋) さんが書きました: その説明は今初めてされました。
はじめにマップエディタですか?と聞いた時にフィールドの話で完結してしまったのです。
すいません。そういったことはもっと詳しく言っとくべきでした。
とりあえず3次配列で頑張ってみます。あとmallocも完璧にできるように頑張りたいです。
ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#19

投稿記事 by softya(ソフト屋) » 10年前

あっ。あとで気づきましたが、部屋を同時には表示しないのでファイル保存されるなら家具マップ・レイヤの2次元配列は1つあれば十分です。
3次元いりませんよ。

【補足】 部屋ごとに違うファイル名で保存される前提となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 11年前

Re: 同じ二次元配列を複数つくる

#20

投稿記事 by heyman » 10年前

softya(ソフト屋) さんが書きました:あっ。あとで気づきましたが、部屋を同時には表示しないのでファイル保存されるなら家具マップ・レイヤの2次元配列は1つあれば十分です。
3次元いりませんよ。

【補足】 部屋ごとに違うファイル名で保存される前提となります。
建てれる家の上限分あらかじめファイルを作っとくということですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 同じ二次元配列を複数つくる

#21

投稿記事 by softya(ソフト屋) » 10年前

家具マップ・レイヤの2次元配列の場合、全部最初にファイルを作っても良いですし、必要に応じてファイルを作ることも出来ます。
家具マップ・レイヤの2次元配列がn個分の3次元で確保して1つのファイルに一括保存してもよいです。
どれでも選べますので、どれを選ぶかはお任せします。
※ こちらは、こういう選択肢もありますと提示しただけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: 同じ二次元配列を複数つくる

#22

投稿記事 by ISLe » 10年前

建てたばかりの初期の家のデータ、追加した家具等、家具を配置した家のデータ、これらをすべて同じ配列で扱う必要がありません。

追加した家具は、家具の種類と位置の一覧であれば良い。

家に入ったとき、作業用の領域に、初期の家のデータをコピー、その家の家具の一覧から家具を配置、という処理を行えば、作業用の領域に、家具を配置した家のデータ、が完成します。

家ごとに覚えておく必要があるのも、追加した家具の情報だけです。


つい最近、ゼルダの伝説の迷宮に関連して同じような投稿をしたトピックがあります。
あちらも概念の説明だけでしたが。

閉鎖

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