2014-06-10 23 views
2

具體來說,這是用於Garry的Mod,但我認爲這個問題不太重要。我想要做的是獲得一名玩家,並將其價值設置爲另一個隨機玩家(因此每個玩家都有一個隨機「目標」)。我想不重複地做到這一點,所以一名球員不會被分配到他們自己。爲了更好地說明:Lua - 從表中獲取一個值並將其分配給另一個不重複

Player assigning illustation.

到圖像唯一的區別是,我想每個玩家將被分配給另一隨機播放器,因此更像PLAYER1 =>播放器5,播放器3 =>播放器2等

這是我此刻的代碼,但是這總是會留下一人鬆綁:

validTargets = {} 
TargetList = {} 

local Swap = function(array, index1, index2) 
    array[index1], array[index2] = array[index2], array[index1] 
end 

GetShuffle = function(numelems) 
    local shuffle = {} 
    for i = 1, numelems do 
     shuffle[#shuffle + 1] = i 
    end 
    for ii = 1, numelems do 
     Swap(shuffle, ii, math.random(ii, numelems))   
    end 
    return shuffle 
end 

function assignTargets() 
    local shuffle = GetShuffle(#playing) 
    for k,v in ipairs(shuffle) do 
     TargetList[k] = v 
    end 

    SyncTargets() 
end 

function SyncTargets() 
    for k,v in pairs(TargetList) do 
     net.Start("sendTarget") 
      net.WriteEntity(v) 
     net.Send(k) 
    end 
end 

回答

3

我有一個生成隨機洗牌○LUA功能f數字從1到n,給出n。 該方法基於popular algorithm生成元素數組的隨機置換。

你可以嘗試使用像這樣:

local Swap = function(array, index1, index2) 
    array[index1], array[index2] = array[index2], array[index1] 
end 


GetShuffle = function(numelems) 
    local shuffle = {} 
    for i = 1, numelems do 
     shuffle[#shuffle + 1] = i 
    end 
    for ii = 1, numelems do 
     Swap(shuffle, ii, math.random(ii, numelems))   
    end 
    return shuffle 
end 

function assignTargets() 
    local shuffle = GetShuffle(#playing) --assuming `playing` is a known global 
    for k,v in ipairs(shuffle) do 
     TargetList[k] = v 
    end 
end 
+0

好的,我有點小白。你能幫我在我自己的例子中使用它嗎? –

+0

假設你想每次更新'TargetList','assignTargets'函數和你的'assignTargets'做同樣的事情:在你調用'assignTargets'之後,'TargetList'將會被新的隨機洗牌玩家分配所填充。 –

+0

所以我只是堅持這個而不是我的代碼?我需要改變什麼嗎?對不起 - 超級noob在這裏。 –

相關問題