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

解決


松井  2010-07-19 19:24:10  No: 146978

お世話になります。
ネスト化された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 18:03:37  No: 146979

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


松井  2010-07-22 18:57:25  No: 146980

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


松井  2010-07-22 18:59:36  No: 146981

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


shazbot  2010-07-22 19:23:51  No: 146982

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


松井  2010-07-22 20:22:10  No: 146983

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


松井  2010-07-22 20:27:14  No: 146984

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


松井  2010-07-27 04:02:46  No: 146985

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


タスク  2010-07-27 22:52:13  No: 146986

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


松井  2010-07-28 03:48:16  No: 146987

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


松井  2010-08-05 05:01:28  No: 146988

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 17:27:31  No: 146989

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


松井  2010-08-07 18:55:01  No: 146990

マップの中でのボールの反射処理なのです
        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-08 00:37:35  No: 146991

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


  2010-08-08 07:38:02  No: 146992

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


松井  2010-08-10 02:00:23  No: 146993

マップの中でのボールの反射処理なのです
        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-10 03:45:40  No: 146994

なにをつくってるんだ?

動くのか?それ。


松井  2010-08-10 04:13:38  No: 146995

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


ピーナッツ  2010-08-10 07:36:08  No: 146996

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

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

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

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

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

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

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


shazbot  2010-08-10 20:17:11  No: 146997

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

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

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


三木谷浩楽天  2010-08-11 06:07:52  No: 146998

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

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

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

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


松井  2010-08-11 22:29:13  No: 146999

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


三木谷浩  2010-08-12 02:22:39  No: 147000

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

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

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

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


ジャンヌ  2010-08-12 02:24:25  No: 147001

確かに。

そうですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加