NO

Random tabela

Por nociam, 18 de ago. de 2016 em Scripts

tfs 0.3
16
2.6k
nociamN
18 de agosto de 2016 às 09:22

Como posso fazer um Randon dessa tabela para que a ordem de pokemon sempre seja diferente sem repetir os pokemon?

 

tabela

Spoiler

local pokemons = {
{name = "Vaporeon", level = 250, nick = "", ball = "normal"},
{name = "Gyarados", level = 300, nick = "", ball = "normal"},
{name = "Tentacruel", level = 320, nick = "", ball = "normal"},
{name = "Golduck", level = 330, nick = "", ball = "normal"},
{name = "Blastoise", level = 350, nick = "", ball = "normal"},
{name = "Starmie", level = 400, nick = "", ball = "normal"},
}

código aonde o battle_turn determina qual e o próximo pokemon

 

Spoiler

local battle_turn = 1

local function doSummonGymPokemon(npc)
 local this = npc
 if #getCreatureSummons(this) >= 1 or focus == 0 then return true end
 local it = pokemons[battle_turn]
 if not it then return true end
 if it.nick ~= "" then nickselva = it.nick else nickselva = it.name end
 doSummonMonster(npc, it.name, nickselva)
 local summon = getCreatureSummons(this)[1]
    local balleffect = pokeballs["normal"].effect
    if it.ball and pokeballs[it.ball] then
     balleffect = pokeballs[it.ball].effect
    end
    doSendMagicEffect(getThingPos(summon), balleffect)
    setPlayerStorageValue(summon, 10000, balleffect)
 setPlayerStorageValue(summon, 10001, it.name)
 adjustGymPoke(summon, it.level)
 setPlayerStorageValue(summon, 201, summon)
 setPlayerStorageValue(summon, 99856201, getNpcCid())
 doCreatureSay(npc, gobackmsgs[math.random(#gobackmsgs)].go:gsub("doka", it.name), 1)
 fighting = true
 battle_turn = battle_turn + 1
 updateTarget()
end

 

Bom em uma outro tópico o zipter98  me respondeu uma outra duvida de tabela então tentei fazer o mesmo procedimento e agora pega os pokemon em ordem aleatória mas os pokemon se repetem.

 

parte que mudei

 

 local index = {}
  for n = 1, 6 do
    table.insert(index, n)
  end
    local it = pokemons[index[math.random(1, #index)]]

 

Editado Agosto 18 por nociam

nociamN
19 de agosto de 2016 às 10:42

então continuando nesse problema tentei outros jeito mas sem resultado continua repedindo

 

com esse modo revertido

 

math.randomseed(tonumber(tostring(os.time()):reverse())/5)

 

modo padrao

 

math.randomseed(tonumber(os.time())

 

for n = 1, 6 do
 p = math.random(1, 6)
end
print(p)
 
local it = pokemons[p]
 
vou ver como fazer uma array aonde o numero sorteado cai fora da array e faz um Randon de novo e assim sucessivamente se alguém bom souber como faz fico grato se não vou pesquisar como faz e se tiver resultado posto aqui.

Editado Agosto 19 por nociam

Luga03L
19 de agosto de 2016 às 11:03

Você pode fazer assim,

 

na tabela, você deixa desse jeito:

 

local pokemons = {	[1] = {name = "Vaporeon", level = 250, nick = "", ball = "normal"},	[2] = {name = "Gyarados", level = 300, nick = "", ball = "normal"},	[3] = {name = "Tentacruel", level = 320, nick = "", ball = "normal"},	[4] = {name = "Golduck", level = 330, nick = "", ball = "normal"},	[5] = {name = "Blastoise", level = 350, nick = "", ball = "normal"},	[6] = {name = "Starmie", level = 400, nick = "", ball = "normal"},}

Ai quando for fazer o random você faz assim:

 

local random = math.random(1, #pokemons)

No caso acima, na variável random eu coloquei para randomizar um valor de 1 a o valor máximo da tabela que no cas é 6, então vai randomizar de 1 a 6, esse valor vai ser guardado na variável random e quando for buscar alguma informação dessa tabela deve-se usar o pokemons[random] ou como coloquei na variável abaixo .

 

Espero q tenha ajudado :D

nociamN
19 de agosto de 2016 às 13:08

Uhm o problema que continua repedindo os pokemon no caso ela pode soltar 3 vezes o gyarados eu queria por random para o npc não ficar sempre com a mesma sequencia.

Mas valeu obrigado mesmo assim estou tentando fazer um array aonde eu faço o random e pego o numero sorteado e retiro esse numero da tabela to com um erro de ordenar ela no caso de posições ela pede posição 6 mas já não tem ai to pensando nessa logica

 

index = {}
y = true -- coloquei so pra não inserir no array de novo no fim arrumo pra quanto não tiver nada no array ele isere de novo

 

 if y  then
      for i= 1, 6 do
        table.insert(index,i)
      end
   y= false
    end
 
 print("")
    print("Concatenated",table.concat(index,", "))
 print("")
 
 p = index[math.random(1, #index)]
 x = table.remove(index, index[p])
 
print("sorteado",p)
print("removido",x)

 

Editado Agosto 19 por nociam

PoccnnP
19 de agosto de 2016 às 16:09

Para fazer isso; teria que setar uma store no player, pois ao usar arrays para armazenar valores, caso o servidor seja fechado, todos os dados serão perdidos da array.

 

 

 

nociamN
19 de agosto de 2016 às 18:07

mas eu estou fazendo essa array pro npc assim não a necessidade disso e a penas pra pegar números aleatório  sem repetir mas da foda.

dalvorsnD
19 de agosto de 2016 às 21:54

Usa um array auxiliar, e sempre que sortear remove desse array.
 

Resumindo, ficaria assim:

http://codepad.org/izc9hNbb
 

Editado Agosto 19 por dalvorsn

nociamN
19 de agosto de 2016 às 23:34
1 hora atrás, dalvorsn disse:

Usa um array auxiliar, e sempre que sortear remove desse array.
 

Resumindo, ficaria assim:

http://codepad.org/izc9hNbb
 

Funcionou  certinho não duplica, mas o problema que não estou conseguindo usar esses valores passada na array ou mostra que esta null ou se usar função __sort(used) ela retorna tudo, na verdade depois de feito esse random precisava pegar os valores por vez?

 

 

Editado Agosto 19 por nociam

imagen errada

dalvorsnD
20 de agosto de 2016 às 00:02
27 minutos atrás, nociam disse:

Funcionou  certinho não duplica, mas o problema que não estou conseguindo usar esses valores passada na array ou mostra que esta null ou se usar função __sort(used) ela retorna tudo, na verdade depois de feito esse random precisava pegar os valores por vez?

 

 

Faz um array estatico so pra tu dar copy quando ele tiver um item só

 

nociamN
20 de agosto de 2016 às 00:35
31 minutos atrás, dalvorsn disse:

Faz um array estatico so pra tu dar copy quando ele tiver um item só

 

repete ai

Sem título.png

57b7cfe865f14_Semttulo.thumb.png.f339b45e465451a7b0eb925c1680c140.png

dalvorsnD
20 de agosto de 2016 às 00:43
7 minutos atrás, nociam disse:

repete ai

Sem título.png

http://codepad.org/CtBsuCrA

nociamN
20 de agosto de 2016 às 03:25

tudo indica o certo ela faz o random sem repetir mais quanto tento puxar na array uma por vez e como não estivesse nada preciso puxar 1 numero dessa array por vez.

Esse Randon na verdade e pra essa tabela abaixo não  repetir os pokemon sempre vir pokemon aleatório como não dava conseguindo pensei em fazer uma array de números e mudar a parte que pega os pokemon  .

 

local it = pokemons[battle_turn] -- battle_turn e aonde pega os pokemon

 

local pokemons = {
{name = "Vaporeon", level = 250, nick = "", ball = "normal"},
{name = "Gyarados", level = 300, nick = "", ball = "normal"},
{name = "Tentacruel", level = 320, nick = "", ball = "normal"},
{name = "Golduck", level = 330, nick = "", ball = "normal"},
{name = "Blastoise", level = 350, nick = "", ball = "normal"},
{name = "Starmie", level = 400, nick = "", ball = "normal"},
}

 

Sem título.png

57b7f714677a8_Semttulo.png.4d67dc4c4b5dc83666189681bbb3d961.png

Editado Agosto 20 por nociam

PoccnnP
20 de agosto de 2016 às 08:17

Ja que é para npc, você podeeia criar uma outra tabela contendo os valores (index) que já foram sorteados, assim, quando for sorteado (random) um numero, é só verificar se ja foi sorteado, caso tenha sido, repete o random para obter outro numero até sair um que não tenha sido sorteado.

nociamN
20 de agosto de 2016 às 22:14

Bom com todas essas logicas hoje fiz uma diferente eu coloco outro valor na array no caso o 0 e faço um while ate achar um valor diferente gostaria de sabe como posso fazer pra quanto tudo dentro da array for 0 receber novamente os mesmo valor de 1 a 6 falta so isso para eu não ficar no loop infinito kkkkkkkk.Depois de bem feito vou transformar em uma função para não escrever ela toda em cada npc.

 

 x= 0
 while x == 0 do
   p = based_array[math.random(1, #based_array)]
   x = p
   based_array[p]= 0
 end

Editado Agosto 20 por nociam

PoccnnP
21 de agosto de 2016 às 09:02

Você não pode setar index 0 (zero) para cada elemento dentro de uma array.

Ao setar index 0 para uma array e tentar por isso em outra,  essa primeira será substituída pela segunda.