Добрый день!
Совсем недавно начал изучать редактор и столкнулся трудностью в реализации следующей задачи:
Есть 4 игрока и 4 расы.
При инициализации карты каждый игрок должен получить одну из этих 4х расс и построить главное здание этой рассы в центре своего региона.
Рассы не должны повторяться.
Реализовать пытался на GUI через рандомное число от 1 до 4.
А чтобы исключить повторы я ввёл проверку по наличию здания на карте.
К примеру игрок 1 зарандомил эльфов и построил древо жизни.
Игрок 2 тоже зарандомил эльфов но т.к. древо жизни уже есть на карте, то рандом +1 и повторная проверка.
В общем иногда всё даже работает как нужно, но чаще всего возникают такие ошибки:
  1. 1 игрок может получить сразу несколько расс.
  2. Может заспавниться всего 2 или 3 здания, а остальные игроки остаются без них.
  3. Могут заспавниться все здания но принадлежать они будут одному игроку.
и т.д.
Заранее извиняюсь, что объясняю своими словами и не шарю в терминах.

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

МассивРас - массив рас.
ВерхРас - целочисленная, означающая самую последнюю занятую ячейку в МассивРас. Изначально 4.
РасаИгрока - массив расы игрока, id игрока есть номер ячейки.
Для А = 1 до 4 делать
    Число = Случайное число от 1 до ВерхРас
    РасаИгрока[A] = МассивРас[Число]

    Если МассивРас[Число] не равно МассивРас[ВерхРас], то
        МассивРас[Число] = МассивРас[ВерхРас]
    ВерхРас = ВерхРас - 1
Если у игроков id не 1, 2, 3 и 4, то нужно добавить массив IdИгрока, где в ячейках 1, 2, 3 и 4 будут записаны настоящие id игроков.
Для А = 1 до 4 делать
    Число = Случайное число от 1 до ВерхРас
    РасаИгрока[IdИгрока[A]] = МассивРас[Число]

    Если МассивРас[Число] не равно МассивРас[ВерхРас], то
        МассивРас[Число] = МассивРас[ВерхРас]
    ВерхРас = ВерхРас - 1
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
26
4 года назад
Отредактирован 8gabriel8
2
Создаёшь группу игроков из своих четырёх. Далее определяешь каждой расе своего игрока, например, для расы эльфов выбираешь случайного игрока из группы, удаляешь его из группы и создаёшь ему соответствующее здание в его позиции. Потом повторяешь это для остальных трёх рас. Понадобятся переменные для группы игроков и для запоминания случайного игрока.
0
1
4 года назад
0
8gabriel8:
Создаёшь группу игроков из своих четырёх. Далее определяешь каждой расе своего игрока, например, для расы эльфов выбираешь случайного игрока из группы, удаляешь его из группы и создаёшь ему соответствующее здание в его позиции. Потом повторяешь это для остальных трёх рас. Понадобятся переменные для группы игроков и для запоминания случайного игрока.
Мне очень понравился ваш метод, единственная проблема в том, что я не совсем понял как запомнить рандомного игрока.
Я сделал вот таким образом, а дальше не понимаю.
Загруженные файлы
0
12
4 года назад
0
Вот тебе костыльный вариант.
Число определяет пул выдачи всем игрокам.
1 - Хум, Орк, Андед, НЭ
2 - Хум, Андед, Орк, НЭ
3 - Хум, НЭ, Андед, Орк
И т.д.
Ультра костыльно и упорото, но как вариант
0
1
4 года назад
0
Ikobot:
Вот тебе костыльный вариант.
Число определяет пул выдачи всем игрокам.
1 - Хум, Орк, Андед, НЭ
2 - Хум, Андед, Орк, НЭ
3 - Хум, НЭ, Андед, Орк
И т.д.
Ультра костыльно и упорото, но как вариант
такой вариант я тоже рассматривал, но в дальнейшем расс может быть не 4, а например 10. И тогда прописывать все вариации будет проблематично )
3
28
4 года назад
Отредактирован PT153
3
понял как запомнить рандомного игрока
Создать переменную такого типа в менеджере переменных и установить значение переменной через соответствующее действие.
Игрок = Случайный игрок из группы Х
Удалить игрока Игрок из группы Х
1
26
4 года назад
Отредактирован 8gabriel8
1
PT153 верно указал. полностью триггер будет выглядеть так:
Пусть у случайного игрока переменная PlayerX, а у группы игроков PlayerGroup.
Устанавливаешь PlayerGroup
Set PlayerX=(Random player from PlayerGroup)
Player Group - Remove PlayerX from PlayerGroup
Unit - Create Ratusha for PlayerX at (PlayerX start position) facing 270.00 degrees
Set PlayerX=(Random player from PlayerGroup)
Player Group - Remove PlayerX from PlayerGroup
Unit - Create Dom Vojdei for PlayerX at (PlayerX start position) facing 270.00 degrees
Set PlayerX=(Random player from PlayerGroup)
Player Group - Remove PlayerX from PlayerGroup
Unit - Create Nekropol for PlayerX at (PlayerX start position) facing 270.00 degrees
Set PlayerX=(Random player from PlayerGroup)
Unit - Create Drevo Zhizni for PlayerX at (PlayerX start position) facing 270.00 degrees
1
28
4 года назад
1
Способ 8gabriel8 является аналогичным моему, только из массива (группы) удаляется не расы, а игроки.
0
1
4 года назад
0
8gabriel8:
PT153 верно указал. полностью триггер будет выглядеть так:
Пусть у случайного игрока переменная PlayerX, а у группы игроков PlayerGroup.
Устанавливаешь PlayerGroup
Set PlayerX=(Random player from PlayerGroup)
Player Group - Remove PlayerX from PlayerGroup
Unit - Create Ratusha for PlayerX at (PlayerX start position) facing 270.00 degrees
Set PlayerX=(Random player from PlayerGroup)
Player Group - Remove PlayerX from PlayerGroup
Unit - Create Dom Vojdei for PlayerX at (PlayerX start position) facing 270.00 degrees
Set PlayerX=(Random player from PlayerGroup)
Player Group - Remove PlayerX from PlayerGroup
Unit - Create Nekropol for PlayerX at (PlayerX start position) facing 270.00 degrees
Set PlayerX=(Random player from PlayerGroup)
Unit - Create Drevo Zhizni for PlayerX at (PlayerX start position) facing 270.00 degrees
Всё работает хорошо.
Можете пож-та объяснить, почему мы назначаем переменной значение Random player from PlayerGroup , потом сразу удаляем этого игрока из группы и только после этого спавним юнита.
Я думал, что нужно сперва назначить значение Random player from PlayerGroup, потом заспавнить юнита, а уже после этого удалить игрока из группы и назначить нового.
Загруженные файлы
0
17
4 года назад
0
0
29
4 года назад
0
N1ghtSiren, перемешать таблицу можно и проще:
function(list)
	for i = #list, 2, -1 do
		local j = math.random(i)
		list[i], list[j] = list[j], list[i]
	end
end
1
28
4 года назад
1
Я думал, что нужно сперва назначить значение Random player from PlayerGroup, потом заспавнить юнита, а уже после этого удалить игрока из группы и назначить нового.
А какая разница?

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