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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.39496 の関連記事表示

<< 0 | 1 | 2 | 3 | 4 >>
■39496  PictureBoxを左右に往復するループ
□投稿者/ へっぽこ -(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
親記事 /過去ログ68より / 関連記事表示
削除チェック/

■39499  Re[1]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη -(2009/08/10(Mon) 09:26:28)
>
    > どこかにまちがいがあるのでしょうか?

    どこかにまちがいがあります。
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39500  Re[1]: PictureBoxを左右に往復するループ
□投稿者/ 魔界の仮面弁士 -(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 という値は、その後どこで利用されていますか?
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39504  Re[2]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ -(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
    なにがおかしいのか理解不能なのです。(-_-;)
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

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

    コードを眺めながら考えてください。
    そのコードでは、どんな時に PictureBox1.Left の値がマイナスされますか?
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

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

    0よりも小さいとき あるいはフォームの右端よりも大きくなったとき
    だと思いますが
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39509  Re[5]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη -(2009/08/10(Mon) 10:22:31)
>
    >>そのコードでは、どんな時に 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]で右端を越えたまま変更されてませんょ?
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39513  Re[6]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ -(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 に変更されているのでは?
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39514  Re[7]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη -(2009/08/10(Mon) 11:20:46)
>
    >>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 のままですょ?
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39515  Re[8]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ -(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 のままですょ?
    >
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39516  Re[9]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη -(2009/08/10(Mon) 11:34:33)
>
    > 下記のコードでは往復ループはできているのですが^^;^^;

    ですが、なに?

    # 違うコードじゃないですか。
    # どこが違うかわかります?
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39517  Re[10]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ -(2009/08/10(Mon) 11:38:03)
    No39516 (επιστημη さん) に返信
    > # 違うコードじゃないですか。
    > # どこが違うかわかります?
    numberが固定している場合とランダムに変化する場合のちがいでしょうか?
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39521  Re[9]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη -(2009/08/10(Mon) 11:53:21)
>
    > 下記のコードでは往復ループはできているのですが^^;^^;
    > 
    > 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の値が変化しない」って条件を壊していますよね。
    
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39520  Re[11]: PictureBoxを左右に往復するループ
□投稿者/ 魔界の仮面弁士 -(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」となってしまう事に注意してください。


    上記を踏まえたうえで、「往復運動できていた時のコード」と「反転しなくなったコード」を
    それぞれ見比べてみてください。
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39525  Re[12]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ -(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
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39530  Re[1]: PictureBoxを左右に往復するループ
□投稿者/ .SHO -(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
    
    にして、動かしてみれば?!
    
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39564  Re[2]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ -(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
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

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

    ↑ここが最初のコードと違う。
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

■39566  Re[4]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ -(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  も間違いではないような気がして…混乱してます。
    私の頭はやはり貝の殻でしょうかね?(-_-;) わたしは貝になりたくない(>_<)
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

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

    PictureBox1.Left と Me.Width の値を確認すればいい。
記事No.39496 のレス /過去ログ68より / 関連記事表示
削除チェック/

次の20件>

<< 0 | 1 | 2 | 3 | 4 >>

パスワード/

- Child Tree -