如何将目标分配给每个人但目标不能是你自己或两个人互相瞄准
How to assign targets to everyone but target can't be yourself or two people targeting each other
在 Roblox 上创建游戏,但我遇到的一个问题是确保每个人都有一个不是他们自己或已经瞄准他们的人的目标。
假设您有 4 名玩家随机分配目标。我想阻止这种结果。
玩家 1 瞄准玩家 2
玩家 2 瞄准玩家 3
玩家 3 瞄准玩家 1
Player4 瞄准 Player4
或者 Player3 瞄准 Player4
Player4 瞄准 Player3
function aFunctionfdfsd()
local targetList = {} -- List of people(3+) who haven't been targeted
while myTarget == Me or myTarget == targetsMe do -- cant be yourself or exchanged
ranPlayer = math.random(1, #targetList)
myTarget = targetList[ranPlayer]
--HELP HERE ?
end
table.remove(targetList, targetList[ranPlayer])
end
选项 1)
创建目标列表的本地副本并从目标列表中删除目标播放器。
然后从缩小的目标列表中选择一个目标。
local myTargetList = {}
for i,v in ipairs(targetList) do
if v != Me then
table.insert(myTargetList, v)
end
end
-- pick target from myTargetList instead of targetList
选项 2)
随机选择一个目标,直到目标不是目标玩家。
一个可靠的方法可能只是将每个玩家抵消一个固定的数量来给你他们的目标。
第 1 轮偏移 = 1
玩家 1 瞄准玩家 2
玩家 2 瞄准玩家 3
玩家 3 瞄准玩家 4
玩家 4 瞄准玩家 1
第 2 轮偏移 = 2
玩家 1 瞄准玩家 3
玩家 2 瞄准玩家 4
玩家 3 瞄准玩家 1
玩家 4 瞄准玩家 2
等等
一旦偏移量等于玩家数量,您只需将其重置为一即可。如果你有玩家加入和离开,玩家将很难发现这种模式。或者你可以每轮洗牌玩家列表。
-- keep track of the current offset
local offset = 1
-- get a mapping of players to targets
local function getTargetsForRound()
local targets = {}
local playerList = game.Players:GetPlayers()
for i, player in ipairs(playerList) do
-- calculate the target index and correct for 1-based arrays
local targetIndex
if i + offset > #playerlist then
targetIndex = (i + offset) % #playerList
else
targetIndex = i + offset
end
targets[ player.Name ] = playList[ targetIndex ].Name
end
-- increment the offset for next time
offset = offset + 1
if offset == #playersList then
offset = 1
end
end
-- at the start of every round, fetch the next targets
local t = getTargetsForRound()
for playerName, targetName in pairs(t) do
print( string.format("%s's target is %s", playerName, targetName )
end
我决定在我的解决方案中使用一些递归和随机性。
在下面的代码中,您传入玩家姓名列表(即 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
最后会返回一个字典,如果您想查看结果,我已经设置了打印结果的外观。如果您有任何问题,请发表评论。
在 Roblox 上创建游戏,但我遇到的一个问题是确保每个人都有一个不是他们自己或已经瞄准他们的人的目标。
假设您有 4 名玩家随机分配目标。我想阻止这种结果。
玩家 1 瞄准玩家 2
玩家 2 瞄准玩家 3
玩家 3 瞄准玩家 1
Player4 瞄准 Player4
或者 Player3 瞄准 Player4
Player4 瞄准 Player3
function aFunctionfdfsd()
local targetList = {} -- List of people(3+) who haven't been targeted
while myTarget == Me or myTarget == targetsMe do -- cant be yourself or exchanged
ranPlayer = math.random(1, #targetList)
myTarget = targetList[ranPlayer]
--HELP HERE ?
end
table.remove(targetList, targetList[ranPlayer])
end
选项 1)
创建目标列表的本地副本并从目标列表中删除目标播放器。 然后从缩小的目标列表中选择一个目标。
local myTargetList = {}
for i,v in ipairs(targetList) do
if v != Me then
table.insert(myTargetList, v)
end
end
-- pick target from myTargetList instead of targetList
选项 2)
随机选择一个目标,直到目标不是目标玩家。
一个可靠的方法可能只是将每个玩家抵消一个固定的数量来给你他们的目标。
第 1 轮偏移 = 1
玩家 1 瞄准玩家 2
玩家 2 瞄准玩家 3
玩家 3 瞄准玩家 4
玩家 4 瞄准玩家 1
第 2 轮偏移 = 2
玩家 1 瞄准玩家 3
玩家 2 瞄准玩家 4
玩家 3 瞄准玩家 1
玩家 4 瞄准玩家 2
等等
一旦偏移量等于玩家数量,您只需将其重置为一即可。如果你有玩家加入和离开,玩家将很难发现这种模式。或者你可以每轮洗牌玩家列表。
-- keep track of the current offset
local offset = 1
-- get a mapping of players to targets
local function getTargetsForRound()
local targets = {}
local playerList = game.Players:GetPlayers()
for i, player in ipairs(playerList) do
-- calculate the target index and correct for 1-based arrays
local targetIndex
if i + offset > #playerlist then
targetIndex = (i + offset) % #playerList
else
targetIndex = i + offset
end
targets[ player.Name ] = playList[ targetIndex ].Name
end
-- increment the offset for next time
offset = offset + 1
if offset == #playersList then
offset = 1
end
end
-- at the start of every round, fetch the next targets
local t = getTargetsForRound()
for playerName, targetName in pairs(t) do
print( string.format("%s's target is %s", playerName, targetName )
end
我决定在我的解决方案中使用一些递归和随机性。
在下面的代码中,您传入玩家姓名列表(即 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
最后会返回一个字典,如果您想查看结果,我已经设置了打印结果的外观。如果您有任何问题,请发表评论。