正負反転
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さん>ありがとうございます。ソースコードを見て考えて見ます。
またよろしくお願いします。