的の番号検出

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

的の番号検出

#1

投稿記事 by ヒューガ » 13年前

まわりにたくさんの的があります。的には番号が振られています。
とりあえず的の番号をメモしておくことにしました。メモできる番号は最大4つです。ボタンを押すと順番にメモの番号が変わります。
ボタンを押したときに視界に的があったら優先的にその番号を小さい順にメモします。
その時視界の中にある的の数が4個ない場合は足りない分視界外の的の番号を小さい順にメモします。
1個も視界に的がない場合は全ての的の番号の中から小さい順にメモします。
メモしている的が破壊された場合そのメモされた番号は次の番号になります
始まったと同時にボタンを押したということにします。
(例:的が1,3,6,8,12,14,15,16,19,20とあり、
視界内に1,6,12,15,19,20とあるならメモの番号はボタンを押すたび1,6,12,15→6,12,15,19→12,15,19,20→15,19,20,1と変化
2番目で12が破壊された場合自動的に6,20,15,19となる
視界内に1,6,15とあるならメモの番号はボタンを押すたび1,3,6,15→1,6,8,15→1,6,12,15→1,6,14,15と変化
2番目で6が破壊されたら1,3,8,15となり、8が破壊されたら1,6,3,15となる
視界内に何もなければメモの番号はボタンを押すたび1,3,6,8→3,6,8,12→6,8,12,14→8,12,14,15と変化)
というプログラムを作りたいのですがなかなかうまくいきません・・・
どういうソースにすればうまくいくでしょうか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 的の番号検出

#2

投稿記事 by beatle » 13年前

題名と名前が逆っぽいのは置いとくとして、これは学校などの課題でしょうか。
課題の丸投げは禁止されていますので、「なかなかうまくいきません」ということですが、その試行錯誤のお話を聞かせて下さい。
また、今まで出来ている部分だけでもソースコードなどを貼り付けてください。

課題の場合きっと期限があるのでしょうから、その期限も教えて下さい。

ヒューガ

Re: 的の番号検出

#3

投稿記事 by ヒューガ » 13年前

コード:

int enemy_search2(){
	int e;
	for(e=0;e<ENEMY_MAX;e++){
		if(enemy[e].f>0&&container[e].xy.x>=0&&container[e].xy.x<=640&&container[e].xy.y>=0&&container[e].xy.y<=480
			&&(CheckCameraViewClip(enemy[e].xyz)==FALSE)){
			return e;
		}else{
			return -1;
		}
	}
	return -1;
}
int enemy_search3(int e){
	int i;
	for(i=e+1;i<=ENEMY_MAX;i++){
		if(i>=ENEMY_MAX){
			i=0;
		}
		if(enemy[i].f>0&&container[i].xy.x>=0&&container[i].xy.x<=640&&container[i].xy.y>=0&&container[i].xy.y<=480
			&&(CheckCameraViewClip(enemy[i].xyz)==FALSE)){
			return i;
		}else{
			if(enemy_search2()<0)return -1;
		}
	}
	return -1;
}

void seek_enter(){
	if(seeker[0].f==0||seeker[0].f==10){
		seeker[0].f=1;
		seeker[0].c=10;
		seeker[0].s=10;
		seeker[0].xy.x=320;
		seeker[0].xy.y=240;
	}
}
void seeker_boot(){
	int enemy_view[ENEMY_MAX];
	int seeker_e;
	if(key.seek[0]==1){
		for(int i=0;i<ENEMY_MAX;i++){
			if(container[i].f==1||container[i].f==2){
				enemy_view[i]=1;
			}
		}

	for(int i=0;i<ENEMY_MAX;i++){
		if(container[i].f==1||container[i].f==2){
			if(my.seeker_max>my.enemy_num)seeker_e=my.seeker_max;
			else seeker_e=my.enemy_num;
	
	if(CheckCameraViewClip(enemy[seeker[0].t].xyz)==FALSE)seek_enter();

	if(key.seek[0]==1){
		seeker[0].f=0;
		seeker[0].t=enemy_search3(seeker[0].t);
		seek_enter();
	}
	switch(case_num2){
	case 1:target=enemy_search2();//画面に映ってるかどうか
		seek_enter();
		case_num2=2;
			break;
	case 2:
		if(key.seek[0]==1){
			seek_enter();
			seeker[0].f=10;
	if(target>ENEMY_MAX){//目標切り替え
		target=0;
	}
	target=enemy_search3(target);
	
	}
		   
		   break;
}
	if(seeker[0].f==0)seeker[0].c=0;
	if(seeker[0].c==2)case_num2=1;

}
消したりコメントアウトしたりしていろいろ変なものが混ざっています。
課題と言えば課題です。文化祭に出すゲームのシステムです。期限は夏休みの終わりまでです。

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

Re: 的の番号検出

#4

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

ごめんなさいルールが良くわかりません。
番号を振って箇条書きで整理してもらえますか?
それと説明と例がごっちゃになっているので分離をお願いします。

(1) 何々処理
説明:これこれの時はこうします。
例:123とあったら・・・

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

ヒューガ

Re: 的の番号検出

#5

投稿記事 by ヒューガ » 13年前

メモしている的が破壊された場合そのメモされた番号は次の番号になります
(1)ボタンを押したときに視界に的があったら優先的にその番号を小さい順にメモします。
例:的が1,3,6,8,12,14,15,16,19,20とあり、
視界内に1,6,12,15,19,20とあるならメモの番号はボタンを押すたび1,6,12,15→6,12,15,19→12,15,19,20→15,19,20,1と変化
2番目で12が破壊された場合自動的に6,20,15,19となる
(2)その時視界の中にある的の数が4個ない場合は足りない分視界外の的の番号を小さい順にメモします。
例:視界内に1,6,15とあるならメモの番号はボタンを押すたび1,3,6,15→1,6,8,15→1,6,12,15→1,6,14,15と変化
2番目で6が破壊されたら1,3,8,15となり、8が破壊されたら1,6,3,15となる
(3)1個も視界に的がない場合は全ての的の番号の中から小さい順にメモします。
例:視界内に何もなければメモの番号はボタンを押すたび1,3,6,8→3,6,8,12→6,8,12,14→8,12,14,15と変化

こんなんでいいでしょうか?

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

Re: 的の番号検出

#6

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

まだ足らないので質問しますね。
(a)常にメモするのは最大4個でしょうか?
(b)途中で視界外に消えたらメモは自動再構成でしょうか? それとも視界と的は移動しない?
それともボタンを押すまでは今選ばれている物を優先でそのまま?
(c)的が消えた場合。今メモられているものを残して、自動で視界内→視界外で番号の若いものを得るで良いでしょうか?
それともボタンを押すまではメモから消えて行く的の処理だけでok?

とにかく仕様として抜けが多いのでプログラムを組むことが難しいと思います。

それと何度も言われていると思いますがインデントはキレイに書きましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヒューガ

Re: 的の番号検出

#7

投稿記事 by ヒューガ » 13年前

(a)メモできるのは最大4個までです。的が3つしかない場合などはメモが3個になったりします。
(b)視界も的も動き回ります。視界外に的が移動してもボタンを押すまで番号は変わりません。
(c)視界内にまだ的がある場合は優先的にその番号をメモします。残りの的が4つ満たない場合は不足分は視界外の的の番号を小さい順にメモします。的がない場合は視界外の番号を小さい順にメモしていきます。

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

Re: 的の番号検出

#8

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

ヒューガ さんが書きました:(a)メモできるのは最大4個までです。的が3つしかない場合などはメモが3個になったりします。
(b)視界も的も動き回ります。視界外に的が移動してもボタンを押すまで番号は変わりません。
(c)視界内にまだ的がある場合は優先的にその番号をメモします。残りの的が4つ満たない場合は不足分は視界外の的の番号を小さい順にメモします。的がない場合は視界外の番号を小さい順にメモしていきます。
(c)は破壊された場合も自動でメモされると言うことですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sq

Re: 的の番号検出

#9

投稿記事 by sq » 13年前

的 {
的の番号;
破壊フラグ;
視界内フラグ;
}

的[たくさん]; //たくさんある的。

的ポインタ[4]; //集める的。
集めた的の個数; //最初はゼロ

(1)ボタンが押されたら、破壊されていない的について視界内フラグを更新する。
(2)破壊されておらず、視界内に入っている的を番号の小さい順から4つ取る。
(3)4つとれたら、おしまい。
(4)4つとれなかったら、破壊されておらず、視界内にはいっていない的を足りない分取る。
(5)集めた数が2つ以上だったら、的の番号で昇順になるようにソートする。ただし、(2)の結果がゼロ個だったらソートの必要なし。

勘違いがなければこんな感じでいけそうですね。

ヒューガ

Re: 的の番号検出

#10

投稿記事 by ヒューガ » 13年前

>(c)は破壊された場合も自動でメモされると言うことですか?
はい。メモしていた的が破壊されたら自動的に次の番号が入ります。

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

Re: 的の番号検出

#11

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

ヒューガ さんが書きました:>(c)は破壊された場合も自動でメモされると言うことですか?
はい。メモしていた的が破壊されたら自動的に次の番号が入ります。
では、sqさんの様に今まで出てきた仕様を流れに沿ってまとめてみください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヒューガ

Re: 的の番号検出

#12

投稿記事 by ヒューガ » 13年前

とりあえずこれで自分が思うとおりに動いてくれました

コード:

int num_search(int i){
	int s,p;
	s=i;
	if(s==-1)p=ENEMY_MAX-1;
	else p=s;
	while(1){
		s++;
		if((container[s].f==1||container[s].f==2)&&(seeker[0].t!=s&&seeker[1].t!=s&&seeker[2].t!=s&&seeker[3].t!=s))return s;
		else{
			if(s==ENEMY_MAX)s=-1;
		}
		if(s==p)break;
	}
	s=i;
	while(1){
		s++;
		if((container[s].f==3||container[s].f==4)&&(seeker[0].t!=s&&seeker[1].t!=s&&seeker[2].t!=s&&seeker[3].t!=s))return s;
		else{
			if(s==ENEMY_MAX)s=-1;
		}
		if(s==p)break;
	}
	s=i;
	while(1){
		s++;
		if(container[s].f==5&&(seeker[0].t!=s&&seeker[1].t!=s&&seeker[2].t!=s&&seeker[3].t!=s))return s;
		else{
			if(s==ENEMY_MAX)s=-1;
		}
		if(s==p)break;
	}
	return -1;
}
ありがとうございました

ヒューガ

Re: 的の番号検出

#13

投稿記事 by ヒューガ » 13年前

解決です

閉鎖

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