for文の使用

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

for文の使用

#1

投稿記事 by kotori » 11年前

現在このサイトでゲーム制作の方を行っておりますhttp://bituse.info/game/shot/8

そこでこのような記述に疑問を抱きました。

コード:

/*ここではPSHOT_NUM=20とします。*/

//キーが押されててかつ、6ループに一回発射
	if(key[KEY_INPUT_Z]==1 && count%6==0){
		for(int i=0;i<PSHOT_NUM;++i){
			if(shot[i].flag==false){
				shot[i].flag=true;
				shot[i].x=x;
				shot[i].y=y;
				break;
			}
		}
	}

	//弾を移動させる処理
	for(int i=0;i<PSHOT_NUM;++i){
		//発射してる弾だけ
		if(shot[i].flag){
			shot[i].y-=PSHOT_SPEED;

			//画面の外にはみ出したらフラグを戻す
			if(shot[i].y<-10){
				shot[i].flag=false;
			}
		}
	}
これだと、forループは20回しか行われず弾を20発撃ちきったらもう出す弾が無くなるなんてことになりませんか??

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: for文の使用

#2

投稿記事 by Hiragi(GKUTH) » 11年前

20発打ち切る前に玉が画面外に出て、フラグが折られるので20発打ち切ったら出す玉がなくなることはありません。

リンク先より
>発射する弾の数ですが、一画面中に何弾発射してればよいかという視点から考えます。
>画面中に20発以上の弾が溢れることはないので、20発定義しておけば弾切れもないと思うので、
>20発定義することにします。
>player.hではこの弾構造体を20個配列として定義しています。

のように書いてあります。そのfor文は今現在のフレームでフラグが立っていない(まだ打たれていない)玉を捜索して
フラグを立てる(打つ)意味を持っています。
だいがくせい!

kotori

Re: for文の使用

#3

投稿記事 by kotori » 11年前

そうなると、私が質問したfor文ではどうループしていることになるのでしょうか??

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

Re: for文の使用

#4

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

kotoriさん がfor文の部分をどう見えているか説明してもらったほうが、ポイントで理由を説明しやすいかと思います。
ここの部分ですが、分かる所を説明してみてくださいね。

コード:

        for(int i=0;i<PSHOT_NUM;++i){
            if(shot[i].flag==false){
                shot[i].flag=true;
                shot[i].x=x;
                shot[i].y=y;
                break;
            }
        }
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kotori

Re: for文の使用

#5

投稿記事 by kotori » 11年前

コード:

        for(int i=0;i<PSHOT_NUM;++i){
            if(shot[i].flag==false){
                shot[i].flag=true;
                shot[i].x=x;
                shot[i].y=y;
                break;
            }
        }
iを0で初期化し、それを19になるまでループします。そしてフラグが立っていない弾があればフラグを立てて発射位置をキャラの座標と同じにします。

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

Re: for文の使用

#6

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

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

kotori

Re: for文の使用

#7

投稿記事 by kotori » 11年前

breakは処理がbreakまで到達したらfor{処理}から抜け出します。

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

Re: for文の使用

#8

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

kotori さんが書きました:breakは処理がbreakまで到達したらfor{処理}から抜け出します。
と言うことは、どういう意味になるでしょうか?
20回ループしてますが、break;で抜けるのはどういう意図があったのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kotori

Re: for文の使用

#9

投稿記事 by kotori » 11年前

頓珍漢な回答かもしれませんが、20回のループの末に座標等の値を代入してbreakし、次の方の処理の弾の移動処理を行い、その弾が画面外に行ったらまたfalseの弾が生まれることになり、またfor文のループの処理を行うという。また、この時はbreakされた状態のためi=0から始められるということでしょうか?

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

Re: for文の使用

#10

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

ポイントは1つの弾を生成したらbreakでループを抜けるって事ですね。
つまり、KEY_INPUT_Zを押したら弾が1つだけ生成されます。
20個の内どれが使用されるかは一番先に見つけたflagがfalseのものとなります。
最初のこのforループはキーを押された時のみの動作です。

2つ目のforループはflagが有効なものだけを処理します。
生存している弾でだけって事ですね。
弾を移動させて画面外に弾が出たらflagをfalseにしてこの弾は非生存とします。

どちらも弾の実際の表示はせず、弾の情報を書き換えるのみですぐにループを抜けて次の処理をしています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kotori

Re: for文の使用

#11

投稿記事 by kotori » 11年前

ということはZを長押ししていたらその間は弾の生成→break→生成→break・・・をし続けているということでいいのでしょうか?

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

Re: for文の使用

#12

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

弾の生成→break→生成→breakしませんよ。
プログラムの流れをみてください。ループ以外は必ず上から下に流れます。
[補足]
どのタイミングでbreak後に再びif(key[KEY_INPUT_Z]==1 && count%6==0){に戻ってきますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kotori

Re: for文の使用

#13

投稿記事 by kotori » 11年前

for文でbreakした時点ではないでしょうか?

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

Re: for文の使用

#14

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

そんなはずはありません。ループ文の外なのに、どのループ文の影響を受けていると思いますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kotori

Re: for文の使用

#15

投稿記事 by kotori » 11年前

コード:

//画面の外にはみ出したらフラグを戻す
			if(shot[i].y<-10){
				shot[i].flag=false;
			}
ここですか?

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

Re: for文の使用

#16

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

それは次の弾の生成には影響を受けますが、ループではありませんね。
その条件がいつ成立するかは状況次第です。
気になるんですが、一番最初に掲示されたプログラムで実行する順番に番号を振ってみてもらえませんか。

コード:

    if(key[KEY_INPUT_Z]==1 && count%6==0){ (1)
こんな感じで。これをちゃんと理解していないとプログラムを理解することが出来ません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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