Является ли медленно работающим данный код? - Вопросы по CMS

Вопрос Является ли медленно работающим данный код?

Регистрация
18 Июл 2013
Сообщения
84
Репутация
0
Спасибо
0
Монет
0
Ниже представлен код: #include

#include

#include



typedef struct {

int x, y, width;

} Object;



char a[25][66];

Object pl, bl;



void init(char b) { //0 = location; 1 = platform; 2 = ball;

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) {

a[k] = '#';

}

else if (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 (GetKeyState('A') < 0) {

clear(1);

pl.x--;

}

if (GetKeyState('D') < 0) {

clear(1);

pl.x++;

}



//not_draw

init(1);

init(2);

}



void draw() {

for (int i = 0; i < 25; i++) {

if (i == 24) {

printf("%s", a);

}

else {

printf("%s\n", a);

}

}

}



void setcur(int x, int y) {

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}



int main() {

pl.width = 7;

pl.y = 24;

pl.x = (65 - pl.width) / 2;



bl.width = 1;

bl.y = 25 / 2;

bl.x = 65 / 2;



init(0);

init(1);

init(2);

do {

setcur(0, 0);

manage();

draw();

}

while (GetKeyState(VK_ESCAPE) >= 0);

} Когда я запускаю приложение, у меня выдается максимум 10 операций в секунду. Связано ли это с оформлением самого сценария?
 
Регистрация
10 Ноя 2013
Сообщения
71
Репутация
0
Спасибо
0
Монет
0
Твой код не рабочий. Вот рабочий, где скорость ракетки можно регулировать:

#include
#include
#include

#define WIDTH 66
#define HEIGHT 25
#define PADDLE_WIDTH 7
#define BALL_CHAR 'c'
#define WALL_CHAR '#'
#define PADDLE_CHAR '='
#define EMPTY_CHAR ' '
#define PADDLE_SPEED 2 // Увеличение скорости движения ракетки
#define BALL_SPEED_X 1
#define BALL_SPEED_Y 1

typedef struct {
int x, y, width;
} Object;

char screen[HEIGHT][WIDTH];
Object paddle, ball;
int ball_dx = BALL_SPEED_X;
int ball_dy = BALL_SPEED_Y;

void init_screen() {
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH - 1; j++) {
screen[j] = (i == 0 || j == 0 || j == WIDTH - 2 || i == HEIGHT - 1) ? WALL_CHAR : EMPTY_CHAR;
}
screen[WIDTH - 1] = '\0';
}
}

void draw_object(Object obj, char symbol) {
for (int i = 0; i < obj.width; i++) {
screen[obj.y][obj.x + i] = symbol;
}
}

void clear_object(Object obj) {
draw_object(obj, EMPTY_CHAR);
}

void update_paddle_position() {
if (GetAsyncKeyState('A') & 0x8000) {
clear_object(paddle);
if (paddle.x > 1)
paddle.x -= PADDLE_SPEED;
}
if (GetAsyncKeyState('D') & 0x8000) {
clear_object(paddle);
if (paddle.x + paddle.width < WIDTH - 2)
paddle.x += PADDLE_SPEED;
}
draw_object(paddle, PADDLE_CHAR);
}


void update_ball_position() {
clear_object(ball);
ball.x += ball_dx;
ball.y += ball_dy;

// Обработка столкновения с левой и правой стенами
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);
}
}

void set_cursor_position(int x, int y) {
COORD coord = {(SHORT)x, (SHORT)y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

int main() {
paddle = (Object){(WIDTH - PADDLE_WIDTH) / 2, HEIGHT - 2, PADDLE_WIDTH}; // Поднимаем ракетку на одну строку
ball = (Object){WIDTH / 2, HEIGHT / 2, 1};

init_screen();
draw_object(paddle, PADDLE_CHAR);
draw_object(ball, BALL_CHAR);

while (!(GetAsyncKeyState(VK_ESCAPE) & 0x8000)) {
set_cursor_position(0, 0);
update_paddle_position();
update_ball_position();
render_screen();
Sleep(50);
}

return 0;
}


Клавиши управления A , D
 
Регистрация
28 Авг 2013
Сообщения
107
Репутация
0
Спасибо
0
Монет
0
Самая мякотка тут - тройной вложенный цикл, но он выполняется 107250 раз независимо ни от чего, что для современной машины - плюнуть и растереть. Безусловно, это счастье можно было бы оптимизировать, но в современном мире - незачем.
 
Регистрация
2 Дек 2013
Сообщения
77
Репутация
0
Спасибо
0
Монет
0
Да, данный код может работать медленно из-за некоторых особенностей его реализации.
И предлагаю улучшенный код тебе чтобы не было замедлений #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);
}
}
}

void setcur(int x, int y) {
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

int main() {
pl.width = 7;
pl.y = 24;
pl.x = (65 - pl.width) / 2;

bl.width = 1;
bl.y = 25 / 2;
bl.x = 65 / 2;

init(0);
init(1);
init(2);
do {
setcur(0, 0);
manage();
draw();
Sleep(50); // Обновление экрана 20 раз в секунду
} while (!(GetAsyncKeyState(VK_ESCAPE) & 0x8000));
}
 
Регистрация
2 Дек 2013
Сообщения
86
Репутация
0
Спасибо
0
Монет
0
Отрисовка в консоль самое медленное звено в этом коде. Вместо отрисовки всего поля каждый раз достаточно при инициализации отрисовать поле мяч и платформу одиножды. А отрисовка движения мяча и платформы займет всего лишь 4 символа за &#34;тик&#34;: нарисовать новое положение мяча, зарисовать старое пробелом, нарисовать часть платформы слева/справа и зарисовать пробелом с противоположной стороны. Для этих манипуляций как раз и нужна функция setcur и putchar.
Что до работоспособности вообще - не вижу блока физики мяча)
 
Сверху Снизу