В общем такого характера проблемка. Все условно, не важно что это будет - юнит, integer, real, то есть от этого можно целиком абстрагироваться. Суть такая - есть 3 (4.5.6.7.8) условных боевых единиц и у каждой есть копия. Нужно чтобы копии пошли атаковать основных героев, но так, чтобы условная копия под номером 6 не пошла атаковать основного героя под номером 6 ни в коем случае. Для примера попытался изобразить на картинке.
У кого какие мысли?

Принятый ответ

respect_gg, можно вобще вот так
  1. записываем в массив номера от 0 до N, где N это число игроков минус один, в ячейки с соответствующими номерами
  2. проходим циклом от N до 0, пусть номер итерации будет i
  3. на каждой итерации получаем случайное число R от 0 до N, Если оно совпало с i, то берем R= i+1 или R=i-1, с учетом границ
  4. меняем местами ячейки R и i
  5. если в ячейку i в результате обмена опять попало число с номером этой ячейки, делаем еще один случайный обмен (тут можно не делать дополнительную проверку на коллизию т.к. коллизия не может на этом этапе возникнуть повторно для этой ячейки)
Если я ничего не напутал - получаем на выходе массив чисел в котором числа не повторяются и не находятся в ячейках совпадающих со своим номером.
Использовать это потом - номер ячейки это один игрок, число в ячейке - другой.
Если нужен учет того что игроки могут иметь номера не идущие подряд (ливеры, компьютеры, просто игроки не использующиеся в этой системе) - нам понадобится дополнительный массив с номерами игроков, чтобы превратить номер ячейки и число в ячейке в реальный номер игрока.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
15
4 года назад
0
Создаём 2 группы, одна для верхней линии героев, вторая для нижней. Заносим в группы каждой линии противоположный список героев, как цели потенциальной атаки. Проверяем условия для каждого юнита и работам с его группой. Выбрать случайного героя противоположной группы, если тип юнита = типу проверяемого юнита, повторяем действие. Нашли не похожего юнита, теперь это его цель атаки. Удалили найденную цель атаки из группы. Повторяем алгоритм для всех героев.
0
26
4 года назад
Отредактирован Lord_Teo
0
respect_gg:
Я то же думал сначала, что будет просто.
Только ты не учел одного но - Кель пошел атаковать Архимага, а Архимаг Келя. А Горный король стоит и не понимает че ему делать, ведь выставлено условие - свою же копию атаковать нельзя
Не понимаю тебя. Почему он будет стоять? Проверь сам. Триггер небольшой, чтобы его повторить. Он будет атаковать случайного юнита из группы. Это ты уже позже в комментариях написал про 1 на 1. В начальном вопросе такого не было.
0
24
4 года назад
0
DarkLigthing, Lord_Teo, вы оба не учитываете коллизию, которая может возникнуть, если последние двое оставшихся будут одного и того же типа, что нарушает условие согласно которому копии не должны атаковать оригинал.
0
26
4 года назад
0
prog:
DarkLigthing, Lord_Teo, вы оба не учитываете коллизию, которая может возникнуть, если последние двое оставшихся будут одного и того же типа, что нарушает условие согласно которому копии не должны атаковать оригинал.
Какая коллизия, вы че?! Там действие: атаковать случайного! Просто будут несколько героев атаковать одного.
0
24
4 года назад
0
Lord_Teo, это в любом случае не решает поставленную автором вопроса задачу.
0
11
4 года назад
0
Lord_Teo:
prog:
DarkLigthing, Lord_Teo, вы оба не учитываете коллизию, которая может возникнуть, если последние двое оставшихся будут одного и того же типа, что нарушает условие согласно которому копии не должны атаковать оригинал.
Какая коллизия, вы че?! Там действие: атаковать случайного! Просто будут несколько героев атаковать одного.
В этом и проблема, чувак :) Должно быть примерно так же, как на картинке. Юниты были изображены лишь для простоты объяснения проблемы. В целом работа идет с ID игроков
0
26
4 года назад
0
prog:
Lord_Teo, это в любом случае не решает поставленную автором вопроса задачу.
Если быть внимательнее, то про 1 на 1 было только в комментарии. В первом вопросе такого условия не было

respect_gg:
В этом и проблема, чувак :) Должно быть примерно так же, как на картинке. Юниты были изображены лишь для простоты объяснения проблемы. В целом работа идет с ID игроков
Ну, надо было яснее выражаться сразу) Тогда я сдаюсь)))
0
11
4 года назад
0
Lord_Teo:
prog:
Lord_Teo, это в любом случае не решает поставленную автором вопроса задачу.
Если быть внимательнее, то про 1 на 1 было только в комментарии. В первом вопросе такого условия не было

respect_gg:
В этом и проблема, чувак :) Должно быть примерно так же, как на картинке. Юниты были изображены лишь для простоты объяснения проблемы. В целом работа идет с ID игроков
Ну, надо было яснее выражаться сразу) Тогда я сдаюсь)))
Я на картинке примерно это отобразил (стрелочками) и примерно описал "Нужно чтобы копии пошли атаковать основных героев, но так, чтобы условная копия под номером 6 не пошла атаковать основного героя под номером 6 ни в коем случае."
0
26
4 года назад
0
respect_gg:
Я на картинке примерно это отобразил (стрелочками) и примерно описал "Нужно чтобы копии пошли атаковать основных героев, но так, чтобы условная копия под номером 6 не пошла атаковать основного героя под номером 6 ни в коем случае."
Ну, так как раз это условие выполняется)) в моем триггере основа не будет атаковать свою копию ни в коем случае)
0
18
4 года назад
Отредактирован Vlod
0
respect_gg:
В этом и смысл. Грубо говоря они должны драться 1х1, но так, чтобы условный Горный король не стал жертвой своей же копии (то бишь другого Горного короля)
Понятно, тогда в два этапа:
  1. Два массива длиной N - количество одинаковых пар. Идем циклом изымая пары до тех пор, пока общее количество свободных юнитов не станет 4.
  2. Далее нужно проверить, нет ли одинаковых. Если есть, тo выбираем их. Иначе просто продолжаем.
photo
Загруженные файлы
1
24
4 года назад
1
Понятно, тогда в два этапа:
Можно даже проще - просто ресолвить ситуацию когда в конце осталось два одинаковых, если она возникла, через обмен с другой случайной парой.

А если коллизия не возникла - то ничего и не делать.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.