当たり判定

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

Re: 当たり判定

#31

投稿記事 by るる » 11年前

試行錯誤してたら、さっきのみたいになっちゃいました・・・

これでどうでしょうか?
[code=cpp#include <stdio.h>


int main(void)
{
int i,goukei =0;


for(i= -1; i>=-100; i--)
{

goukei = goukei - i;

}
printf(" %d\n", goukei);
return 0;
}
][/code]

るる

Re: 当たり判定

#32

投稿記事 by るる » 11年前

試行錯誤してたら、さっきのみたいになっちゃいました・・・

これでどうでしょうか?
[code=cpp#include <stdio.h>


int main(void)
{
int i,goukei =0;


for(i= -1; i>=-100; i--)
{

goukei = goukei - i;

}
printf(" %d\n", goukei);
return 0;
}
][/code]

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

Re: 当たり判定

#33

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

2回投稿されていますよ。codeタグも間違っているので必ずプレビューで確認して下さい。
実行結果も、さっきまで合っていた部分が間違っています。動作確認をお願いします。
慌てすぎてませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#34

投稿記事 by るる » 11年前

そうですね、慌ててたかもしれません・・・
今度はどうでしょうか?

コード:

#include <stdio.h>
int main(void)
{

int i,goukei =0;


for(i= -1; i>=-100; i--)
{

goukei = goukei - i;

}
printf("%d\n", goukei);

return 0;
} 

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

Re: 当たり判定

#35

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

全然の落ち着いてないです。
焦ってもバグを増産するだけなので落ち着きましょう。
インデントもおかしいままですし、答えも違っています。
このプログラムを実行した結果を貼り付けてもらえば客観的にみれますかね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#36

投稿記事 by るる » 11年前

実行結果は
5050
続行するにはキーを押してください

とでます

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 当たり判定

#37

投稿記事 by へにっくす » 11年前

なんで引き算になってるの?
-1から-100を「足した」結果を出すんだよ?
問題の意味をちゃんと考えましょう。
(だから落ち着いて答えろと言われるのです)

修正したソースを再度掲示してください。
インデントも直してね。
(最低限の礼儀です)
written by へにっくす

るる

Re: 当たり判定

#38

投稿記事 by るる » 11年前

こうでしょうか?
実行結果は-5050となりました。
それとインデントはこうでしょうか?
すいません。あまりよく分からないもので。

コード:

#include <stdio.h>
int main(void){

int i,goukei =0;


for(i= -1; i>=-100; i--){

goukei = goukei + i;
}
printf("%d\n", goukei);

return 0;
} 

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

Re: 当たり判定

#39

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

実行結果は正解です。
No: 28,No: 29ではインデントが合っていましたので何故再び狂うんでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#40

投稿記事 by るる » 11年前

すいません。まだどこがしっかりした場所なのかわかっていなくてこうなってしまいました。

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

Re: 当たり判定

#41

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

それではインデントを直してみてください。
それとは別にステップ2です。インデントの修正は先に報告をお願いします。

このプログラムに-90以下だったらnに1を足すプログラムに機能追加して下さい。nの初期値は0です。
そうした上で、最後のprintfでnの値も表示して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#42

投稿記事 by るる » 11年前

すいません
そろそろ夜勤が始まりますので、また後日答えをお伝えする感じでいいでしょうか?
お手伝いいただき本当にありがとうございました。

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

Re: 当たり判定

#43

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

るる さんが書きました:すいません
そろそろ夜勤が始まりますので、また後日答えをお伝えする感じでいいでしょうか?
お手伝いいただき本当にありがとうございました。
こちらは何時でも構いません。
時間の有るときにじっくり取り組んで下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 当たり判定

#44

投稿記事 by へにっくす » 11年前

別にすぐに答えなくてもよいのですよ。
#そこが掲示板のいいところ。

インデントについて、こちらを参考にしてください。
(No.28とNo.29がちゃんとインデントしてるのは、たぶんNo.24を参考にしたからでしょうね)
読みやすいプログラムを書くには-プログラミング全般
基本、プログラムを組む人は、処理の流れを追いやすくするために必ずインデントを行います。
忘れないでくださいね。

softyaさんが示した通り、
インデントを行ったソースを掲示してから、
ステップ2で出した問題を解いてくださいね。
written by へにっくす

N.R

Re: 当たり判定

#45

投稿記事 by N.R » 11年前

色々と積み上げても議題者さんが混乱するだけだと思うので最初のソースに戻ります。
強制ではないので議題者さんは取り組みやすい方を選んで返答してもらえればと思います。

No.20 で提示されたソースにコメントを付けてみました

コード:

	while(window.update() == true)
	{
			:
		  中略
			:
		distance1 = vec1.dist();		//!< A-B の距離
		distance2 = vec2.dist();		//!< A-C の距離
		
		if(distance1 < 10.0){			//!< 距離が10未満なら
			int	n = 0;					//!< n は 0 です
			window.remove(modelC[n]);	//!< C[ n ]を消す(n は 0 です)
			n++;						//!< n を +1。n は 1 です
			modelB.setMaterial(Red);
		} else {
			modelB.setMaterial(Blue);
		}
		
	}// while へ戻る
この状態で何が問題なのかは分かりますでしょうか。

あと B が消えなくなって、C との接触をみたいようにも思えますね。
仕様に変更があったならその辺の解説もお願いします

るる

Re: 当たり判定

#46

投稿記事 by るる » 11年前

やっと暇ができましたので来ました。
へにっくすさん、softyaさんすいません。
N.Rさんの問題をやることにします。お二人とも多くのことを学ばせていただき本当にありがとうございました。



何が問題なのかは、
今の状態ではn++;が何の意味もないことでしょうか?

仕様変更について、

modelAがmodelBに衝突したら、消えるのではなく赤に変化するようにしました。
modelC[n]の方は、modelAがmodelBに衝突したら一個消えるという仕様のままです。

どうぞよろしくお願いします。

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

Re: 当たり判定

#47

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

私の方針は根本理解ですので、N.Rさんとは方針が違いました。
N.Rさんの方針を選ばれるということなので、後はN.Rさんにお任せしたいと思います。

一言付け加えるならば、「問題はここだと思います」だけじゃなく、問題点についてこういう検証をしてみました。
あるいは、こうすれば良いんじゃないかと試してみました。と踏み込んで考えられるとご自身が前進できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

N.R

Re: 当たり判定

#48

投稿記事 by N.R » 11年前

>今の状態ではn++;が何の意味もないことでしょうか?
というのは正解です。

なぜ意味をなさないのか、を考えてみてください

実行すると A を操作して動かせるようになっていると思います。

プログラムというものは上から実行されて順番に下へ、一番下まで来たら終了する
というのが基本です。
運動会でもどの順で演目を進めるかというのを書いたものをプログラムと呼びますよね。

一番下で終了する、のに終了していないという事は…
という事を踏まえてコンピュータはこのプログラムをどう実行しているか
を考えてみるとわかってくるかと思います。

次の回答では答えを書いてしまいますのでまずは一度考えてみてください

> softya(ソフト屋)さん
根本的に理解しないといけないのは賛成ですが、当人が楽しくなくてはやはり気持ちが離れてしまいますので
多少遠回りでもやり易い方向から攻めてみたいと思います。

るる

Re: 当たり判定

#49

投稿記事 by るる » 11年前

>なぜ意味をなさないのか、を考えてみてください

今のままではn++をして数はプラスされていくけど、消すプログラムを付け加えないと、ただ数がプラスされていくだけ、とかでしょうか?




>という事を踏まえてコンピュータはこのプログラムをどう実行しているか

終了していないということは終わる為の条件を満たしていないから何度もループしてしまっているということでしょうか。それと最後のreturn 0に辿りつけていないとかもあったりするのでしょうか?

N.R

Re: 当たり判定

#50

投稿記事 by N.R » 11年前

>終了していないということは終わる為の条件を満たしていないから何度もループしてしまっているということでしょうか
そうですね
while(){ ... } の中をずっとループ、延々と繰り返し実行しているという事です。
それは正しい動作です。それによってずっとボタン操作で A を動かす事が出来ています。

>消すプログラムを付け加えないと
というのは

コード:

        int n = 0;
        window.remove(modelC[n]);
        n++;
        window.remove(modelC[n]);
        n++;
        window.remove(modelC[n]);
        n++;
        window.remove(modelC[n]);
        n++;
        window.remove(modelC[n]);
こういう風に書かないとダメですか?
という意味合いでしょうか

ある意味間違いではないです。
一度試してみてはどうでしょうか。

その実行結果が期待しているものと同じか、違う場合はどう違うかを知らせてください

るる

Re: 当たり判定

#51

投稿記事 by るる » 11年前

その実行結果が期待しているものと同じか、違う場合はどう違うかを知らせてください

目標の実行結果は、一度の衝突で、一個ずつ消していくという風にしようとしています。それに対して今回の実行結果は一度の衝突ですべての球が消えてしまいました。

コード:

if(distance1 < 10.0) {	
	   int n = 0;
        window.remove(modelC[n]);
        n++;
        window.remove(modelC[n]);
        n++;
        window.remove(modelC[n]);
        n++;
        window.remove(modelC[n]);
        n++;
        window.remove(modelC[n]);

 modelB.setMaterial(Red);
}

N.R

Re: 当たり判定

#52

投稿記事 by N.R » 11年前

結果は期待と違いますね
ここでは modelC[ ] の中に入るものと n の値(中身)の関係性を知ってもらえればと思います
n の値が 0 から 4 まで増えていけば球は全て消える。それを一度の接触で全部やったから一度に全部消えた
という事が分かりますでしょうか

ここで先に進む前に1つ前のソースで
n の値がどうなっていたのかを考えてみましょうか

ソースを変数nに関係する部分のみにしたものです

コード:

    while(window.update() == true)
    {
        int n = 0;                  //!< n に 0 を入れます
        window.remove(modelC[n]);   //!< C[ n ]を消す。n は 0 なのでこの行は「C[ 0 ]を消す」です
        n++;                        //!< n を +1。n は 1 です
    }// while へ戻る
これをループさせずに書くとこんな感じです。

コード:

        int n = 0;                  //!< n に 0 を入れます
        window.remove(modelC[n]);   //!< C[ n ]を消す。n は 0 なのでこの行は「C[ 0 ]を消す」です
        n++;                        //!< n を +1。n は 1 です
        int n = 0;                  //!< n に 0 を入れます
        window.remove(modelC[n]);   //!< C[ n ]を消す。n は 0 なのでこの行は「C[ 0 ]を消す」です
        n++;                        //!< n を +1。n は 1 です
        int n = 0;                  //!< n に 0 を入れます
        window.remove(modelC[n]);   //!< C[ n ]を消す。n は 0 なのでこの行は「C[ 0 ]を消す」です
        n++;                        //!< n を +1。n は 1 です
         : 以降ずっと繰り返す
n の値はどうなっていて、C のどれが消えていますか?

そしてどうすればよいと思いますか(実行しなくていいですよ)

るる

Re: 当たり判定

#53

投稿記事 by るる » 11年前

>n の値はどうなっていて、C のどれが消えていますか?
nの値は0と1をずっと繰り返しループしています。Cはいちばん最初の0のCが消えます。

>そしてどうすればよいと思いますか
この0と1の繰り返しループをやめさせて、1,2,3となっていくようにすればいいと思います。

N.R

Re: 当たり判定

#54

投稿記事 by N.R » 11年前

>nの値は0と1をずっと繰り返しループしています。Cはいちばん最初の0のCが消えます。
そうですね。No: 20 の報告と同じです。
これでどうしてそうなっていたのか、が分かりました。

>この0と1の繰り返しループをやめさせて、1,2,3となっていくようにすればいいと思います。
それは No: 51 でやった事です。
それでは期待していた結果が得られませんでした。

なぜか、
 ボタン操作で modelA を動かし、modelB との接触を見る
をループする
という前提があるからです。

このループの中に「1つずつ消す」をうまく入れてやらないといけないわけです

次回で答えを…と言いつつ引っ張ってしまいましたが
まず int n = 0; がループの外にある必要があります。
n が接触の度に 0 になっているのが1つ目の問題です。

コード:

int n = 0;
while(window.update() == true) {
	if(win.getSpecialKeyStatus(FK_RIGHT) == FKUT_SW_PRESS){
		modelA.glTranslate(0.05, 0.0, 0.0);
	}else if(win.getSpecialKeyStatus(FK_LEFT) == FKUT_SW_PRESS){
		modelA.glTranslate(-0.05, 0.0, 0.0);
	}else if(win.getSpecialKeyStatus(FK_UP) == FKUT_SW_PRESS){
		modelA.glTranslate(0.0, 0.05, 0.0);
	}else if(win.getSpecialKeyStatus(FK_DOWN) == FKUT_SW_PRESS){
		modelA.glTranslate(0.0, -0.05, 0.0);
	}
	
	posA = modelA.getPosition();
	posB = modelB.getPosition();
	posC = modelC[c].getPosition();
	
	vec1 = posB - posA;
	vec2 = posC - posA;
	
	distance1 = vec1.dist();
	distance2 = vec2.dist();
	
	if(distance1 < 10.0) {
		window.remove(modelC[n]);
		if( n < 5 )//これは今は気にしない
			n++;
		
		modelB.setMaterial(Red);
	} else {
		modelB.setMaterial(Blue);
	}
}
これもまだ期待した動作には足らないはずです。
この結果がどう期待と違い、どうればいいと思うかを考えてみてください
※あとこちらもフレームワークは分からず、実行確認できないので絶対合ってるとは限らないのでご了承を

時間かけているのはじらしているのではなく
 プログラムは書いた通りにしか動かない
 期待した動作と結果が違うのは期待しているイメージが違うから
でイメージの方を修繕していってほしいからです。
プログラムがどう動いているのかを考えてください

るる

Re: 当たり判定

#55

投稿記事 by るる » 11年前

>このループの中に「1つずつ消す」をうまく入れてやらないといけないわけです

そうですね int n = 0;が中だと0,1を繰り返す。考えればわかることでした・・・


>この結果がどう期待と違い、どうればいいと思うかを考えてみてください

今回の結果では接触すると5個まとめて消えてしまいました。
やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます。



>時間かけているのはじらしているのではなく
 プログラムは書いた通りにしか動かない
 期待した動作と結果が違うのは期待しているイメージが違うから
でイメージの方を修繕していってほしいからです。

はい、わざわざ時間をかけて教えていただき本当に感謝しております。
すぐに答えを出していただいても、やはり理解は難しいでしょうから、こうやっていただき理解をより深めることができております。

N.R

Re: 当たり判定

#56

投稿記事 by N.R » 11年前

>今回の結果では接触すると5個まとめて消えてしまいました。
そうですね。
A と B が接触して C を1つ消す
でも B は色が変わるだけでその場に残り続けるので
次の瞬間(フレーム)にもやはり接触して次の C が消える
ので文字通り瞬く間に全部消えてしまっていると思います

>やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます
そうですね。
具体的にどうするかが難しいところですが、まずは modelC の動作を確実なものにしたい所ですので
接触時に A を元の位置に戻してみてはどうでしょうか

コード:

    if(distance1 < 10.0) {
        window.remove(modelC[n]);
        if( n < 5 )//これは今は気にしない
            n++;
        
        modelB.setMaterial(Red);
        modelA.glMoveTo(-20.0, 2.0, 0.0);
    } else {
        modelB.setMaterial(Blue);
    }
}
今度は色が変わるのが一瞬のはずです

るる

Re: 当たり判定

#57

投稿記事 by るる » 11年前

実際に動かしてみたところ、色の変化は速すぎて見えなくなり、球は一つ消えて、元の位置に戻るという風になっております。

なるほど・・・glmovetoで当たった瞬間に戻すという手もあったのですか・・・全く思い付きませんでした・・・
プログラミングは発想力が大事だと改めてわかりました・・・

N.R

Re: 当たり判定

#58

投稿記事 by N.R » 11年前

今は B は動かないですが、画面をバウンドするように動かせばゲームっぽくなりますね。
n が 5 になったらゲームオーバーとしてループを抜けるようにすると更に。
色が一定時間だけ変わって元に戻るようにする、なと色々出来る事はあると思います。


作ったものが動く面白さが先に分かる方がよいと根本的な事は省いていますが
先に進む時は softyaさんの指摘するような問題にぶつかる時が来ると思いますが
今の物を作りながら覚えていって良いと思います。

インデントも重要ですね
個人のファッションにポリシーがあっても公の場に出る時は正装しなくてはなりません
同じようにコードを人に見せる時はインデントも覚える必要があります。

るる

Re: 当たり判定

#59

投稿記事 by るる » 11年前

そうですね、より改良を試みてゲームを完成させようと思います。
インデントなども、これからのことを考えると、ちゃんとしなければならないでしょうから、しっかり直せるようにします。!

丁寧に教えていただきありがとうございます!

N.R

Re: 当たり判定

#60

投稿記事 by N.R » 11年前

解決でしたら解決チェックをお願いします。
次の疑問が出たらまたトピックを立ててください

るる

Re: 当たり判定

#61

投稿記事 by るる » 11年前

解決しました!

閉鎖

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