Просмотр полной версии : [Вопрос] Сортировка двумерного массива
Иван Бубнов
15.02.2017, 11:41
Привет.
Допустим есть двумерный массив:
#define MAX_ATM 20
enum aInfo
{
aID,
Float:aPos_x,
Float:aPos_y,
Float:aPos_z
};
new BankInfo[MAX_ATM][aInfo];
Теперь нужно узнать самый ближайший банкомат к игроку. Координаты банкомата загружается в отдельном паблике, и хранится через MySQL плагин от BlueG (мб через запрос сортировать? Но затратно).
Попробовал использовать Bubble Sort (http://pro-pawn.ru/showthread.php?6836-s-%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B-%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8), не помогло
и хранится через MySQL плагин от BlueG (мб через запрос сортировать? Но затратно).
ВАТ? Сортировка в sql запросе работает на порядок быстрее чем ты будешь прогонять массивы. Только зачем тебе это? есть же функция которая проверяет расстояние между координатами, используй его прогоняя массив с банкоматами и будет тебе счастье
Иван Бубнов
15.02.2017, 12:11
ВАТ? Сортировка в sql запросе работает на порядок быстрее чем ты будешь прогонять массивы. Только зачем тебе это? есть же функция которая проверяет расстояние между координатами, используй его прогоняя массив с банкоматами и будет тебе счастье
Название функции? Будет не фи, если игрок пофлудит с запросами
$continue$
15.02.2017, 15:31
Сортировка в MySQL реализована на каком нибудь x языке - оно работает быстрей, чем написанное на Pawn, но тут проблема в другом, что на счет пинга?
ВАТ? Сортировка в sql запросе работает на порядок быстрее чем ты будешь прогонять массивы. Только зачем тебе это? есть же функция которая проверяет расстояние между координатами, используй его прогоняя массив с банкоматами и будет тебе счастье
vovandolg
15.02.2017, 15:33
зачем ты запросами флудишь?
вызвал разок в начале, записал все координаты в массиве и прогнал циклом все банкоматы.
Сортировка в MySQL реализована на каком нибудь x языке - оно работает быстрей, чем написанное на Pawn, но тут проблема в другом, что на счет пинга?
используем для сортировки SQLite - profit. Пинг - 0.
Иван Бубнов
15.02.2017, 16:35
зачем ты запросами флудишь?
вызвал разок в начале, записал все координаты в массиве и прогнал циклом все банкоматы.
Потому что GetPlayerPos всегда выдает разные значения, то есть игроку достаточно ввести пару раз какую нибудь команду для поиска ближайшего банкомата, и сервер упадет (наверно)
Потому что GetPlayerPos всегда выдает разные значения, то есть игроку достаточно ввести пару раз какую нибудь команду для поиска ближайшего банкомата, и сервер упадет (наверно)
На дворе 21 век. Хватит держать сервера на калькуляторах.
Да и для кого антифлуд придумали? 3 строки прописать сложно?
vovandolg
15.02.2017, 20:49
Потому что GetPlayerPos всегда выдает разные значения, то есть игроку достаточно ввести пару раз какую нибудь команду для поиска ближайшего банкомата, и сервер упадет (наверно)
При чём тут GetPlayerPos если ты спросил про запросы мускула))
Теперь нужно узнать самый ближайший банкомат к игроку. Координаты банкомата загружается в отдельном паблике, и хранится через MySQL плагин от BlueG (мб через запрос сортировать? Но затратно).
Я и ответил что сразу выгрузи с базы все данные и потом уже делай проверки всякие на то какой банкомат рядом и стоят ли они вообще рядом))
Вот как на моем сервере это реализовано (+250 онлайн), и все прекрасно работает!
case ...:
{
new min_id;
new Float:min_distance = 99999.0;
for(new b; b <= TOTAL_BUSINESS; b++) // Мой цикл на бизнесы
{
new Float:distance = GetPlayerDistanceFromPoint(playerid, BusinessInfo[b][bEnterX], BusinessInfo[b][bEnterY], BusinessInfo[b][bEnterZ]);
if (distance < min_distance)
{
min_distance = distance;
min_id = b;
}
}
SetPlayerCheckpoint(playerid, BusinessInfo[min_id][bEnterX], BusinessInfo[min_id][bEnterY], BusinessInfo[min_id][bEnterZ], 6.0);
new string[112];
format(string, sizeof(string), "На карте отмечен ближайший бизнес - {FF9900}%s{FFFFFF}. Расстояние {FF9900}%0.2f м.", BusinessInfo[min_id][bName], min_distance);
SendClientMessage(playerid, -1, string);
return true;
}
vovandolg
15.02.2017, 21:24
Вот как на моем сервере это реализовано (+250 онлайн), и все прекрасно работает!
case ...:
{
new min_id;
new Float:min_distance = 99999.0;
for(new b; b <= TOTAL_BUSINESS; b++) // Мой цикл на бизнесы
{
new Float:distance = GetPlayerDistanceFromPoint(playerid, BusinessInfo[b][bEnterX], BusinessInfo[b][bEnterY], BusinessInfo[b][bEnterZ]);
if (distance < min_distance)
{
min_distance = distance;
min_id = b;
}
}
SetPlayerCheckpoint(playerid, BusinessInfo[min_id][bEnterX], BusinessInfo[min_id][bEnterY], BusinessInfo[min_id][bEnterZ], 6.0);
new string[112];
format(string, sizeof(string), "На карте отмечен ближайший бизнес - {FF9900}%s{FFFFFF}. Расстояние {FF9900}%0.2f м.", BusinessInfo[min_id][bName], min_distance);
SendClientMessage(playerid, -1, string);
return true;
}
Честно сказать можно было и по легче код сделать))
Целый вызов не нужного мусора))
даже РЛСницы лучше написаны по этой части кода:rofl:
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot