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 = 20
x0 = 300
y0 = 300 - 5 * g
pi = 3.14159

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

dt = .03

elkezdi:
FOR i = 1 TO 7
szin(i) = i + 8

m(i) = (2 * RND + 1.5) * 50
' *50-tol *100-ig erdemes.
' *200 eseten a jatek atmegy a nagy golyok vetelkedesebe.
 
r(i) = m(i) / 5
x(i) = x0 + 70 * COS(i * 2 * pi / 7)
y(i) = y0 + 70 * SIN(i * 2 * pi / 7)

'vx(i) = SGN(.5 + SGN(RND - .5)) * (RND + 1) * 40
'vy(i) = SGN(.5 + SGN(RND - .5)) * (RND + 1) * 40

vx(i) = 60 * COS(2 * i * pi / 7)
vy(i) = 60 * SIN(2 * i * pi / 7)

hany = 1 + INT(RND * 3)
IF hany > 0 THEN GOTO le
ujnagygolyo:
NEXT i
n = 7 + plusz
GOTO ujra

le:
FOR k = 1 TO hany
ii = 7 + plusz + k
m(ii) = m(i) * (RND / 5 + .1)
r(ii) = m(ii) / 5
x(ii) = x(i) + r(i) / 2 * COS(k * 2 * pi / hany)
y(ii) = y(i) + r(i) / 2 * SIN(k * 2 * pi / hany)
vx(ii) = vx(i) + (RND - .5) * (80 - g)
vy(ii) = vy(i) + (RND - .5) * (80 - g)
szin(ii) = szin(i)
NEXT k
plusz = plusz + hany
GOTO ujnagygolyo:

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))
' ha merre <0, akkor kozelednek
nagyobbsugar = (r(i) + r(j) + ABS(r(i) - r(j))) / 2

' ************* mikor utkoznek? ***********************
IF tav > nagyobbsugar AND tav < r(i) + r(j) AND merre < 0 THEN GOTO utkoznek
IF tav < nagyobbsugar AND tav > ABS(r(i) - r(j)) AND merre > 0 THEN GOTO utkoznek


GOTO tt

utkoznek:
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

