Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Какое действие является ошибочным в сценарии?

Илья Горбачев Знаток (330), на голосовании 4 месяца назад
Написал небольшой сценарий на языке си, в первом выводе он сообщает правильные координаты игрока, а во втором - значение сбивается. В чем может заключаться ошибка?

Сам сценарий:
 #include  
#include
#include
#include

typedef struct {
float x, y;
int width, height, ix, iy;
} Object;

char map[25][81];
Object player;

void init_map()
{
for (int i = 0; i < 25; i++)
{
strncpy(map[i], " \0", 81);
}
}

void render_map()
{
for (int i = 0; i < 25; i++)
{
printf("%s", map[i]);
}
}

void init_object(Object *obj, float xpos, float ypos, float width, float height)
{
(*obj).width = width;
(*obj).height = height;
(*obj).ix = (int)round( (*obj).x );
(*obj).iy = (int)round( (*obj).y );

printf("%g %g\n", xpos, ypos);
set_object_pos(obj, xpos, ypos);

for (int i = 0; i < (*obj).height; i++)
{
for (int j = 0; j < (*obj).width; j++)
{
map[ (*obj).iy + i ][ (*obj).ix + j ] = '@';
}
}
}

void set_object_pos(Object *obj, float xpos, float ypos)
{
printf("%g %g\n", xpos, ypos);
(*obj).x = xpos;
(*obj).y = ypos;
}

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

int main()
{
init_map();
init_object(&player, 39, 3, 3, 3);
render_map();

return 0;
}
Дополнен 5 месяцев назад
Вывод:
1) 39; 3
2) 0; 3,000...
Дополнен 5 месяцев назад
Измененный сценарий:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

typedef struct {
float x, y;
int width, height, ix, iy;
} Object;

char map[25][81];
Object player;

void init_map()
{
for (int i = 0; i < 25; i++)
{
strncpy(map[i], " \0", 81);
}
}

void render_map()
{
setcur(0, 0);
for (int i = 0; i < 25; i++)
{
printf("%s", map[i]);
}
}

void init_object(Object *obj, float xpos, float ypos, float width, float height)
{
printf("%g %g\n", xpos, ypos);
set_object_pos(obj, xpos, ypos);

(*obj).width = width;
(*obj).height = height;
(*obj).ix = (int)round( (*obj).x );
(*obj).iy = (int)round( (*obj).y );

for (int i = 0; i < (*obj).height; i++)
{
for (int j = 0; j < (*obj).width; j++)
{
map[ (*obj).iy + i ][ (*obj).ix + j ] = '@';
}
}
}

void set_object_pos(Object *obj, float xpos, float ypos)
{
printf("%g %g", xpos, ypos);
(*obj).x = xpos;
(*obj).y = ypos;
}

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

int main()
{
init_map();
init_object(&player, 39, 3, 3, 3);
render_map();

return 0;
}
Голосование за лучший ответ
Эмиль БИИИБ Ученик (245) 5 месяцев назад
Сценарий для видео? КЕК
Илья ГорбачевЗнаток (330) 5 месяцев назад
Сценарий выполнения программы
Maniac Оракул (55907) 5 месяцев назад
Во-первых, при перемещении объекта map не обновляется.
Во-вторых , не вижу второго вывода в приведённой программе.
Вместо round советую использовать lround, потому как если при записи в float значения 2 запишется 1.999998, то round вернёт 1.999998, а (int)(1.999998) вернёт 1
Илья ГорбачевЗнаток (330) 5 месяцев назад
первый вывод - в функции init_object()
второй - в функции set_object_pos()
Maniac Оракул (55907) Илья Горбачев, Теперь нормально. Ещё нужен forward declaration для функции void set_object_pos(Object *obj, float xpos, float ypos) вставив void set_object_pos(Object *obj, float xpos, float ypos) ; перед void init_map() вместо strncpy(map[i], ".... \0", 81); можно использовать memset(map[i], ' ', 80); map[i][80] = 0; Ну и конструкции вида (*obj).width правильнее заменить на obj->width Хотя разница только визуальная, результат не изменится
Похожие вопросы