use ["std", "canvas", "math"] maxFPS = 30 frame_time = 1000 / maxFPS dd = 0.5 max = 25 G = 100 // задаём константу методом подбора dt = 0.33 // шаг вычисления b = [] buffer = [] def ball(x, y) = { "x": x "y": y "r": 25 "m": 1 "dx": 0 "dy": 0 "color": #ff00a5a5 } def collision(a, b) { return pow(a.x - b.x, 2) + pow(a.y - b.y, 2) < pow(a.r/2 + b.r/2, 2) } canvas = showcanvas() canvas.setTextSize(25) canvas.setTextAlign(Align.CENTER) setOnTouchEvent(::touch) a = ball(WIDTH/2, HEIGHT/2) a.color = rand(#ffffffac) a.m = 110 a.r += a.m / 2 b += a while (true) { canvas.drawColor(#ff000000) if (!buffer.isEmpty()) { b <<= buffer buffer = [] } for el : b { canvas.setColor(el.color) canvas.drawCircle(el.x, el.y, el.r) } canvas.setColor(#ffffffff) canvas.drawText("m" + b[0].m, b[0].x, b[0].y) repaint() update() sleep(frame_time) } def update(){ for (i = 0, i < b.length, i++) { for (j = 0, j < b.length, j++) { if (i == j) continue if (collision(b[i], b[j])) { if (b[i].m > b[j].m) { b[i].m += b[j].m b[i].r += b[j].r / 2 b = arraySplice(b, j, 1) } else { b[j].m += b[i].m b[j].r += b[i].r / 2 b = arraySplice(b, i, 1) } i = j = b.length continue } dx = b[j].x - b[i].x dy = b[j].y - b[i].y r = dx * dx + dy * dy // тут R^2 a = G * b[j].m / r r = sqrt(r) // тут R ax = a * dx / r // a * cos ay = a * dy / r // a * sin b[i].dx += ax * dt b[i].dy += ay * dt } } for el : b { el.x += el.dx * dt el.y += el.dy * dt } } def touch(e) { if (e.action == Action.DOWN) { a = ball(e.x, e.y) a.color = rand(#ffffffac) a.dx = rand(-5, 5) a.dy = rand(-5, 5) a.m = rand(1, 7) a.r += a.m buffer += a } }