Сообщений: 287
Тем: 24
Зарегистрирован: Feb 2010
Репутация:
919
В этих хрониках появилась такое нововведение ,как подбор противников по очкам. Т.е. если у игрока 1 очко то и попадется от с тем у кого 1 очко (ну или где-то рядом).
Подумал над этим вопросом, и прише к выводу, что можно реализовать вот так:
protected static final Participant[] createListOfParticipants(List<Integer> list)
{
if (list == null || list.isEmpty() || list.size() < 2)
return null;
int playerOneObjectId = 0;
L2PcInstance playerOne = null;
L2PcInstance playerTwo = null;
//first to sort the list
int buff[];
buff = new int[list.size()];
int i = 0;
while (i > 0)
{
buff[i] = Olympiad.getInstance().getNoblePoints(list.get(i));
i++;
}
Arrays.sort(buff);
i = 0;
while (i > 0)
{
//TODO convert points to objectsID
}
i = 0;
while (list.size() > 1)
{
playerOneObjectId = list.remove(i++);
playerOne = L2World.getInstance().getPlayer(playerOneObjectId);
if (playerOne == null || !playerOne.isOnline())
continue;
playerTwo = L2World.getInstance().getPlayer(list.remove(i++));
if (playerTwo == null || !playerTwo.isOnline())
{
list.add(playerOneObjectId);
continue;
}
Participant[] result = new Participant[2];
result[0] = new Participant(playerOne, 1);
result[1] = new Participant(playerTwo, 2);
return result;
}
return null;
}
Пока что из-за недостаточного знания не могу выполнить второй пункт, а именно, там где у меня написано TODO: нужно используя очки олимпиады перезаписать лист участник уже отсортированныйпо очкам, тогда выбирая два соседних элемента в списке мы будем получать близких по очкам игроков на одну арену.
Кстати ,надеюсь остальной код правильный, если нет хотелось бы услышать конструктивную критику...
P.S. l2j
Сообщений: 117
Тем: 22
Зарегистрирован: May 2011
Вход в мир High Five сам делал ?
Сообщений: 287
Тем: 24
Зарегистрирован: Feb 2010
Репутация:
919
Цитата:система Олимпиады стала абсолютно объективной - теперь соперниками будут ставиться персонажи с похожим количеством очков Олимпиады
https://forum.4game.ru/showthread.php?t=195267
Цитата:Вход в мир High Five сам делал ?
Не вполне понял о чем вы.
Сообщений: 3,967
Тем: 90
Зарегистрирован: Nov 2010
Репутация:
15,337
AmdAmdFtuk Написал:Не вполне понял о чем вы. Да чувак уже месяц бегает по разработчикам и просит помочь реализовать вход в мир (пакетный уровень сервера) по High Five. XD
Вашей сортировкой вы ничего не добьетесь, стоит использовать "Сортировку Компаратором", создать свой класс, основывающийся на интерфейсе компаратора.. гуглим в общем.
А вообще при подборе соперника можно найти минимальное значение очков, которое ему и подходит и на втором круге ближайшего игрока с нужным кол-во очков сделать соперником. :+25 Duals:
Но, возможно гуру предложат более изощренный способ. :_smile_:
Сообщений: 287
Тем: 24
Зарегистрирован: Feb 2010
Репутация:
919
Цитата:Да чувак уже месяц бегает по разработчикам и просит помочь реализовать вход в мир (пакетный уровень сервера) по High Five.
![Smile Smile](https://forum.zone-game.info/images/smilies/smile.png)
Однако, это всё оффтоп, хотелось бы по теме услшать чего-нибудь
Сообщений: 3,967
Тем: 90
Зарегистрирован: Nov 2010
Репутация:
15,337
AmdAmdFtuk Написал:![Smile Smile](https://forum.zone-game.info/images/smilies/smile.png)
Однако, это всё оффтоп, хотелось бы по теме услшать чего-нибудь ![Smile Smile](https://forum.zone-game.info/images/smilies/smile.png)
А я отписал ![Smile Smile](https://forum.zone-game.info/images/smilies/smile.png) , просто не успел дописать пост.
Сообщений: 287
Тем: 24
Зарегистрирован: Feb 2010
Репутация:
919
Цитата:А вообще при подборе соперника можно найти минимальное значение очков, которое ему и подходит и на втором круге ближайшего игрока с нужным кол-во очков сделать соперником.
Хм, тогда для каждого возможного значения очков, которое может проиграть игрок, а их 10, нужно будет изобретать способ нахождения подходящего кол-ва очков у оппонента, тем более ,что такого оппонента может не быть вовсе - допустим игрок с 20 очками а с ним в одном круге выступают 9 игроков 100-500 очков, тогда его не телепортнет, т.к. нет противника.
Но всё как я этот метод вижу ,сам с него начал ,но отодвинул его ,предпочитая отсортировать последовательность зарегистрированных по увеличению очков и не париться.
Цитата:Вашей сортировкой вы ничего не добьетесь, стоит использовать "Сортировку Компаратором", создать свой класс, основывающийся на интерфейсе компаратора.. гуглим в общем.
Сейчас посмотрим что за зверь такой "компаратор"
Сообщений: 450
Тем: 57
Зарегистрирован: Jan 2010
Репутация:
0
AmdAmdFtuk Написал:Хм, тогда для каждого возможного значения очков, которое может проиграть игрок, а их 10, нужно будет изобретать способ нахождения подходящего кол-ва очков у оппонента, тем более ,что такого оппонента может не быть вовсе - допустим игрок с 20 очками а с ним в одном круге выступают 9 игроков 100-500 очков, тогда его не телепортнет, т.к. нет противника. самых оптимальных методов сортировки придумано много лет назад и под разные случаи конечно да можно по изврашаться и сделать свой ну или готовые подобрать или чуть подправить, а по поводу нет соперника такого не будет так как осуществялеться методом наименьшего из всех ну или ближайщего те если у нас есть 3 игрока с очками 100 110 120 и один игрок с очками 10 то он попадет с игроком наиболее близким те с тем у кого 100 так в во всех случая даже если у тех 1000 а у него 1 да и кажеться минимальное колво очков для участия = 3 не зря же (хотя мб путаю ![Smile Smile](https://forum.zone-game.info/images/smilies/smile.png) )
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
есть вариант использования TreeMultimap из google collections.
На идеальность не претендую, написал с тем, что первое попалось) какие именно условия должны соблюдаться не в курсе, знаю только то, что написано в этой теме.
Код: public static final Comparator<Integer> KEY_COMPARATOR = new Comparator<Integer>()
{
@Override
public int compare(final Integer point1, final Integer point2)
{
if(point1 == null || point2 == null)
return 0;
return point1.compareTo(point2);
}
};
public static final Comparator<Integer> VALUE_COMPARATOR = new Comparator<Integer>()
{
@Override
public int compare(final Integer objId1, final Integer objId2)
{
return objId1.compareTo(objId2);
}
};
/**
* Список всех зарегистрированных, где ключ это количество очков.
*/
private static final TreeMultimap<Integer, Integer> registers = TreeMultimap.create(KEY_COMPARATOR, VALUE_COMPARATOR);
Вставить куда нить:
Пример
Код: registers.put(1, 101011);
registers.put(10, 101012);
registers.put(2, 101013);
registers.put(4, 101014);
registers.put(5, 101015);
registers.put(1, 101016);
registers.put(4, 101017);
registers.put(3, 101018);
registers.put(3, 101019);
registers.put(7, 101020);
registers.put(8, 101021);
registers.put(8, 101022);
registers.put(10, 101023);
registers.put(11, 101024);
registers.put(12, 101025);
registers.put(22, 101026);
registers.put(6, 101027);
registers.put(6, 101028);
System.out.println("all players: " + registers.toString());
SortedMap<Integer, Collection<Integer>> players = registers.asMap().subMap(1, 5);
System.out.println(" | ------- get points range from 1, inclusive, to 5, exclusive");
for(final Entry<Integer, Collection<Integer>> entry : players.entrySet())
System.out.println(" | - point: " + entry.getKey() + ", players: " + Arrays.toString(entry.getValue().toArray(new Integer[entry.getValue().size()])));
players = registers.asMap().subMap(5, 7);
System.out.println(" | ------- get points range from 5, inclusive, to 7, exclusive");
for(final Entry<Integer, Collection<Integer>> entry : players.entrySet())
System.out.println(" | - point: " + entry.getKey() + ", players: " + Arrays.toString(entry.getValue().toArray(new Integer[entry.getValue().size()])));
players = registers.asMap().subMap(7, 10);
System.out.println(" | ------- get points range from 7, inclusive, to 10, exclusive");
for(final Entry<Integer, Collection<Integer>> entry : players.entrySet())
System.out.println(" | - point: " + entry.getKey() + ", players: " + Arrays.toString(entry.getValue().toArray(new Integer[entry.getValue().size()])));
players = registers.asMap().subMap(10, 23);
System.out.println(" | ------- get points range from 10, inclusive, to 23, exclusive");
for(final Entry<Integer, Collection<Integer>> entry : players.entrySet())
System.out.println(" | - point: " + entry.getKey() + ", players: " + Arrays.toString(entry.getValue().toArray(new Integer[entry.getValue().size()])));
Результат
all players: {1=[101011, 101016], 2=[101013], 3=[101018, 101019], 4=[101014, 101017], 5=[101015], 6=[101027, 101028], 7=[101020], 8=[101021, 101022], 10=[101012, 101023], 11=[101024], 12=[101025], 22=[101026]}
| ------- get points range from 1, inclusive, to 5, exclusive
| - point: 1, players: [101011, 101016]
| - point: 2, players: [101013]
| - point: 3, players: [101018, 101019]
| - point: 4, players: [101014, 101017]
| ------- get points range from 5, inclusive, to 7, exclusive
| - point: 5, players: [101015]
| - point: 6, players: [101027, 101028]
| ------- get points range from 7, inclusive, to 10, exclusive
| - point: 7, players: [101020]
| - point: 8, players: [101021, 101022]
| ------- get points range from 10, inclusive, to 23, exclusive
| - point: 10, players: [101012, 101023]
| - point: 11, players: [101024]
| - point: 12, players: [101025]
| - point: 22, players: [101026]
P.S.
objId от балды.
оффтом
Хотя наверно тут нужно знать в каком диапазоне выбираются участники. И есть ли он вообще или может там совсем по другому сделано
Сообщений: 3,491
Тем: 52
Зарегистрирован: Jun 2010
Репутация:
12,167
08-17-2011, 09:51 AM
(Сообщение последний раз редактировалось: 08-17-2011, 10:30 AM Deazer.)
![Big Grin Big Grin](https://forum.zone-game.info/images/smilies/biggrin.png) и все же никто не понял как рассчитывает разрыв XD
Кто обоснует этот скрин , так уж и быть , обосную прогульщикам уроков истории в школе как идет расчет.
На тот момент было 280 зарегистрировавшихся.
|