// Обработка столкновения с левой и правой стенами
if (ball.x = WIDTH - 2) ball_dx = -ball_dx;
// Обработка столкновения с верхней и нижней границами
if (ball.y = HEIGHT - 1) ball_dy = -ball_dy;
// Обработка столкновения с ракеткой
if (ball.y == paddle.y - 1 && ball.x >= paddle.x && ball.x < paddle.x + paddle.width) {
ball_dy = -ball_dy; // Если мяч отскочил от ракетки, движение вверх
}
draw_object(ball, BALL_CHAR);
}
void render_screen() {
for (int i = 0; i < HEIGHT; i++) {
printf("%s\n", screen);
}
}
Самая мякотка тут - тройной вложенный цикл, но он выполняется 107250 раз независимо ни от чего, что для современной машины - плюнуть и растереть. Безусловно, это счастье можно было бы оптимизировать, но в современном мире - незачем.
Да, данный код может работать медленно из-за некоторых особенностей его реализации.
И предлагаю улучшенный код тебе чтобы не было замедлений #include
#include
#include
typedef struct {
int x, y, width;
} Object;
char a[25][66];
Object pl, bl;
void init(char b) {
if (b == 0) {
for (int i = 0; i < 65; i++) {
a[0] = '#';
}
a[0][65] = '\0';
for (int i = 1; i < 25; i++) {
for (int k = 0; k < 66; k++) {
if (k == 0 || k == 64) {
a[k] = '#';
} else if (k == 65) {
a[k] = '\0';
} else {
a[k] = ' ';
}
}
}
}
if (b == 1) {
for (int i = 0; i < 7; i++) {
a[24][pl.x + i] = '=';
}
}
if (b == 2) a[bl.y][bl.x] = 'c';
}
void clear(char b) {
if (b == 1) {
for (int i = 0; i < 7; i++) {
a[24][pl.x + i] = ' ';
}
}
if (b == 2) {
a[bl.y][bl.x] = ' ';
}
}
void manage() {
if (GetAsyncKeyState('A') & 0x8000) {
clear(1);
pl.x--;
}
if (GetAsyncKeyState('D') & 0x8000) {
clear(1);
pl.x++;
}
init(1);
init(2);
}
void draw() {
for (int i = 0; i < 25; i++) {
if (i == 24) {
printf("%s", a);
} else {
printf("%s\n", a);
}
}
}
Отрисовка в консоль самое медленное звено в этом коде. Вместо отрисовки всего поля каждый раз достаточно при инициализации отрисовать поле мяч и платформу одиножды. А отрисовка движения мяча и платформы займет всего лишь 4 символа за "тик": нарисовать новое положение мяча, зарисовать старое пробелом, нарисовать часть платформы слева/справа и зарисовать пробелом с противоположной стороны. Для этих манипуляций как раз и нужна функция setcur и putchar.
Что до работоспособности вообще - не вижу блока физики мяча)