【急募】配列の中の配列への代入について

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

【急募】配列の中の配列への代入について

#1

投稿記事 by 黒人間 » 14年前

はじめまして,黒人間と申します.
現在,実験で使用するゲーム環境を作製しているのですが,行き詰まってしまったため質問させて頂きました.

現在の方針は,
①field[10][10],log[10][10]のようにフィールドマップと探索済みのログをそれぞれ2次元配列で用意する.
(このあたりを参考にさせて頂きました.http://dixq.net/g/26.html
fieldには敵(2)や餌(3)等を配置し,logは最初は全て空(0)にしておきます.
また,敵は一定の歩数歩く毎に空いているマスにランダムに出現します.

②自分の周囲は,マンハッタン距離で2マスとなるような菱形の範囲の知覚が出来るものとします.
その際,周囲は,以下のように配列を作り,
shuui[13] ={ field[y-1][x], field[y+1][x], field[y][x-1], field[y][x+1], field[y-2][x], field[y+2][x], field[y][x-2], field[y][x+2],field[y-1][x-1], field[y-1][x+1], field[y+1][x-1], field[y+1][x+1], field[y][x] };
logも以下のように表します.
log_shuui[13] ={ log[y-1][x], log[y+1][x], log[y][x-1], log[y][x+1], log[y-2][x], log[y+2][x], log[y][x-2], log[y][x+2],log[y-1][x-1], log[y-1][x+1], log[y+1][x-1], log[y+1][x+1], log[y][x] };

③そして,以下のように探索済みを記録しました.

コード:

	//log[]に自分の周囲の情報を記録
	for(int a=0; a<12; a++){
		if(log_shuui[a] < 10) {
			log_shuui[a] = shuui[a];
		} else if(log_shuu[a] >= 10){	//移動済みのマスは10足してlogに記録する.
			log_shuu[a] = shuui[a] + 10;
		}
	}
④実行したところ,移動した所は+10されて記録されているようです.しかし,
以下のような処理をし,「今,敵がいたマスに以前何もなかったら処理Aを実行する」としたいのですが,
同じ敵の周りを歩いていてもずっと処理Aが実行されてしまいます.

コード:

		if ((shuui[a]%10) == 2) {
			if ((log_shuui[a]%10)==0){	
				//処理A
			}
		}
ちなみに,③の記録は毎回プログラムの最後に行っています.

説明が下手で申し訳ありませんが,敵の出現に関する記録をうまく行うにはどうすれば良いでしょうか?皆様のお力添えを頂ければ大変助かります.
よろしくお願いします.
なお,環境はwindows vista, VC++2008です.

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 【急募】配列の中の配列への代入について

#2

投稿記事 by h2so5 » 14年前

敵を出現させる部分のソースを見せて下さい。

box
記事: 2002
登録日時: 14年前

Re: 【急募】配列の中の配列への代入について

#3

投稿記事 by box » 14年前

>shuui[13] ={ field[y-1][x], field[y+1][x], field[y][x-1], field[y][x+1], field[y-2][x], field[y+2][x], field[y][x-2], field[y][x+2],field[y-1][x-1], field[y-1][x+1], field[y+1][x-1], field[y+1][x+1], field[y][x] };
>log_shuui[13] ={ log[y-1][x], log[y+1][x], log[y][x-1], log[y][x+1], log[y-2][x], log[y+2][x], log[y][x-2], log[y][x+2],log[y-1][x-1], log[y-1][x+1], log[y+1][x-1], log[y+1][x+1], log[y][x] };

ここんところ、実際のソースではどう書いてあるんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

黒人間

Re: 【急募】配列の中の配列への代入について

#4

投稿記事 by 黒人間 » 14年前

h2so5 さんが書きました:敵を出現させる部分のソースを見せて下さい。
お返事ありがとうございます.
敵の出現は,以下のようになっています.

コード:

int tekide(int x, int y){

	int i, j;

	if(tekihaiti2==0||gt%5==0){		//5ターンに1度
		for(i=0;i<15;i++){
			for(j=0;j<20;j++){
				if((field[i][j]==0)&&(GetRand(89)==1))	{	//空白であり、90回(空いてるマスの数)に1回
					field[i][j]=2;
					}
				}
			}
		}
	}
	gt++;
	return 0;
}

黒人間

Re: 【急募】配列の中の配列への代入について

#5

投稿記事 by 黒人間 » 14年前

box さんが書きました:>shuui[13] ={ field[y-1][x], field[y+1][x], field[y][x-1], field[y][x+1], field[y-2][x], field[y+2][x], field[y][x-2], field[y][x+2],field[y-1][x-1], field[y-1][x+1], field[y+1][x-1], field[y+1][x+1], field[y][x] };
>log_shuui[13] ={ log[y-1][x], log[y+1][x], log[y][x-1], log[y][x+1], log[y-2][x], log[y+2][x], log[y][x-2], log[y][x+2],log[y-1][x-1], log[y-1][x+1], log[y+1][x-1], log[y+1][x+1], log[y][x] };

ここんところ、実際のソースではどう書いてあるんですか?
お返事ありがとうございます.
実際は,以下のようになっています.

コード:

int shuui[13] ={ field[y-1][x], field[y+1][x], field[y][x-1], field[y][x+1],
field[y-2][x], field[y+2][x], field[y][x-2], field[y][x+2],
field[y-1][x-1], field[y-1][x+1], field[y+1][x-1], field[y+1][x+1], field[y][x] };
int log_shuui[13] ={ log[y-1][x], log[y+1][x], log[y][x-1], log[y][x+1], 
log[y-2][x], log[y+2][x], log[y][x-2], log[y][x+2],
log[y-1][x-1], log[y-1][x+1], log[y+1][x-1], log[y+1][x+1], log[y][x] };
ご質問の意図に沿っているでしょうか?違っていたら申し訳ありません.

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 【急募】配列の中の配列への代入について

#6

投稿記事 by h2so5 » 14年前

すみません、敵の出現は問題ないとおもいます。

ただ、提示していただいたコードを見る限り、
log[10][10]の内容が一切変化していないと思うのですが。

黒人間

Re: 【急募】配列の中の配列への代入について

#7

投稿記事 by 黒人間 » 14年前

やはり,この書き方ではlog[][]には反映されないのでしょうか?
log_shuui[a] = shuui[a];
そのあたりの配列の扱いについてがどうも曖昧でして,本を読んでも改善方法が思いつかないのです.

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 【急募】配列の中の配列への代入について

#8

投稿記事 by h2so5 » 14年前

ポインタを使って書くとしたらこんな感じでしょうか。

コード:

int* log_shuui[13] ={ &log[y-1][x], &log[y+1][x], &log[y][x-1], &log[y][x+1], 
&log[y-2][x], &log[y+2][x], &log[y][x-2], &log[y][x+2],
&log[y-1][x-1], &log[y-1][x+1], &log[y+1][x-1], &log[y+1][x+1], &log[y][x] };
あとは log_shuui[a] → *log_shuui[a] に書き換えます。
(試してないのでうまくいくか分かりませんm(_ _)m)

黒人間

Re: 【急募】配列の中の配列への代入について

#9

投稿記事 by 黒人間 » 14年前

h2so5 さんが書きました:ポインタを使って書くとしたらこんな感じでしょうか。

コード:

int* log_shuui[13] ={ &log[y-1][x], &log[y+1][x], &log[y][x-1], &log[y][x+1], 
&log[y-2][x], &log[y+2][x], &log[y][x-2], &log[y][x+2],
&log[y-1][x-1], &log[y-1][x+1], &log[y+1][x-1], &log[y+1][x+1], &log[y][x] };
あとは log_shuui[a] → *log_shuui[a] に書き換えます。
(試してないのでうまくいくか分かりませんm(_ _)m)

コード:

int* log_shuui[13] ={ &log[y-1][x], &log[y+1][x], &log[y][x-1], &log[y][x+1], 
&log[y-2][x], &log[y+2][x], &log[y][x-2], &log[y][x+2],
&log[y-1][x-1], &log[y-1][x+1], &log[y+1][x-1], &log[y+1][x+1], &log[y][x] };
の用に定義すると,
「'log_shuu' : 'int *[13]' は 'int [13]' と間接操作のレベルが異なります。」というエラーが出ました.

また,

コード:

	//log[]に自分の周囲の情報を記録
	for(int a=0; a<12; a++){
		if(log_shuui[a] < 10) {
			*log_shuui[a] = shuui[a];
		} else if(log_shuu[a] >= 10){	//移動済みのマスは10足してlogに記録する.
			*log_shuu[a] = shuui[a] + 10;
		}
	}
の様にも書き換えましたが,こちらも
「 間接指定演算子 (*) の使い方が正しくありません。」というエラーになりました.
ちなみに,上記の様に書き換えた所はご指摘頂いた通りでしたでしょうか?

黒人間

Re: 【急募】配列の中の配列への代入について

#10

投稿記事 by 黒人間 » 14年前

私の勘違いで,log_shuui[a]のポインタ宣言の前に書いていた,通常のint宣言を消していませんでした.これを修正したところ,希望通りの動作をするようになりました.
あと,もう少し確認をしてみて,問題があったらまた質問させて頂くかもしれません.
皆様,アドバイスを頂きありがとうございました!

閉鎖

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