設定;2人がパラシュートで上空から降下してきます。先に地面についた者を勝ちとします。
'基礎部分のプログラム例
'変数の宣言
Dim d1, d2, k
Randomize() 'ランダムを使うための準備;1回だけ実行されるように最初に書く
'ピクチャーボックス二つを一番上に移動する
PictureBox1.Top = 0
PictureBox2.Top = 0
'ループ;一つのループの中で二つのピクチャーボックスを動かせばよい。
'ループを二つ作ってもこの場合全く意味がない。
'二重ループは一つの外側のループ一回の中で内側のループが回り切る。これが外側のループが終了するまで繰り返される。
'ループ内の処理は、正しくは移動位置を計算→移動させるという順番にすべきである。
'例えば次のような処理順番はよくない。
'Do
' PictureBox1.Top = x
' x = x + Int(Rnd(1) * 6 + 1)
'Loop Until XXXXX(xを使った条件)
Do
d1 = Int(Rnd(1) * 6 + 1) 'さいころ1;ピクチャー1用
d2 = Int(Rnd(1) * 6 + 1) 'さいころ2;ピクチャー2用
PictureBox1.Top = PictureBox1.Top + d1 'ピクチャー1を現在の位置からさいころ1の目の分だけ進める
PictureBox2.Top = PictureBox2.Top + d2 'ピクチャー2を現在の位置からさいころ2の目の分だけ進める
'*** 勿論 PictureBox1.Top = PictureBox1.Top + Int(Rnd(1) * 6 + 1) のようにしてもよい
'*** 一方、分解して次のようにしてもよい。
'ny1 = PictureBox1.Top
'y1 = ny1 + d1
'PictureBox1.Top = y1
'ここで重要なことは、さいころを振って、その目だけ進めるという順番にすること。
'空のfor文; 上記でピクチャー1,2を進めたら、ちょっと休む
For k = 0 To 200000 'この数字は適当。大きくすればいっぱい休むことになるのでゆっくりになる
Next k
Loop Until ((PictureBox1.Top + PictureBox1.Height) >= (Me.Size.Height - 30 - 4)) Or ((PictureBox2.Top + PictureBox2.Height) >= (Me.Size.Height - 30 - 4))
'*** 判定条件は二つ
'*** 一つは「ピクチャー1が着くまで」、もう一つは「ピクチャー2が着くまで」
'*** これら条件二つの関係は、どちらかの条件になるまでなので、条件1もしくは条件2になるまで、
'*** となり、条件1 Or 条件2とする。
'*** 条件1「ピクチャー1が着くまで」は、「Picturebox1.Top = Me.Size.Height」がベースとなる。
'*** Me.Size.Height(もしくはMe.Height)は、フォームウィンドウの外側全体のの高さ(長さ)を
'*** 意味しており、タイトルバー及びウィンドウ枠の太さも、考慮すべきである。
'*** またピクチャー1の上部分の高さが画面の高さと等しくなれば、ということになり、
'*** ピクチャー1が画面の下に隠れてしまう。
'*** そこでピクチャー1の下部分が画面下に着くまでと変えるには、ピクチャー1の高さを考慮する。
'*** (Picturebox1.Top + Picturebox1.Height)は下までの高さとなる。
'*** これをウィンドウの高さと比べればよい。
'*** ウィンドウ枠等の太さを考慮したウィンドウ内(内側)の高さは、
'*** (Me.Size.Height-30-4)となり、これら二つを比べればよい。
'*** 条件において比較を「=」としているが、これではまずい。無限ループを招く可能性が高い。
'*** さいころの目は1〜6までであり、もし後2マスでゴールの場合、もし6の目が出たら、
'*** ゴールを4つ通り越してしまう。つまりゴールにぴったりとなるとは限らない。
'*** そこで、条件を、「同じもしくは超えたら」として、「>=」としなければならない。
'*** Loopの条件が複雑(長く)なってしまうのを嫌うのであれば、
'*** p1b = Picturebox1.Top + Picturebox1.Height
'*** wh = Me.Size.Height-30-4
'*** とループの中であらかじめ計算しておき、
'*** Loop Until ((p1b >= wh )... などのようにしてもよい。
'*** また、(Picturebox1.Top + Picturebox1.Height) >= (Me.Size.Height-30-4))ではなく、
'*** (Picturebox1.Top >= ((Me.Size.Height-30-4) - Picturebox1.Height))などのようにしても
'*** 全く問題ない。
'次に判定を行う
' 判定はループが終了した後、つまりどちらかが先にゴールに着いた直後、
'改めて二つのピクチャーの現在位置を調べ、どちらが下にいるのかを
'比べればよい。つまりループの終了条件とは別に考えなければならない。
' この比較条件は、「(PictureBox1.Top > PictureBox2.Top)」をベースとして考える。
'但しこれでは下部分が先に進んでいるではなく、上部分がどちらが下にあるとなっている。
'そこで正確にピクチャーの下が先に進んでいるかを比べる必要がある。
'なおもしたまたま二つのピクチャーボックスの高さ(大きさ)が同じ場合は
'上記の条件でもよいわけである。
If ((PictureBox1.Top + PictureBox1.Height) > (PictureBox2.Top + PictureBox2.Height)) Then
Label1.Text = "Pic1の勝ち"
Else
'Elseの後ろに条件を書いてはいけない!またそれ以外なのだから必要もない。
Label1.Text = "Pic2の勝ち"
End If
拡張は一つ一つを吟味していけば何とかなるはず。。。
上記プログラムで分からない部分があったら、必ず何回もコメントを読み、また必要な資料を読んだ上で、気軽に尋ねてください。
少なくとも分からないことのないようにしておくべきです。
拡張部分についても、アイデアが分からないや、自分で作成したプログラムについてコメントして欲しいなどがあったら、こちらも気軽に尋ねてください。