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

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

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

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


(過去ログ 68 を表示中)

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

■39668 / inTopicNo.41)  Re[16]: PictureBoxを左右に往復するループ
  
□投稿者/ へっぽこ (22回)-(2009/08/12(Wed) 10:17:06)
2009/08/12(Wed) 10:17:42 編集(投稿者)
No39666 (.SHO さん) に返信
> ■No39664 (へっぽこ さん) に返信
> 
>>たいへんよくわかりました。(^-^)これでは左端にはすすみませんね。
>>う〜ん。乏しい脳みそでもう一度考えてみますm(_ _)m
> 
> だっから、最初からこれを確認しろって言ってるのに…orz

すみません。
解決法は'idouryou = rn.Next(10) の部分の数字を(200,400)くらいにしないと左端へは進まないことが

わかりました。でもそうすると点滅がはやくなってしまうようです。(一種のモグラたたきのゲームがつくれそうですが(T_T)
結局は、おかしなものをつくろうとしていたのかな〜^^;

引用返信 編集キー/
■39669 / inTopicNo.42)  Re[17]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη (2102回)-(2009/08/12(Wed) 10:21:43)
επιστημη さんの Web サイト
> 解決法は'idouryou = rn.Next(10) の部分の数字を(200,400)くらいにしないと左端へは進まないことが

If idouryou > 0 Then
  idouryou = rn.Next(10)
Else
  idouryou = -rn.Next(10)
EndIf

ってやったらどうなります?

引用返信 編集キー/
■39670 / inTopicNo.43)  Re[11]: PictureBoxを左右に往復するループ
□投稿者/ biac (149回)-(2009/08/12(Wed) 10:26:18)
biac さんの Web サイト
> だっから、PictureBox1.Left の値がどう変化するかを確認すればいい。

だよねぇ。
ひょっとして、「ブレークポイント」を知らなかったりするのかなぁ?

> If PictureBox1.Left > Me.Width - PictureBox1.Width Or PictureBox1.Left < 0 Then
>     idouryou *= -1 '上記の条件のときの移動方向を反転
>
> End If
>
> PictureBox1.Left += idouryou '←この行にブレークポイントを置いて、
        'idouryou の値が想定どおりになっているか調べてみるべし。 > へっぽこ さん
※ …って、このレスを書いてるあいだに、みきぬ さんが答えてくださっちゃいましたね f(^^;

# あと、初心者はこういう混乱によく陥るので、メンバーの参照には this / Me を付けろ、
# メンバー変数の名前は区別しやすい命名 (アタマにアンダースコア付けるとか) をしろ、
# って言うわけですよ f(^^;
# ※ 「★…★の部分を挿入すると」って話から、そう思える。


> なのでbiacさんは、「移動量と方向」の2つに分けた。移動量を変えても、方向は変わらないからね。

ですます。
2次元空間で移動させるとなれば、ベクトルを扱うことになるわけだけど。
それを、2つの成分を持つものと見るか、大きさと方向を持つものと見るか…?
乱数でベクトルの大きさを設定すると決めた瞬間に、後者で行くぞという暗黙の前提が。 f(^^;



さて。
どうしても大きさと方向を idouryou という変数ひとつでいっぺんに扱いたいらしいので、
コメントに突っ込みを。(追記分を 【】 で。 <del>〜</del> は削除。)

■No39648 (へっぽこ さん) に返信

> idouryou = rn.Next(10) '【右向きの】移動量を0〜9で発生★
    '【この場所では、idouryou は 0〜9 のいずれかになっている。つまり必ず右向き。】
>
> If PictureBox1.Left > Me.Width - PictureBox1.Width Or PictureBox1.Left < 0 Then
      '【この場所でも、idouryou は 0〜9 のいずれかのままである。つまり必ず右向き。】
>     idouryou *= -1 '上記の条件のときの移動方向を<del>反転</del>【左向きに変える】
>
      '【この場所では、idouryou は左向き。】
> End If
>
  '【1】
> PictureBox1.Left += idouryou

さらに。
1. 「上記の条件」というのを日本語で説明してください。
2. 「上記の条件」のとき、idouryou は左向きになるわけですが、それでよいですか?
3. 「上記の条件」以外のときは、【1】での idouryou は右向きになりますか、左向きになりますか?
   また、それでよいですか?


> 移動量がランダムに変化することとの関係がいまいち理解できません。(-_-;)

そういうときは、問題をシンプルにしましょう。
いま直面している問題に、「移動量がランダムに変化すること」が関係しているかどうか…?
次のようにコードを (仮に) 変更してみれば、関係しているかどうか分かるのではないかな?

> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
>
>     PictureBox1.Top = rn.Next(400) 'Y座標を0〜399で発生
>     '★ 'idouryou = rn.Next(10) '移動量を0〜9で発生★
      idouryou = 5 '移動量を固定値5で発生 (「移動量がランダムに変化すること」を排除する)
>
>     If PictureBox1.Left > Me.Width - PictureBox1.Width Or PictureBox1.Left < 0 Then
>         idouryou *= -1 '上記の条件のときの移動方向を反転
>
>     End If
>
>     PictureBox1.Left += idouryou
>
> End Sub


それと。
行き詰ったときは、コードを捨てる勇気を持ちましょう。
(実際には、捨てる前にバックアップコピーを取っておくものですけれど。)

今回ですと、 Timer1_Tick() メソッドの中身全部と、 Timer1_Tick() メソッドだけで使っている
変数 (idouryou) を削除してしまって、心機一転ゼロから書き直したほうが良いです。
そうしないと、いつまでも既存の「おかしな」コードに引き摺られてしまいますよ。

引用返信 編集キー/
■39672 / inTopicNo.44)  Re[17]: PictureBoxを左右に往復するループ
□投稿者/ .SHO (1004回)-(2009/08/12(Wed) 10:43:25)
> 解決法は'idouryou = rn.Next(10) の部分の数字を(200,400)くらいにしないと左端へは進まないことが

これは解決法になってません。
う〜ん、、どうしたらそういう思考になるんだ?!

> 結局は、おかしなものをつくろうとしていたのかな〜^^;

ちゃう、ちゃう、解決法が間違ってるだけ。


PictureBox1.Left の値の確認が済んで間違っていることがわかったら
本来はどうなるべきかを考えてください。
そして、そう動くようにコードを直すんです。

引用返信 編集キー/
■39675 / inTopicNo.45)  Re[12]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (23回)-(2009/08/12(Wed) 11:12:06)
No39670 (biac さん) に返信
> 1. 「上記の条件」というのを日本語で説明してください。

 PictureBox1.Left が右端を越えそうなとき、あるいは左端を越えそうなとき

 2. 「上記の条件」のとき、idouryou は左向きになるわけですが、それでよいですか?

いえ、前者のときは、左向き、後者のときは右向きになってほしいです

3. 「上記の条件」以外のときは、【1】での idouryou は右向きになりますか、左向きになりますか?
    右向き

 >また、それでよいですか?
 いえ





引用返信 編集キー/
■39677 / inTopicNo.46)  Re[18]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (24回)-(2009/08/12(Wed) 11:14:11)
No39672 (.SHO さん) に返信
> ちゃう、ちゃう、解決法が間違ってるだけ。
> PictureBox1.Left の値の確認が済んで間違っていることがわかったら
> 本来はどうなるべきかを考えてください。
> そして、そう動くようにコードを直すんです。
そうですか、トンチンカンですみません。(^_^;)
引用返信 編集キー/
■39681 / inTopicNo.47)  Re[13]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη (2103回)-(2009/08/12(Wed) 11:41:46)
επιστημη さんの Web サイト
2009/08/12(Wed) 11:57:46 編集(投稿者)

> 1. 「上記の条件」というのを日本語で説明してください。
>  PictureBox1.Left が右端を越えそうなとき、あるいは左端を越えそうなとき
> 2. 「上記の条件」のとき、idouryou は左向きになるわけですが、それでよいですか?
>  いえ、前者のときは、左向き、後者のときは右向きになってほしいです

そこまでわかってんだったら:
If 左端を越えそう Then
 右を向く
ElseIf 右端を越えそう Then
 左を向く
EndIF

とかやればいい。

さらに「そのどちらでもないとき現在の方向を維持する」
ことができてないんですよ。
だから右端でじたばたするんです。

問題をニホンゴできちんと説明できたら、
それをそのまま忠実にコードに落とせばいいんです。
その際に今あるコードを活かそうとしてハマるくらいなら
biac導師のおっしゃるとおり「一旦捨てて書き直せ」なのね。

プログラムは思ったとおりには動きません。作ったとおりに動きます。
だから、思ったとおりに動かしたいなら、思ったとおりに作らないと。

引用返信 編集キー/
■39683 / inTopicNo.48)  Re[18]: PictureBoxを左右に往復するループ
□投稿者/ biac (150回)-(2009/08/12(Wed) 11:45:41)
biac さんの Web サイト
No39669 (επιστημη さん) に返信
> If idouryou > 0 Then
>   idouryou = rn.Next(10)
> Else
>   idouryou = -rn.Next(10)
> EndIf

弘法も筆の誤り、επιさんでもバグることはある。
# 承知の上、かな。 ( Next(9) で 1つゲタ履かせる? ) f(^^;

これは、想定されているのとはわずかに違う動きをすることがあると思いますが、
試してみてくださいね > へっぽこ さん

で、いろいろ試して、スマートに直せればよし。
やっぱりグチャグチャになって行き詰っちゃったら、また全部捨ててゼロスタート。

引用返信 編集キー/
■39685 / inTopicNo.49)  Re[13]: PictureBoxを左右に往復するループ
□投稿者/ biac (151回)-(2009/08/12(Wed) 11:55:27)
biac さんの Web サイト
No39675 (へっぽこ さん) に返信
>>1. 「上記の条件」というのを日本語で説明してください。
>
> PictureBox1.Left が右端を越えそうなとき、あるいは左端を越えそうなとき

「越えそうなとき」ではないですね。 この条件式を評価する時点で、すでに越えちゃってますよね?
「越えそうなとき」 (越える前) に、方向を反対にしたかったのですか?

※ 「PictureBox1.Left が右端を越え」というのもコードと違ってるけど、まぁそこはスルーで f(^^;


> 2. 「上記の条件」のとき、idouryou は左向きになるわけですが、それでよいですか?
>
> いえ、前者のときは、左向き、後者のときは右向きになってほしいです

右端を越えたときは左向きに、左端を越えたときは右向きにしたいのですよね。


> 3. 「上記の条件」以外のときは、【1】での idouryou は右向きになりますか、左向きになりますか?
> 右向き
>
>  >また、それでよいですか?
>  いえ

ここは、επιστημη さんが No39681 で突っ込んでくれました。
引用返信 編集キー/
■39686 / inTopicNo.50)  Re[14]: PictureBoxを左右に往復するループ
□投稿者/ やじゅ (1212回)-(2009/08/12(Wed) 13:43:49)
やじゅ さんの Web サイト
> ■No39675 (へっぽこ さん) に返信

Visual Studio 2008 開発ガイドブック 第 6 章 デバッグ
http://www.microsoft.com/japan/msdn/vstudio/2008/tech/howto/VSGuide/chapter06.aspx

特定の条件のときにデバッグをブレーク(停止)させるには?[C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/688debugbreakcond/debugbreakcond.html
引用返信 編集キー/
■39687 / inTopicNo.51)  Re[18]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (25回)-(2009/08/12(Wed) 14:05:06)
No39669 (επιστημη さん) に返信
> If idouryou > 0 Then
>   idouryou = rn.Next(10)
> Else
>   idouryou = -rn.Next(10)
> EndIf
> 
> ってやったらどうなります?
> 

アドバイスに従ってやってみました(ちがうかもしれませんが)
<実行結果>
右端にいきたくてもスムーズにいけず、すこし移動しては戻りを何度も繰り返してジタバタしています。

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


        PictureBox1.Top = rn.Next(400) 'Y座標を0〜399で発生
        
        If PictureBox1.Left > Me.Width - PictureBox1.Width Or PictureBox1.Left < 0 Then


            idouryou *= -1 '上記の条件のときの移動方向を反転
        Else
            idouryou *= 1

            If idouryou > 0 Then
                idouryou = rn.Next(10)
            Else
                idouryou = -rn.Next(10)
            End If
        End If

        PictureBox1.Left += idouryou


    End Sub

引用返信 編集キー/
■39688 / inTopicNo.52)  Re[15]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (26回)-(2009/08/12(Wed) 14:08:23)
No39686 (やじゅ さん) に返信
>>

> 
> Visual Studio 2008 開発ガイドブック  第 6 章 デバッグ
> http://www.microsoft.com/japan/msdn/vstudio/2008/tech/howto/VSGuide/chapter06.aspx
> 
> 特定の条件のときにデバッグをブレーク(停止)させるには?[C#、VB]
> http://www.atmarkit.co.jp/fdotnet/dotnettips/688debugbreakcond/debugbreakcond.html

やじゅさん、ありがとうございます。(^_^)
しっかり学びたいと思います。

引用返信 編集キー/
■39689 / inTopicNo.53)  Re[19]: PictureBoxを左右に往復するループ
□投稿者/ みきぬ (600回)-(2009/08/12(Wed) 14:10:08)
No39687 (へっぽこ さん) に返信
> <実行結果>
> 右端にいきたくてもスムーズにいけず、すこし移動しては戻りを何度も繰り返してジタバタしています。
>
ほっほう。何ででしょうねぇ。

コードの意味をよく考えるか、見える化をして idouryou が予期せずマイナスになるところの法則を見れば分かるかもしれませんねぇ。
引用返信 編集キー/
■39690 / inTopicNo.54)  Re[20]: PictureBoxを左右に往復するループ
□投稿者/ biac (152回)-(2009/08/12(Wed) 14:21:31)
biac さんの Web サイト
> ほっほう。何ででしょうねぇ。
> 
> コードの意味をよく考えるか、見える化をして idouryou が予期せずマイナスになるところの法則を見れば分かるかもしれませんねぇ。

さらに。
επιστημη さんが No39669 で提案してくれたのとは、違う場所に επιστημη さんのコードを突っ込んでるし〜

No39669 をよく読んでください。 επιστημη さんが 「> 解決法は…」 という部分をわざわざ引用しているのは、なぜでしょう?

引用返信 編集キー/
■39707 / inTopicNo.55)  Re[19]: PictureBoxを左右に往復するループ
□投稿者/ επιστημη (2106回)-(2009/08/12(Wed) 15:25:25)
επιστημη さんの Web サイト
>>If idouryou > 0 Then
>> idouryou = rn.Next(10)
>>Else
>> idouryou = -rn.Next(10)
>>EndIf
>>
>>ってやったらどうなります?
>>
>
> アドバイスに従ってやってみました(ちがうかもしれませんが)
> <実行結果>
> 右端にいきたくてもスムーズにいけず、すこし移動しては戻りを何度も繰り返してジタバタしています。

あー...このコード片の"意図"が伝わらなかったか orz
「現在の方向を維持しつつ、デタラメな移動量を生成する」のが目的です。
それをそんなトコにねじ込んだのはナゼ?

引用返信 編集キー/
■39720 / inTopicNo.56)  Re[20]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (27回)-(2009/08/12(Wed) 17:44:29)
2009/08/13(Thu) 08:57:00 編集(投稿者)
No39707 (επιστημη さん) に返信
> あー...このコード片の"意図"が伝わらなかったか orz

引用返信 編集キー/
■39726 / inTopicNo.57)  Re[19]: PictureBoxを左右に往復するループ
□投稿者/ sos (1回)-(2009/08/12(Wed) 18:46:33)
だめだこいつ…
引用返信 編集キー/
■39732 / inTopicNo.58)  Re[20]: PictureBoxを左右に往復するループ
□投稿者/ らじうむ (22回)-(2009/08/12(Wed) 19:27:47)
…最初とやろうとしてることが変わってますよ?
なんだかソースコードからロジックをイメージするのが苦手なようですし
フローチャート図に書き出すなどしてロジックを見やすい状態にしてから
何処がおかしいか考えた方が良いのではないでしょうか?
引用返信 編集キー/
■39736 / inTopicNo.59)  Re[21]: PictureBoxを左右に往復するループ
□投稿者/ へっぽこ (28回)-(2009/08/12(Wed) 19:40:14)
No39732 (らじうむ さん) に返信
> …最初とやろうとしてることが変わってますよ?
> なんだかソースコードからロジックをイメージするのが苦手なようですし
> フローチャート図に書き出すなどしてロジックを見やすい状態にしてから
> 何処がおかしいか考えた方が良いのではないでしょうか?

アドバイスありがとうございます。
名前の通りへっぽこなものですが、何とか頑張ってみたいと思います。
引用返信 編集キー/
■39738 / inTopicNo.60)  Re[21]: PictureBoxを左右に往復するループ
 
□投稿者/ Jitta on the way (382回)-(2009/08/12(Wed) 19:46:58)
No39720 (へっぽこ さん) に返信
> ■No39707 (επιστημη さん) に返信
>>あー...このコード片の"意図"が伝わらなかったか orz
>>「現在の方向を維持しつつ、デタラメな移動量を生成する」のが目的です。
>>それをそんなトコにねじ込んだのはナゼ?
>>
> これでいいのでしょうか?
>
下手な鉄砲を数射っても当たったりしません。的は何処かにいってしまうからです。
(この場合、機関銃を射っているうちに銃口がはねあがって明後日の方向を向いてしまっている)

書いたコードの意味を理解していますか?

とりあえず、日本語で、コードを書いてみましょう。

timer_tick
picture1.left に、移動量×移動方向を足し込む
もし、picture1.left がフォームの幅を越えたなら、
…移動方向を左向きにする
もし、picture1.left が0を下回ったなら、
…移動方向を右向きにする
次回の移動量を、ランダムに決める
引用返信 編集キー/

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

管理者用

- Child Tree -