ネスト化されたDo〜Loopの処理について

解決


松井  2010-07-19 10:24:10  No: 146978  IP: [192.*.*.*]

お世話になります。
ネスト化された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から抜けるという解釈であってるでしょうか

編集 削除
松井  2010-07-20 09:03:37  No: 146979  IP: [192.*.*.*]

自分で調べればわかることでした
あいすみません。

編集 削除
松井  2010-07-22 09:57:25  No: 146980  IP: [192.*.*.*]

Dim  p1  As Boolean
<中略>
Do
    p1=False
    
      <If条件分岐ステートメントブロック>
Loop  While  p1
これはP1=trueが成立している間は、条件がループする
ことだと思うのですが、最初にp1=Falseとなっており
P1=trueとはなりえないので、おかしな構文だと思います。

編集 削除
松井  2010-07-22 09:59:36  No: 146981  IP: [192.*.*.*]

>P1=trueとはなりえないので、おかしな構文だと思います。
言葉足らずでした。すなわちDo〜Loopを使う必要性がないと
いうことです

編集 削除
shazbot  2010-07-22 10:23:51  No: 146982  IP: [192.*.*.*]

While に達したときに、p1の状態がチェックされます。
<If条件分岐ステートメントブロック>内でp1がtrueになれば、ループしますよ。

編集 削除
松井  2010-07-22 11:22:10  No: 146983  IP: [192.*.*.*]

Dim  p1  As Boolean
<中略>
Do
    p1=False
    
      <If条件分岐ステートメントブロック>
 p1=true 
Loop  While  p1
となっていれば話はわかるのですが、サンプルには
p1=trueがないので誤植かなと思ったんですが、違いますか

編集 削除
松井  2010-07-22 11:27:14  No: 146984  IP: [192.*.*.*]

サンプルにp1=true を記述しても、しなくても結果は
変わらないです(^_^;)

編集 削除
松井  2010-07-26 19:02:46  No: 146985  IP: [192.*.*.*]

>While に達したときに、p1の状態がチェックされます。
><If条件分岐ステートメントブロック>内でp1がtrueになれば、ループしま>すよ。
  <If条件分岐ステートメントブロック>
 p1=true 
と記述されていればそのとおりですが
サンプルには、その記述がありません

編集 削除
タスク  2010-07-27 13:52:13  No: 146986  IP: [192.*.*.*]

そのサンプルの目的、説明次第で意味がある場合も考えられますが。
1 + 2 + 3 = 6
1 +(2 + 3)= 6
結果が同じというのは決定的な判断材料ではありません。
最初のサンプルコードで意味がある説明も可能です。

編集 削除
松井  2010-07-27 18:48:16  No: 146987  IP: [192.*.*.*]

タスクさん、有り難う。
しかし、頭の悪い私には、意味がよくわかりかねます。
すみません。

編集 削除
松井  2010-08-04 20:01:28  No: 146988  IP: [192.*.*.*]

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回しかループしないと
思うので、ネストにする意味がないように思うのですが

解決できずループしてます

編集 削除
shazbot  2010-08-06 08:27:31  No: 146989  IP: [192.*.*.*]

何度も同じ質問を、しかもいったんは解決済みとしたスレッドに書くのはどうかと。
<If条件分岐ステートメントブロック1>  や
<If条件分岐ステートメントブロック2>  に
何が書いてあるかで変わるので、それを明記しないと誰も答えられないと思います。

編集 削除
松井  2010-08-07 09:55:01  No: 146990  IP: [192.*.*.*]

マップの中でのボールの反射処理なのです
        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

編集 削除
松井(元祖)  2010-08-07 15:37:35  No: 146991  IP: [192.*.*.*]

上記のコードは、基本的に左右の壁、上下の壁、移動先の壁を一つずつ調べてボールの移動量を反転させています。
bhx = -bhx
bhy = -bhy
の下に
f1 = Trueがないとループから抜けられないように思うのですが
試してみると、これを記述してもしなくても関係ないようです。

編集 削除
 2010-08-07 22:38:02  No: 146992  IP: [192.*.*.*]

あのさ、DO~なんたらってさ、条件に合うまでグルグルまわるんでは?
ただ、システムでまわりすぎる場合は応答なし。とか、自動エラー処理になるのかね。(笑)
ゲームでは不具合になりやすいから、For文で処理しようね。

編集 削除
松井  2010-08-09 17:00:23  No: 146993  IP: [192.*.*.*]

マップの中でのボールの反射処理なのです
        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

編集 削除
三木谷浩楽天  2010-08-09 18:45:40  No: 146994  IP: [192.*.*.*]

なにをつくってるんだ?

動くのか?それ。

編集 削除
松井  2010-08-09 19:13:38  No: 146995  IP: [192.*.*.*]

ボールがマップの中を無限に動き回るソフトなんですよ。
マップのデータは0,1で作成してます。

編集 削除
ピーナッツ  2010-08-09 22:36:08  No: 146996  IP: [192.*.*.*]

松井さんさぁ、解決済みにしているんだから
その後に書くのはよくないだろ。
(と、他の方も書いているだろうに)

> If map(bx + bhx, by + bhy) <> 0 Then ' 移動先が壁
>   bhx = -bhx
>   bhy = -bhy
> else   
>   f1=true *これが入れば納得できるのだが
> End If

移動先が壁であれば、終了するってことですか?

> ボールがマップの中を無限に動き回るソフトなんですよ。

と矛盾するのですが・・・

> マップのデータは0,1で作成してます。

誰もこんなことを聞いていない。

編集 削除
shazbot  2010-08-10 11:17:11  No: 146997  IP: [192.*.*.*]

map関数がどうなっているのか表記がないのでなんともいえませんが、
上のソースを見る限り、条件にf1を含むループは脱出しませんね。

> ボールがマップの中を無限に動き回るソフトなんですよ。
map関数に、ボールの描画を含む工夫があれば、そう動くと思います。無限に動くんでしょう?ループを脱出する必要はありませんね(とても奨励できない手法ですが)

実はf1がグローバルな変数で、ゲームを終了させるとき(たとえばボタンを押したとき云々) 別イベントで、f1をtrueに変更するだとか、そういったところではないのですか?

編集 削除
三木谷浩楽天  2010-08-10 21:07:52  No: 146998  IP: [192.*.*.*]

1,0データ?
どうせなら0〜9くらいでは?
5の数字ならりんご。とか。

つくれなければ、ぼくが将来つくってもいいけど。

だけど、釣り人は釣りをしている時間が面白いわけで、魚が釣れた成果より重要かな?
へんな比喩ですけど。
プログラムを作ってる時間は面白いですか?

面白ければ、少しずつヒントは出せますよ。

編集 削除
松井  2010-08-11 13:29:13  No: 146999  IP: [192.*.*.*]

shazbotさん、ありがとう。
なんとか見えてきました。長いトンネルでした。

編集 削除
三木谷浩  2010-08-11 17:22:39  No: 147000  IP: [192.*.*.*]

松井>>知ったかぶりをしても、すぐばれますよ。
プログラムとは、そうゆうもんです。

なぜ?プログラムの掲示板をウロウロしてるんですか?

本をたくさん買えばいいのに。
買っても理解できなければ、どこの掲示板で質問しても無駄です。

だって、本は簡単なはず。

編集 削除
ジャンヌ  2010-08-11 17:24:25  No: 147001  IP: [192.*.*.*]

確かに。


そうですね。

編集 削除