В общем такого характера проблемка. Все условно, не важно что это будет - юнит, 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
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
Понятно, тогда в два этапа:
Можно даже проще - просто ресолвить ситуацию когда в конце осталось два одинаковых, если она возникла, через обмен с другой случайной парой.

А если коллизия не возникла - то ничего и не делать.
0
18
4 года назад
0
Согласен с prog, проще сравнить только последнюю пару и поменять в случае совпадения
0
11
4 года назад
0
Vlod:
Согласен с prog, проще сравнить только последнюю пару и поменять в случае совпадения
Все делается не в пределах одного вызова функции, а через цикл. А перебираются id игроков (GetPlayerId). Возможно с юнитами было бы и проще. Но тут вроде все нормально, а потом бац, минуя все условия - и 1 игрок остается без пары
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.