HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0719
snow正負反転10未解決


snow

リンク

2013/7/19(Fri) 20:36:41|NO.55765

正負反転するのが意味が分からなくて ifx>100より大きくなったとき dx = -dx リピートで戻って x= x-dxになっているのか
次にifx<=0で リピートで戻って来たとき dx = -dx で x=x+dx になっているのかが分からないです。
(dx = -dx )って -dxをdxに代入しているのかそれとも、A=Bで等しいと考えてますけど、(ごちゃごちゃと考えてしまい。)
いまいちそこら辺が分かりません。
x = 0 : y = 100 ;初期座標設定(開始位置)
dx = 10 : dy = 0 ;移動量の設定
repeat
color 255, 255, 255 ;※1 白色。背景と同じ色。
boxf ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。
color 0, 0, 0
pos x, y
mes "●"
x = x + dx
y = y + dy
if x > 100:dx = -dx ;移動量正負反転。
if x <=0:dx = -dx ;移動量正負反転。
await 200
loop
stop



この記事に返信する


晩御飯

リンク

2013/7/20(Sat) 00:49:38|NO.55769

プログラミングに於けるA=Bは数学のそれとは違うよ
A=BはBを評価した結果をAに入れているだけ


A=42 ;右辺を評価した結果は42、その結果をAに代入する mes A A=-A ;右辺を評価した結果は-42、その結果をAに代入する mes A



snow

リンク

2013/7/20(Sat) 07:40:06|NO.55770

上に書いてあるんですけど、Xという変数に0を入れて、Yという変数に100を入れて、
dxという変数に10そしてdyという変数に0を入れているので、

晩御飯さんの言いたいことは分かるんですけど
A=42 ;Aという変数に42を代入して
A=-A:mes A ;A=-Aで左のAに-42が入ってMESで-42が出力されました。

自分が考えているのは
ifx>100xが100以上のとき:dx = -dx 右辺の10を左辺に代入してから
X=100+(-10)で引いて0以下または等しいとき
:dx = -dxになっているから X=0+(-10)マイナス方向にいくようなきがして
まだ分かっていません。



KA

リンク

2013/7/20(Sat) 09:08:31|NO.55772

ゴミを消します
>>x = 0 : dx = 10
>>repeat
>>x = x + dx
>>if x > 100 : dx = -dx ;移動量正負反転。
>>if x <= 0 : dx = -dx ;移動量正負反転。
>>loop

書き換えます
>>A=0 : B=10
>>repeat
>>A=A+B
>>if A > 100 : B=B*(-1) ;移動量正負反転。
>>if A <= 0 : B=B*(-1) ;移動量正負反転。
>>loop

A(最初は0)にB(最初はプラス)を、100になるまで加算。
加算しているので、Aが100以上(実質110)になったら、Bがマイナスになって減算。
減算しているので、Aが0かそれ以下(実質0)になったら、Bがマイナスのマイナスで加算。
最初に戻る。



リンク

2013/7/20(Sat) 09:21:00|NO.55773

最初にxが100を越えたときdx=-dxが実行されるのでdx=-10になります。
次に、xが0以下になったときまたdx=-dxが実行されます。
正しい表記ではありませんがdx=-(-10)
ここでdx=10に戻ります。
X=0+10って事でプラス方向に行きます。

説明が下手ですみませんが、そんな感じ。



YSR

リンク

2013/7/20(Sat) 11:22:34|NO.55774


x = 0 : y = 100 ;初期座標設定(開始位置) dx = 10 : dy = 0 ;移動量の設定 repeat color 255, 255, 255 ;※1 白色。背景と同じ色。 boxf ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 pos x, y mes "●" x = x + dx y = y + dy if x > 100:dx = -dx ;移動量正負反転。 if x <=0:dx = -dx ;移動量正負反転。 await 200 loop stop
↑が元のソースコード。このソースコードだと、
「xが100より大きいなら移動方向反転。しかし反転して1回移動したらまた反転してしまう」
ことになります。移動量が固定ならばまだいいのですが、将来的に
ループ中で移動方向を書き換えたりすると問題になるでしょう(移動しっぱなしになるとか)。
そこで、「どちら方向に移動しているか」を符号で判定するかフラグとして持たせるという手があります。

x = 0 y = 100 dx = 10 dy = 0 repeat color 255, 255, 255 boxf color 0, 0, 0 pos x, y mes "●" x += dx ;x = x + dx と同じ意味 y += dy ;y = y + dy と同じ意味 if (x > 100) & (dx > 0) :dx = -dx if (x < 0) & (dx < 0) :dx = -dx await 200 loop stop
これでしたら、間に「dx -= 1」などとして移動量を変化させても、無事に反射します。



GENKI

リンク

2013/7/20(Sat) 11:42:05|NO.55775

こういう時は説明もいいですが、デバッグ方法をおすすめするのもいいかと思います。(今回はデバッグではないですが、何が起きているのか把握できていないのでデバッグと大差ないと思います。)

まずは何が起きているのか、現象・症状を正確に把握しましょう。
今回のように画像で出力してもよくわからない場合は、数値を出力して1つずつ確認するのもひとつの手です。

s="" mesbox s, ginfo_winx, ginfo_winy objid = stat x = 0 : y = 100 ;初期座標設定(開始位置) dx = 10 : dy = 0 ;移動量の設定 repeat 50 ; とりあえずこれだけ見れば十分 color 255, 255, 255 ;※1 白色。背景と同じ色。 boxf ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 s = s + cnt + " : (x,y)=(" + x + ", " + y + "), (dx,dy)=(" + dx + ", " + dy + ")\n" objprm objid, s ; pos x, y ; mes "●" x = x + dx y = y + dy if x > 100:dx = -dx ;移動量正負反転。 if x <=0:dx = -dx ;移動量正負反転。 await 200 loop stop

他の皆さんの説明も合わせつつ、数字を追いかけてみると何が起きているのか見えてくると思います。



snow

リンク

2013/7/21(Sun) 05:45:41|NO.55784

アドバイスありがとうございます。(撃さん)まだ考え中で、
また分からなかったらお願いします。



snow

リンク

2013/7/21(Sun) 05:48:58|NO.55785

GENKIさん>さんアドバイスありがとうございます。
ちょっと自分で考えて見ます。(また分からなかったらよろしくお願いします



snow

リンク

2013/7/21(Sun) 05:50:54|NO.55786

YSRさん>ありがとうございます。まだ自分で考えているのでまた分からなかったら
聞きますのでよろしくお願いします。



snow

リンク

2013/7/21(Sun) 05:52:49|NO.55787

KAさん>ありがとうございます。ソースコードを見て考えて見ます。
またよろしくお願いします。



ONION software Copyright 1997-2023(c) All rights reserved.