Arkan-style part2, ugly code
Aug. 27th, 2015 09:45 pmУвы, сегодня кодес как он есть, без комментариев.
Компелируете: fbc.exe -lang qb -s gui bounce3.bas
DIM ix(10)
DIM iy(10)
DIM a(10)
DIM sp(10)
l1 = 0: l2 = 0: l3 = 199: l4 = 199
num = 10
rad = 5
RANDOMIZE TIMER
FOR n = 1 TO num
ix(n) = RND * l3
iy(n) = RND * l4
a(n) = RND * 360
sp(n) = RND * 2
NEXT n
SCREEN 7
DO
REM обсчет движения шариков
FOR n = 1 TO num
ix(n) = ix(n) + sp(n) * COS(a(n) * .0174)
iy(n) = iy(n) + sp(n) * SIN(a(n) * .0174)
IF ix(n) > l3 OR ix(n) < l1 THEN
a(n) = 180 - a(n)
ix(n) = ix(n) + sp(n) * COS(a(n) * .0174)
iy(n) = iy(n) + sp(n) * SIN(a(n) * .0174)
END IF
IF iy(n) > l4 OR iy(n) < l2 THEN
a(n) = 360 - a(n)
ix(n) = ix(n) + sp(n) * COS(a(n) * .0174)
iy(n) = iy(n) + sp(n) * SIN(a(n) * .0174)
END IF
IF a(n) > 360 THEN a(n) = a(n) - 360
IF a(n) < 0 THEN a(n) = 360 + a(n)
NEXT n
REM столкновение
FOR k = 1 TO num
FOR n = 1 TO num
d1 = ABS(ix(k) - ix(n))
d2 = ABS(iy(k) - iy(n))
IF SQR(d1 ^ 2 + d2 ^ 2) < rad * 2 AND k <> n THEN
REM изм скорости в зависимости от угла
d3 = (sp(n) + sp(k)) / 2: REM
REM defender//attacker
IF ABS(a(n) - a(k)) > 180 THEN sp(n) = sp(n) - d3: sp(k) = sp(k) + d3
IF ABS(a(n) - a(k)) < 180 THEN sp(n) = sp(n) + d3: sp(k) = sp(k) - d3
IF sp(n) < 0 THEN sp(n) = .1
IF sp(k) < 0 THEN sp(k) = .1
IF sp(n) > 2 THEN sp(n) = 2
IF sp(k) > 2 THEN sp(k) = 2
d3 = a(n)
a(n) = a(n) - 90 * (sp(n) + sp(k)) / 2: REM изм угла в зависимости от скорости
a(k) = d3 + 90 * (sp(n) + sp(k)) / 2
IF a(n) > 360 THEN a(n) = a(n) - 360
IF a(n) < 0 THEN a(n) = 360 + a(n)
IF a(k) > 360 THEN a(k) = a(k) - 360
IF a(k) < 0 THEN a(k) = 360 + a(k)
REM вывод из области взаимодействия
ix(n) = ix(n) + sp(n) * COS(a(n) * .0174)
iy(n) = iy(n) + sp(n) * SIN(a(n) * .0174)
ix(k) = ix(k) + sp(k) * COS(a(k) * .0174)
iy(k) = iy(k) + sp(k) * SIN(a(k) * .0174)
END IF
NEXT n
NEXT k
LINE (l1, l2)-(l3, l4), 7, B
REM прорисовка шариков+type??
FOR n = 1 TO num
CIRCLE (ix(n), iy(n)), rad, 7
NEXT n
sleep 1,1
FOR n = 1 TO num
CIRCLE (ix(n), iy(n)), rad, 0
NEXT n
LOOP UNTIL INKEY$ = CHR$(27)
Файлы:
http://65wat.ru/fb/BOUNCE3.BAS
http://65wat.ru/fb/bounce3.exe
вдохновил на написание скринсейвер программы Dos Navigator, Molecula.
(там, все было разного размера, соот-но была разная масса и импульс).
ехидный наблюдатель заметит, что иногда шары пролетают сквозь рамку и застревают в ней- это багофича.
как пример того, к чему можно стремиться -> http://free-basic.ru/brazil.html
Компелируете: fbc.exe -lang qb -s gui bounce3.bas
DIM ix(10)
DIM iy(10)
DIM a(10)
DIM sp(10)
l1 = 0: l2 = 0: l3 = 199: l4 = 199
num = 10
rad = 5
RANDOMIZE TIMER
FOR n = 1 TO num
ix(n) = RND * l3
iy(n) = RND * l4
a(n) = RND * 360
sp(n) = RND * 2
NEXT n
SCREEN 7
DO
REM обсчет движения шариков
FOR n = 1 TO num
ix(n) = ix(n) + sp(n) * COS(a(n) * .0174)
iy(n) = iy(n) + sp(n) * SIN(a(n) * .0174)
IF ix(n) > l3 OR ix(n) < l1 THEN
a(n) = 180 - a(n)
ix(n) = ix(n) + sp(n) * COS(a(n) * .0174)
iy(n) = iy(n) + sp(n) * SIN(a(n) * .0174)
END IF
IF iy(n) > l4 OR iy(n) < l2 THEN
a(n) = 360 - a(n)
ix(n) = ix(n) + sp(n) * COS(a(n) * .0174)
iy(n) = iy(n) + sp(n) * SIN(a(n) * .0174)
END IF
IF a(n) > 360 THEN a(n) = a(n) - 360
IF a(n) < 0 THEN a(n) = 360 + a(n)
NEXT n
REM столкновение
FOR k = 1 TO num
FOR n = 1 TO num
d1 = ABS(ix(k) - ix(n))
d2 = ABS(iy(k) - iy(n))
IF SQR(d1 ^ 2 + d2 ^ 2) < rad * 2 AND k <> n THEN
REM изм скорости в зависимости от угла
d3 = (sp(n) + sp(k)) / 2: REM
REM defender//attacker
IF ABS(a(n) - a(k)) > 180 THEN sp(n) = sp(n) - d3: sp(k) = sp(k) + d3
IF ABS(a(n) - a(k)) < 180 THEN sp(n) = sp(n) + d3: sp(k) = sp(k) - d3
IF sp(n) < 0 THEN sp(n) = .1
IF sp(k) < 0 THEN sp(k) = .1
IF sp(n) > 2 THEN sp(n) = 2
IF sp(k) > 2 THEN sp(k) = 2
d3 = a(n)
a(n) = a(n) - 90 * (sp(n) + sp(k)) / 2: REM изм угла в зависимости от скорости
a(k) = d3 + 90 * (sp(n) + sp(k)) / 2
IF a(n) > 360 THEN a(n) = a(n) - 360
IF a(n) < 0 THEN a(n) = 360 + a(n)
IF a(k) > 360 THEN a(k) = a(k) - 360
IF a(k) < 0 THEN a(k) = 360 + a(k)
REM вывод из области взаимодействия
ix(n) = ix(n) + sp(n) * COS(a(n) * .0174)
iy(n) = iy(n) + sp(n) * SIN(a(n) * .0174)
ix(k) = ix(k) + sp(k) * COS(a(k) * .0174)
iy(k) = iy(k) + sp(k) * SIN(a(k) * .0174)
END IF
NEXT n
NEXT k
LINE (l1, l2)-(l3, l4), 7, B
REM прорисовка шариков+type??
FOR n = 1 TO num
CIRCLE (ix(n), iy(n)), rad, 7
NEXT n
sleep 1,1
FOR n = 1 TO num
CIRCLE (ix(n), iy(n)), rad, 0
NEXT n
LOOP UNTIL INKEY$ = CHR$(27)
Файлы:
http://65wat.ru/fb/BOUNCE3.BAS
http://65wat.ru/fb/bounce3.exe
вдохновил на написание скринсейвер программы Dos Navigator, Molecula.
(там, все было разного размера, соот-но была разная масса и импульс).
ехидный наблюдатель заметит, что иногда шары пролетают сквозь рамку и застревают в ней- это багофича.
как пример того, к чему можно стремиться -> http://free-basic.ru/brazil.html