C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[36]: PictureBoxを左右に往復するループ


(過去ログ 68 を表示中)

[トピック内 98 記事 (1 - 20 表示)]  << 0 | 1 | 2 | 3 | 4 >>

■39496 / inTopicNo.1)  PictureBoxを左右に往復するループ
  
□投稿者/ へっぽこ (5回)-(2009/08/10(Mon) 08:54:57)

分類:[.NET 全般] 

VB2008
PictureBoxを左右に往復するループを作成しましたが、★のように速度をランダムに発生させると
右端で反転しなくなりました。どこかにまちがいがあるのでしょうか?


Public Class Form1
    Dim number As Integer = 5 →(★ Dim number As Integer )
    Dim rn As Random = New Random()

    
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        PictureBox1.Top = rn.Next(400)
     →   ★ number = rn.Next(10)


        PictureBox1.Left += number
        If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width - PictureBox1.Width Then
            number *= -1


        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        Timer1.Enabled = Not Timer1.Enabled



    End Sub


End Class

引用返信 編集キー/
■39499 / inTopicNo.2)  Re[1]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη (2092回)-(2009/08/10(Mon) 09:26:28)
επιστημη さんの Web サイト
> どこかにまちがいがあるのでしょうか?

どこかにまちがいがあります。

引用返信 編集キー/
■39500 / inTopicNo.3)  Re[1]: PictureBoxを左右に往復するループ
□投稿者/ 魔界の仮面弁士 (1183回)-(2009/08/10(Mon) 09:34:59)
2009/08/10(Mon) 09:35:24 編集(投稿者)
No39496 (へっぽこ さん) に返信
>     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
>         PictureBox1.Top = rn.Next(400)
>      →   ★ number = rn.Next(10)
>         PictureBox1.Left += number
>         If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width - PictureBox1.Width Then
>             number *= -1
>         End If
>     End Sub

★のところで、0〜9 という数値 number が生成されますよね。
その後の If 判定で、それを±0〜9 にしているのだと思います。

では、そうして生成された±0〜9 という値は、その後どこで利用されていますか?

引用返信 編集キー/
■39504 / inTopicNo.4)  Re[2]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (6回)-(2009/08/10(Mon) 09:47:25)
No39500 (魔界の仮面弁士 さん) に返信
> その後の If 判定で、それを±0〜9 にしているのだと思います。
> 
> では、そうして生成された±0〜9 という値は、その後どこで利用されていますか?

下記の部分だと思いますが
PictureBox1.Left += number
        If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width - PictureBox1.Width Then
            number *= -1
なにがおかしいのか理解不能なのです。(-_-;)

引用返信 編集キー/
■39505 / inTopicNo.5)  Re[3]: PictureBoxを左右に往復するループ
□投稿者/ みきぬ (595回)-(2009/08/10(Mon) 09:52:45)
No39504 (へっぽこ さん) に返信

コードを眺めながら考えてください。
そのコードでは、どんな時に PictureBox1.Left の値がマイナスされますか?
引用返信 編集キー/
■39507 / inTopicNo.6)  Re[4]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (7回)-(2009/08/10(Mon) 10:12:15)
No39505 (みきぬ さん) に返信
> ■No39504 (へっぽこ さん) に返信
>
> コードを眺めながら考えてください。
> そのコードでは、どんな時に PictureBox1.Left の値がマイナスされますか?

0よりも小さいとき あるいはフォームの右端よりも大きくなったとき
だと思いますが
引用返信 編集キー/
■39509 / inTopicNo.7)  Re[5]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη (2093回)-(2009/08/10(Mon) 10:22:31)
επιστημη さんの Web サイト
>>そのコードでは、どんな時に PictureBox1.Left の値がマイナスされますか?
>
> 0よりも小さいとき あるいはフォームの右端よりも大きくなったとき
> だと思いますが

だーかーらー...

PictureBox1.Left = 右端ギリギリ
number = 10 (これ足すと右端を越える)

だったとしましょうか。このとき:

PictureBox1.Left += number ← [1]ココで越えた!
If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width - PictureBox1.Width Then ← [2]越えてたら
 number *= -1 ← [3] number = -10 とする。

... PictureBox1.Leftの値は[1]で右端を越えたまま変更されてませんょ?

引用返信 編集キー/
■39513 / inTopicNo.8)  Re[6]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (8回)-(2009/08/10(Mon) 11:15:07)
No39509 (επιστημη さん) に返信
> PictureBox1.Left = 右端ギリギリ
> number = 10 (これ足すと右端を越える)
>
> だったとしましょうか。このとき:
>
> PictureBox1.Left += number ← [1]ココで越えた!
> If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width - PictureBox1.Width Then ← [2]越えてたら
>  number *= -1 ← [3] number = -10 とする。
>
> ... PictureBox1.Leftの値は[1]で右端を越えたまま変更されてませんょ?

number = -10 に変更されているのでは?
引用返信 編集キー/
■39514 / inTopicNo.9)  Re[7]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη (2094回)-(2009/08/10(Mon) 11:20:46)
επιστημη さんの Web サイト
>>PictureBox1.Left = 右端ギリギリ
>>number = 10 (これ足すと右端を越える)
>>
>>だったとしましょうか。このとき:
>>
>>PictureBox1.Left += number ← [1]ココで越えた!
>>If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width - PictureBox1.Width Then ← [2]越えてたら
>> number *= -1 ← [3] number = -10 とする。
>>
>>... PictureBox1.Leftの値は[1]で右端を越えたまま変更されてませんょ?
>
> number = -10 に変更されているのでは?

numberは確かに-10になります。
ではPictureBox1.Leftは?

先生が黒板に「答:x = 10」を書きました。
あなたはそれをノートに書き写しました。
直後に先生が"あ、間違ってるごめーん"て頭かきかき x = -10 と書き換えました。
あなたのノートに書き写された答は「書き直さない限り」 x = 10 のままですょ?

引用返信 編集キー/
■39515 / inTopicNo.10)  Re[8]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (9回)-(2009/08/10(Mon) 11:30:50)
No39514 (επιστημη さん) に返信
> numberは確かに-10になります。
> ではPictureBox1.Leftは?
下記のコードでは往復ループはできているのですが^^;^^;

Public Class Form1
Dim nember As Integer = 10

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer1.Enabled = Not Timer1.Enabled
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
PictureBox1.Left += nember
If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width Then
nember *= -1
End If
End Sub
End Class
>
> 先生が黒板に「答:x = 10」を書きました。
> あなたはそれをノートに書き写しました。
> 直後に先生が"あ、間違ってるごめーん"て頭かきかき x = -10 と書き換えました。
> あなたのノートに書き写された答は「書き直さない限り」 x = 10 のままですょ?
>
引用返信 編集キー/
■39516 / inTopicNo.11)  Re[9]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη (2095回)-(2009/08/10(Mon) 11:34:33)
επιστημη さんの Web サイト
> 下記のコードでは往復ループはできているのですが^^;^^;

ですが、なに?

# 違うコードじゃないですか。
# どこが違うかわかります?

引用返信 編集キー/
■39517 / inTopicNo.12)  Re[10]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (10回)-(2009/08/10(Mon) 11:38:03)
No39516 (επιστημη さん) に返信
> # 違うコードじゃないですか。
> # どこが違うかわかります?
numberが固定している場合とランダムに変化する場合のちがいでしょうか?

引用返信 編集キー/
■39520 / inTopicNo.13)  Re[11]: PictureBoxを左右に往復するループ
□投稿者/ 魔界の仮面弁士 (1185回)-(2009/08/10(Mon) 11:46:32)
No39517 (へっぽこ さん) に返信
> ■No39516 (επιστημη さん) に返信
>># 違うコードじゃないですか。
>># どこが違うかわかります?
> numberが固定している場合とランダムに変化する場合のちがいでしょうか?

この場合、ランダムかどうかは関係ありません。処理順の問題です。


たとえば、PictureBox1.Left = 100、number = 5 だったと仮定しましょう。

このとき、
 number *= -1;
 PictureBox1.Left += number;
と行うと、実行後には「Left = 95、number = -5」に変化しますが、
 PictureBox1.Left += number;
 number *= -1;
の順で実行すると、「Left = 105、number = -5」となってしまう事に注意してください。


上記を踏まえたうえで、「往復運動できていた時のコード」と「反転しなくなったコード」を
それぞれ見比べてみてください。
引用返信 編集キー/
■39521 / inTopicNo.14)  Re[9]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη (2096回)-(2009/08/10(Mon) 11:53:21)
επιστημη さんの Web サイト
> 下記のコードでは往復ループはできているのですが^^;^^;
> 
> Public Class Form1
>     Dim nember As Integer = 10
>... 
>     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
>         PictureBox1.Left += nember
>         If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width Then
>             nember *= -1
>         End If
>     End Sub
> End Class

これがなぜ正しく動く(動いているように見える)かわかります?
このケースでも PictureBoxの位置を変更したあとでnumberの符号を反転させています。
だから本来なら"正しく動くはずがない"。
けどもうまくいってる(ように見える)。
PictureBoxの位置が範囲外であったときの位置補正が
「次のタイムアウトでこのメソッドに飛び込んだとき」に行われるからです。
次のタイムアウトまでnumberの値が変化しないからうまくいってる(ように見える)わけ。

では、ランダムに変化させるコードではどうでしょうか?
「次のタイムアウトまでnumberの値が変化しない」って条件を壊していますよね。

引用返信 編集キー/
■39525 / inTopicNo.15)  Re[12]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (11回)-(2009/08/10(Mon) 13:51:08)
No39520 (魔界の仮面弁士 さん) に返信
> この場合、ランダムかどうかは関係ありません。処理順の問題です。
>
>
> たとえば、PictureBox1.Left = 100、number = 5 だったと仮定しましょう。
>
> このとき、
>  number *= -1;
>  PictureBox1.Left += number;
> と行うと、実行後には「Left = 95、number = -5」に変化しますが、
>  PictureBox1.Left += number;
>  number *= -1;
> の順で実行すると、「Left = 105、number = -5」となってしまう事に注意してください。
>
>
> 上記を踏まえたうえで、「往復運動できていた時のコード」と「反転しなくなったコード」を
> それぞれ見比べてみてください。


少し考えてみます。魔界の仮面弁士 さん、επιστημη さんのお二人には感謝します。m(_ _)m
引用返信 編集キー/
■39530 / inTopicNo.16)  Re[1]: PictureBoxを左右に往復するループ
□投稿者/ .SHO (990回)-(2009/08/10(Mon) 16:02:37)
No39496 (へっぽこ さん) に返信

ランダムだとわからなくなっちゃうんだったら

> Public Class Form1
>     Dim number As Integer = 5 →(★ Dim number As Integer )
>     Dim rn As Random = New Random()
>     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
>         PictureBox1.Top = rn.Next(400)
>
>      →   ★ number = rn.Next(10)

ここを、
               number = 5

にして、動かしてみれば?!

引用返信 編集キー/
■39564 / inTopicNo.17)  Re[2]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (12回)-(2009/08/11(Tue) 07:48:48)
へっぽこな奴におつきいいただき感謝申し上げます。m(_ _)m
あらためて下記のように書いてみましたが、反転移動しません。
コードはまちがっていないとは思うのですが(しかし、まちがえてるから思った動きをしてくれないんですよねコンピュータは(^^;)


Public Class Form1
    Dim nember As Integer = 10
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = Not Timer1.Enabled
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If PictureBox1.Left = 0 Or PictureBox1.Left = Me.Width Then  '左右どちらかの端に到達したら移動方向を反転
            nember *= -1
            PictureBox1.Left += nember  'nember=-1をかけた値を代入
        Else
            PictureBox1.Left += nember  'nember=10を代入
        End If
    End Sub
End Class

引用返信 編集キー/
■39565 / inTopicNo.18)  Re[3]: PictureBoxを左右に往復するループ
□投稿者/ .SHO (994回)-(2009/08/11(Tue) 08:23:33)
> If PictureBox1.Left = 0 Or PictureBox1.Left = Me.Width Then  '左右どちらかの端に到達したら移動方向を反転

↑ここが最初のコードと違う。

引用返信 編集キー/
■39566 / inTopicNo.19)  Re[4]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (13回)-(2009/08/11(Tue) 08:41:01)
No39565 (.SHO さん) に返信
>>        If PictureBox1.Left = 0 Or PictureBox1.Left = Me.Width Then  '左右どちらかの端に到達したら移動方向を反転
> 
> ↑ここが最初のコードと違う。
> 

 If PictureBox1.Left < 0 Or PictureBox1.Left > Me.Width Then

確かにこのコードなら反転はします。
でも
If PictureBox1.Left = 0 Or PictureBox1.Left = Me.Width Then  も間違いではないような気がして…混乱してます。
私の頭はやはり貝の殻でしょうかね?(-_-;) わたしは貝になりたくない(>_<)

引用返信 編集キー/
■39567 / inTopicNo.20)  Re[5]: PictureBoxを左右に往復するループ
 
□投稿者/ .SHO (995回)-(2009/08/11(Tue) 08:44:00)
> If PictureBox1.Left = 0 Or PictureBox1.Left = Me.Width Then  も間違いではないような気がして…混乱してます。
> 私の頭はやはり貝の殻でしょうかね?(-_-;) わたしは貝になりたくない(>_<)

PictureBox1.Left と Me.Width の値を確認すればいい。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 | 4 >>

管理者用

- Child Tree -