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