お世話になります。
ネスト化されたDo〜Loopの処理についてアドバイスお願いします。
サンプルに
Dim p1 As Boolean、p2 As Boolean
<中略>
Do
p1=False
Do
p2=False
<If条件分岐ステートメントブロック1>
p2=True
Loop While p2
<If条件分岐ステートメントブロック2>
Loop While p1
このサンプルでは、内部から処理していき
p2がFalseのときに、このLoopから抜けて
次に
p1はFalseなので
<If条件分岐ステートメントブロック2>
を、1回実行してLoopから抜けるという解釈であってるでしょうか
自分で調べればわかることでした
あいすみません。
Dim p1 As Boolean
<中略>
Do
p1=False
<If条件分岐ステートメントブロック>
Loop While p1
これはP1=trueが成立している間は、条件がループする
ことだと思うのですが、最初にp1=Falseとなっており
P1=trueとはなりえないので、おかしな構文だと思います。
>P1=trueとはなりえないので、おかしな構文だと思います。
言葉足らずでした。すなわちDo〜Loopを使う必要性がないと
いうことです
While に達したときに、p1の状態がチェックされます。
<If条件分岐ステートメントブロック>内でp1がtrueになれば、ループしますよ。
Dim p1 As Boolean
<中略>
Do
p1=False
<If条件分岐ステートメントブロック>
p1=true
Loop While p1
となっていれば話はわかるのですが、サンプルには
p1=trueがないので誤植かなと思ったんですが、違いますか
サンプルにp1=true を記述しても、しなくても結果は
変わらないです(^_^;)
>While に達したときに、p1の状態がチェックされます。
><If条件分岐ステートメントブロック>内でp1がtrueになれば、ループしま>すよ。
<If条件分岐ステートメントブロック>
p1=true
と記述されていればそのとおりですが
サンプルには、その記述がありません
そのサンプルの目的、説明次第で意味がある場合も考えられますが。
1 + 2 + 3 = 6
1 +(2 + 3)= 6
結果が同じというのは決定的な判断材料ではありません。
最初のサンプルコードで意味がある説明も可能です。
タスクさん、有り難う。
しかし、頭の悪い私には、意味がよくわかりかねます。
すみません。
Dim p1 As Boolean、p2 As Boolean
<中略>
Do
p1=False
Do
p2=False
<If条件分岐ステートメントブロック1>
p2=True
Loop While p2 ’p2が真の間はループ
<If条件分岐ステートメントブロック2>
Loop While p1 ’p1が真の間はループ
p1=Falseなので 外側のDo〜Loopは、1回しかループしないと
思うので、ネストにする意味がないように思うのですが
解決できずループしてます
何度も同じ質問を、しかもいったんは解決済みとしたスレッドに書くのはどうかと。
<If条件分岐ステートメントブロック1> や
<If条件分岐ステートメントブロック2> に
何が書いてあるかで変わるので、それを明記しないと誰も答えられないと思います。
マップの中でのボールの反射処理なのです
Do
f1 = False
Do
f2 = False
If map(bx + bhx, by) <> 0 Then ' 進行方向の左右が壁
bhx = -bhx
f2 = True
End If
If map(bx, by + bhy) <> 0 Then ' 進行方向の上下が壁
bhy = -bhy
f2 = True
End If
Loop While f2
If map(bx + bhx, by + bhy) <> 0 Then ' 移動先が壁
bhx = -bhx
bhy = -bhy
End If
Loop While f1
上記のコードは、基本的に左右の壁、上下の壁、移動先の壁を一つずつ調べてボールの移動量を反転させています。
bhx = -bhx
bhy = -bhy
の下に
f1 = Trueがないとループから抜けられないように思うのですが
試してみると、これを記述してもしなくても関係ないようです。
あのさ、DO~なんたらってさ、条件に合うまでグルグルまわるんでは?
ただ、システムでまわりすぎる場合は応答なし。とか、自動エラー処理になるのかね。(笑)
ゲームでは不具合になりやすいから、For文で処理しようね。
マップの中でのボールの反射処理なのです
Do
f1 = False
Do
f2 = False
If map(bx + bhx, by) <> 0 Then ' 進行方向の左右が壁
bhx = -bhx
f2 = True
End If
If map(bx, by + bhy) <> 0 Then ' 進行方向の上下が壁
bhy = -bhy
f2 = True
End If
Loop While f2
If map(bx + bhx, by + bhy) <> 0 Then ' 移動先が壁
bhx = -bhx
bhy = -bhy
else
f1=true *これが入れば納得できるのだが
End If
Loop While f1
なにをつくってるんだ?
動くのか?それ。
ボールがマップの中を無限に動き回るソフトなんですよ。
マップのデータは0,1で作成してます。
松井さんさぁ、解決済みにしているんだから
その後に書くのはよくないだろ。
(と、他の方も書いているだろうに)
> If map(bx + bhx, by + bhy) <> 0 Then ' 移動先が壁
> bhx = -bhx
> bhy = -bhy
> else
> f1=true *これが入れば納得できるのだが
> End If
移動先が壁であれば、終了するってことですか?
> ボールがマップの中を無限に動き回るソフトなんですよ。
と矛盾するのですが・・・
> マップのデータは0,1で作成してます。
誰もこんなことを聞いていない。
map関数がどうなっているのか表記がないのでなんともいえませんが、
上のソースを見る限り、条件にf1を含むループは脱出しませんね。
> ボールがマップの中を無限に動き回るソフトなんですよ。
map関数に、ボールの描画を含む工夫があれば、そう動くと思います。無限に動くんでしょう?ループを脱出する必要はありませんね(とても奨励できない手法ですが)
実はf1がグローバルな変数で、ゲームを終了させるとき(たとえばボタンを押したとき云々) 別イベントで、f1をtrueに変更するだとか、そういったところではないのですか?
1,0データ?
どうせなら0〜9くらいでは?
5の数字ならりんご。とか。
つくれなければ、ぼくが将来つくってもいいけど。
だけど、釣り人は釣りをしている時間が面白いわけで、魚が釣れた成果より重要かな?
へんな比喩ですけど。
プログラムを作ってる時間は面白いですか?
面白ければ、少しずつヒントは出せますよ。
shazbotさん、ありがとう。
なんとか見えてきました。長いトンネルでした。
松井>>知ったかぶりをしても、すぐばれますよ。
プログラムとは、そうゆうもんです。
なぜ?プログラムの掲示板をウロウロしてるんですか?
本をたくさん買えばいいのに。
買っても理解できなければ、どこの掲示板で質問しても無駄です。
だって、本は簡単なはず。
確かに。
そうですね。