>ひじきさま
>>dx *= -1
>こういった記述方法が分かりづらく、どういった挙動をしているのかが分からなかったためです。
>私が思うに、サンプルに求められるものは、
>書き方が遠回しになろうと「誰が読んでもわかる記述法」だと思うのです。
激しく同意
a += 3 ;a = a + 3
b *= -1 ;b = b * -1
c++ ;c += 1 | c = c + 1
とか、初心者のころは大嫌いでした。
ただ、私が言いたかったのは「書き方」というより
元の変数からその2倍の数を引くよりも
-1をかけるという「考え方」の方が
わかりやすい気がするということでした。
「誰が読んでもわかる記述法」だと↓のようになるのでしょうか。
28行目:dx = dx - (dx * 2)→dx = -1 * dx
31行目:dy = dy - (dy * 2)→dy = -1 * dy
>ひらまるさま
>同じ処理をするのにも様々な書き方があるのがプログラミングの面白さでもあり、
>たまに論争に発展し、宗教論のようになってしまう面でもあると思います
それも同意
極座標&多次元配列信者の私は動かすだけなら
#enum X = 0 ;X
#enum Y ;Y
#enum A ;角度
#enum R ;スピード(ドット/ループ)
#const SIZE 10;サイズ(半径)
randomize
ddim a_BALL,4; a_BALL(パラメータ, 個体数)
a_BALL = 320.0, 240.0, double(rnd(360)), 15.0 + rnd(5)
*main
color $FF,$FF,$FF : boxf
gosub *sub_move
gosub *sub_draw
gosub *sub_check
redraw 1
await 20
redraw 2
goto *main
stop
*sub_move ;移動
a_BALL(X) += cos(deg2rad(a_BALL(A))) * a_BALL(R) ;r×cosθ
a_BALL(Y) += sin(deg2rad(a_BALL(A))) * a_BALL(R) ;r×sinθ
return
*sub_draw ;描画
color : circle a_BALL(X) - SIZE, a_BALL(Y) - SIZE, a_BALL(X) + SIZE, a_BALL(Y) + SIZE
return
*sub_check ;衝突判定
if a_BALL(X) <= SIZE | 640 - SIZE <= a_BALL(X) : a_BALL(A) = 180.0 - a_BALL(A) ;180°−θ(水平反転)
if a_BALL(Y) <= SIZE | 480 - SIZE <= a_BALL(Y) : a_BALL(A) *= -1.0 ;−θ (垂直反転)
return
としますね。
↓遊んでみました。
#enum X = 0 ;X
#enum Y ;Y
#enum A ;角度
#enum R ;スピード(ドット/ループ)
#enum SIZE ;サイズ(半径)
randomize
ddim a_BALL,5,0; a_BALL(パラメータ, 個体数)
a_BALL(0,0) = 320.0, 240.0, double(rnd(360)), 15.0 + rnd(5), 10.0 + rnd(5)
*main
color : boxf
repeat length2(a_BALL)
gosub *sub_move
gosub *sub_draw
gosub *sub_check
loop
redraw 1
await 20
redraw 2
goto *main
stop
*sub_move ;移動
a_BALL(X, cnt) += cos(deg2rad(a_BALL(A, cnt))) * a_BALL(R, cnt) ;r×cosθ
a_BALL(Y, cnt) += sin(deg2rad(a_BALL(A, cnt))) * a_BALL(R, cnt) ;r×sinθ
return
*sub_draw ;描画
color (cnt\12)*20, (cnt\12)*20,255: circle a_BALL(X, cnt) - a_BALL(SIZE, cnt), a_BALL(Y, cnt)-a_BALL(SIZE, cnt), a_BALL(X, cnt)+a_BALL(SIZE, cnt), a_BALL(Y, cnt) + a_BALL(SIZE, cnt)
return
*sub_check ;衝突判定
if a_BALL(X, cnt) <= a_BALL(SIZE, cnt) | 640 - a_BALL(SIZE, cnt) <= a_BALL(X, cnt) : a_BALL(A, cnt) = 180.0 - a_BALL(A, cnt) :v_flg++;180°−θ(水平反転)
if a_BALL(Y, cnt) <= a_BALL(SIZE, cnt) | 480 - a_BALL(SIZE, cnt) <= a_BALL(Y, cnt) : a_BALL(A, cnt) *= -1.0 :v_flg++;−θ (垂直反転)
if v_flg : a_BALL(0, (length2(a_BALL)\1500)) = 320.0,240.0, double(rnd(360)), 5.0 + rnd(5), 5.0 + rnd(15)
v_flg = 0
return