SCREEN 12
RANDOMIZE TIMER
'DIM SHARED mouse AS INTEGER
'DIM SHARED m1 AS INTEGER
'DIM SHARED m2 AS INTEGER
'DIM SHARED m3 AS INTEGER
'DIM SHARED m4 AS INTEGER

' DEF SEG = 0
' MSEG = 256 * PEEK(51 * 4 + 3) + PEEK(51 * 4 + 2)
' mouse = 256 * PEEK(51 * 4 + 1) + PEEK(51 * 4) + 2
' DEF SEG = MSEG
' m1 = 3: CALL absolute(m1, m2, m3, m4, mouse)


eleje:
 'm1 = 3: CALL absolute(m1, m2, m3, m4, mouse)

g = INT(RND * 2) * 50
x0 = 250
y0 = 150 - 100 * SGN(g)
n = INT(RND * 20) + 10

DIM m(n)
DIM r(n)
DIM x(n)
DIM y(n)
DIM vx(n)
DIM vy(n)
DIM szin(n)
DIM xe(n)
DIM ye(n)

dt = (.03 + n * .005) / (1 + SGN(g) * 1.5)
'dt = .05

FOR i = 1 TO 7
valasztek(i) = i + 8
NEXT i

FOR i = 1 TO n
m(i) = (RND + .5) * 80
r(i) = m(i) / 5
x(i) = x0
y(i) = y0
vx(i) = (RND - .5) * (80 - g)
vy(i) = (RND - .5) * (80 - g)

'u = INT(RND * (8 - i)) + 1
'szin(i) = valasztek(u)
'FOR k = u TO 7 - i
'valasztek(k) = valasztek(k + 1)
'NEXT k
szin(i) = i - 7 * INT(i / 7) + 9

NEXT i


ujra:
 mx = m3
 my = m4

FOR i = 1 TO n
FOR j = 1 TO i - 1

tav = SQR((x(i) - x(j)) ^ 2 + (y(i) - y(j)) ^ 2)
merre = (vx(i) - vx(j)) * (x(i) - x(j)) + (vy(i) - vy(j)) * (y(i) - y(j))
IF tav > r(i) + r(j) OR merre >= 0 THEN GOTO tt:

IF ABS(y(i) - y(j)) < tav / 1.4142 THEN GOTO vacak
k = (x(j) - x(i)) / (y(j) - y(i))
e = m(j) / m(i)
d = 2 * (k * (vx(i) - vx(j)) + vy(i) - vy(j)) / (e + 1) / (k ^ 2 + 1)
c = -d * e
a = c * k
b = -a / e
GOTO egyutt

vacak:
l = (y(j) - y(i)) / (x(j) - x(i))
e = m(j) / m(i)
b = 2 * (l * (vy(i) - vy(j)) + vx(i) - vx(j)) / (e + 1) / (l ^ 2 + 1)
a = -b * e
c = a * l
d = -c / e

egyutt:
vx(i) = vx(i) + a
vx(j) = vx(j) + b
vy(i) = vy(i) + c
vy(j) = vy(j) + d

tt: NEXT j

x(i) = x(i) + vx(i) * dt
y(i) = y(i) + vy(i) * dt + g / 2 * dt ^ 2
vy(i) = vy(i) + g * dt

IF x(i) <= 12 + r(i) AND vx(i) < 0 THEN vx(i) = -vx(i)
IF y(i) >= 470 - r(i) AND vy(i) > 0 THEN vy(i) = -vy(i)
IF x(i) >= 630 - r(i) AND vx(i) > 0 THEN vx(i) = -vx(i)
IF y(i) <= 12 + r(i) AND vy(i) < 0 THEN vy(i) = -vy(i)

NEXT i

a$ = INKEY$
IF a$ <> "" THEN END

FOR i = 1 TO n
CIRCLE (xe(i), ye(i)), r(i), 0
CIRCLE (x(i), y(i)), r(i), szin(i)
xe(i) = x(i): ye(i) = y(i)
 
' m1 = 3: CALL absolute(m1, m2, m3, m4, mouse)
' IF m2 <> 0 THEN END
' IF m3 <> mx OR m4 <> my THEN END
' mx = m3
' my = m4

NEXT i

GOTO ujra

