Я решил использовать немного рекурсии и случайности в своем решении.
В приведенном ниже коде вы передаете список имен игроков (т. Е. game.PLayers:getChildren()
), а затем код будет случайным образом совпадать с нимидругим игрокам. У него есть проверки, чтобы убедиться, что они не могут соответствовать себе или уже принятой цели, и если вы останетесь с последним парнем, у которого нет целей для выбора, он сам позвонит, чтобы получить новый список.
В качестве семени яиспользование действительно случайно, вы не рискуете застрять в рекурсивном цикле, поскольку следующий цикл всегда отличается.
function stayOnTarget(players)
math.randomseed(tonumber(tostring({}):sub(8))) --Very reliable random seed
local availableTargets = {}
local choosenTargets = {}
--Duplicating players array without linking them
for _, player in pairs(players) do
table.insert(availableTargets, player)
end
for i, player in pairs(players) do
--If the last player is left with themselves, try again
if i == #players and availableTargets[1] == player then
return stayOnTarget(players)
end
--Pick a target that is not themselves
local targetIndex = math.random(1, #availableTargets)
local target = availableTargets[targetIndex]
while target == player do
targetIndex = math.random(1, #availableTargets)
target = availableTargets[targetIndex]
end
--Store target and remove them from available targets
choosenTargets[player] = target
table.remove(availableTargets, targetIndex)
end
return choosenTargets
end
local results = stayOnTarget({"User1", "User2", "User3", "User4"})
--Print target matches
for i, v in pairs(results) do
print(i .. " = " .. v)
end
В конце возвращается словарь, и я настроил внешний вид для печатирезультаты, если вы хотите их увидеть. Если у вас есть какие-либо проблемы, просто оставьте комментарий.