Как назначить цели всем, но целью не может быть вы или два человека, нацеленные друг на друга - PullRequest
0 голосов
/ 23 октября 2019

Создание игры на Roblox, но проблема, с которой я сталкиваюсь, заключается в том, чтобы убедиться, что у всех есть цель, которая не является ими самими или кем-то, кто уже нацеливается на них. Я хочу предотвратить этот исход.

Цели игрока1 Игрок2

Цели игрока2 Игрок3

Цели игрока3 Игрок1

Цели игрока4 Игрок4

или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

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Одним из надежных методов может быть просто смещение каждого игрока на фиксированную сумму, чтобы дать вам его цель.

Раунд 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
0 голосов
/ 23 октября 2019

Я решил использовать немного рекурсии и случайности в своем решении.

В приведенном ниже коде вы передаете список имен игроков (т. Е. 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

В конце возвращается словарь, и я настроил внешний вид для печатирезультаты, если вы хотите их увидеть. Если у вас есть какие-либо проблемы, просто оставьте комментарий.

0 голосов
/ 23 октября 2019

Вариант 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)

Выбирайте случайную цель, пока цель не является целевым игроком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...