Ir para conteúdo
  • 0

Random tabela


nociam

Pergunta

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 por nociam
Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0

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 por nociam
Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

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 por nociam
Link para o comentário
Compartilhar em outros sites

  • 0

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.

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0
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 por nociam
imagen errada
Link para o comentário
Compartilhar em outros sites

  • 0
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ó

 

Link para o comentário
Compartilhar em outros sites

  • 0

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 por nociam
Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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 por nociam
Link para o comentário
Compartilhar em outros sites

  • 0

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. 

Link para o comentário
Compartilhar em outros sites

  • 0

Sorteia eles no inicio da conversa com o npc, dai tu concatena os nomes dos pokemons em uma string e salva no npc, salva também o numero do pokemon, se tu quiser usar o serialize de table fica mais pratico ainda

 

http://codepad.org/EcwaoRhz

 

Ta ai em forma de função

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...