AdryV |
Отправлено: 13 Декабря, 2017 - 13:04:46
|
Специалист
Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016
Репутация: 11
|
Kibor пишет: Сначала пройтись по массиву sort, потом если нужен ближний берем координаты с массива с индексом 0, если дальнего с последним индексом.
вот с сортировкой будет проблема....
у меня около 5 разных массивов зависят от очередности
как то так
mob_kordX[15];
mob_kordY[15];
mob_kordZ[15];
mob_dist[15];
mob_xp[15];
mob_adres[15];
mob_id[15];
все они поочередно записываются с памяти игры
если я отсортирую массив mob_dist, то в итоге будет не совпадение номера массива с остальными массивами....
Kibor пишет: А расстояние узнать - корень суммы квадратов катетов.
спасибо оказывается ничего сложного)))
CODE:double X=355108.875;
double Y=18228.2207;
double Z=179779.125;
double X1=354697.6562;
double Y1=18265.28516;
double Z1=180078.6875;
double X2=356206.7812;
double Y2=18145.33008;
double Z2=178735.7969;
double t;
double t1;
loop()
{
t=sqrt((X-X1)*(X-X1)+(Y-Y1)*(Y-Y1)+(Z-Z1)*(Z-Z1));
t1=sqrt((X-X2)*(X-X2)+(Y-Y2)*(Y-Y2)+(Z-Z2)*(Z-Z2));
textout(0, 20, 20, format(t), 1);
textout(1, 20, 40, format(t1), 1);
sleep(1000);
}
кажись правильно считает) |
|
|
AdryV |
Отправлено: 13 Декабря, 2017 - 15:21:08
|
Специалист
Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016
Репутация: 11
|
Zireael пишет: Записать всё в двухмерный массив и его сортировать.
а можно пример а то чет я сколько не пытаюсь сортировать двумерный массив не получается...
и все равно я не понимаю как оно будет перемещать массив?
к примеру:
mass[0][0]=1000;//расстояние привязано к определенному мобу в массиве mass[1][0]
mass[0][1]=1500;//расстояние привязано к определенному мобу в массиве mass[1][1]
mass[0][2]=100;//расстояние привязано к определенному мобу в массиве mass[1][2]
mass[0][3]=2000;//расстояние привязано к определенному мобу в массиве mass[1][3]
mass[1][0]=4567433;//адрес по которому находится моб mass[0][0]
mass[1][1]=4566433;//адрес по которому находится моб mass[0][1]
mass[1][2]=4568433;//адрес по которому находится моб mass[0][2]
mass[1][3]=4597433;//адрес по которому находится моб mass[0][3]
допустим оно отсортирует хотя у меня не получалось сортировать 2-е массивы
разве оно будет сразу перемещать 2 массива?
mass[0][0] и mass[1][0]
(Добавление)
pashahous пишет: т.е. ты пробегаешся по массиву координат, расчитывая расстояния и сравнивая с последним расстоянием, если оно меньше, то перезаписываешь на новое посл расстояние, и так же перезаписываешь адрес хп айди последнего моба.
смысл понял спасибо буду пробовать |
|
|
Zireael |
Отправлено: 13 Декабря, 2017 - 15:30:30
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Особо не тестил. Если не накосячил, то должно работать.
сортировка двумерного массива (Отобразить)CODE:// сортировка двумерного массива
int a[3][4]; // массив 3*4
int size_arrX=3, size_arrY=4; // размеры массива
a[0][0]=7; a[0][1]=4; a[0][2]=3; a[0][3]=4; // 7 4 3 4
a[1][0]=6; a[1][1]=1; a[1][2]=9; a[1][3]=7; // 6 1 9 7
a[2][0]=8; a[2][1]=5; a[2][2]=4; a[2][3]=2; // 8 5 4 2
sort_array(#a[0][0]); // передаём указатель на массив
///////// вывод массива в textout (можно убрать)
string tmp;
int textoutY=500;
for (int i=0; i<size_arrX; i++)
{
tmp="";
for (int j=0; j<size_arrY; j++)
{
tmp=tmp+format(a[i][j])+" ";
}
textbkcolor(16777215, 255);
textout(i, 500, textoutY, tmp, 1);
textoutY=textoutY+20;
}
loop()
{
sleep(100);
}
/////////////
function sort_array(int #m)
{
int min, imin, z;
for(int i=0; i<size_arrX; i++)
{
min=m[i][0]; imin=i;
for(int j=i+1; j<size_arrX; j++)
{
if(m[j][0] < m[i][0]) // сортирует по первому столбцу (исправить на нужный)
{
min=m[j][0];imin = j; // тоже индекс исправить, если не по первому сортировать
}
}
for(int k=0; k<size_arrY; k++)
{
z=m[i][k];
m[i][k]=m[imin][k];
m[imin][k]=z;
}
}
} (Отредактировано автором: 13 Декабря, 2017 - 15:34:37) |
|
|
pashahous |
Отправлено: 13 Декабря, 2017 - 15:52:18
|
Прохожий
Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2016
Репутация: 2
|
Kibor пишет: Функция имеет две вариации.
Назначение второй вариации функции сортировка элементов в двух массивах координат X Y по расстоянию от указанных в функции координат.
CODE:sort(300, 200, #x[0], #y[0], 20);
Первый и второй параметры координаты XY относительно которых будет сортировка массивов координат по расстоянию.
Третий и четвертый указатели на массивы координат XY мобов (объектов).
Пятый число элементов в массивах начиная с первого которые будут участвовать в сортировке.
Короче отсортирует от ближних к дальним одной строчкой.
Команда sort отсортирует координаты, а массив с адрессами структур мобов он то не тронет, и массив координат не будет соответствовать массиву адрессов, для дальнейшей работы.
Ему то нужно что бы массив координат соответствовал массиву адрессов структуры моба
AdryV пишет: смысл понял спасибо буду пробовать Так же ты можешь добавить проверку условия типа:
Минимальное_расстояние_моба = 5;
Если минимальное_расстояние_моба<=5 то выйти ( ну и функция боя).
После поиска всех мобов в памяти, в твоем массиве первым может быть ближайший моб, и после расчета и проверки расстояния , если это так, не надо продолжать искать ближайшего моба, т.к. ты его уже нашел.(Отредактировано автором: 13 Декабря, 2017 - 15:53:15) |
|
|
Kibor |
Отправлено: 13 Декабря, 2017 - 23:53:39
|
Эксперт
Просматривает форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
pashahous пишет: и массив координат не будет соответствовать массиву адрессов
Пузырьковая сортировка. Что угодно можно добавить в сортировку.
CODE:int k=20;// количество объектов
double X, Y;//координаты сортировать относительно которых
double Xm[20]; Ym[20];//координаты мобов
int adr[20];//адреса мобов
double RaST_X, RaST_Y, ALL_RaST, ALL_RaST1;
double tmpK;
int tmpA;
for(int n=0; n<k; n++)
{
for(int n1=k-1; n1>n; n1--)
{
RaST_X=Xm[n1-1]-X; RaST_Y=Ym[n1-1]-Y; ALL_RaST=(RaST_X*RaST_X)+(RaST_Y*RaST_Y);
RaST_X=Xm[n1]-X; RaST_Y=Ym[n1]-Y; ALL_RaST1=(RaST_X*RaST_X)+(RaST_Y*RaST_Y);
if (ALL_RaST>ALL_RaST1)
{
tmpK=Xm[n1-1];
Xm[n1-1]=Xm[n1];
Xm[n1]=tmpK;
tmpK=Ym[n1-1];
Ym[n1-1]=Ym[n1];
Ym[n1]=tmpK;
tmpA=adr[n1-1];//Тут переписываем адреса
adr[n1-1]=adr[n1];
adr[n1]=tmpA;
}
}
} |
|
|
|