FelipeMallmann Posted November 25, 2015 Share Posted November 25, 2015 (edited) Eai galera, estou com uma duvida. Nao sei como são os comandos em tables, mais especificamente tenho essa table teste, no qual passei para ela todos os jogadores online. function pegaTodosOnline() local Teste= {} for _,player in ipairs(getElementsByType("player")) do table.insert(Teste, player) end return Teste end Entao sempre que chamar a função terei um retorno com uma table com todos players online, certo? Agora preciso guardar em uma variavel o primeiro elemento dessa player, ou seja, o primeiro player, pois minha meta é ir comparando esse primeiro player com todos os demais até pegar o que possui mais kills, para entao exibir o top killer. Meu pensamento está correto? e como eu pego o primeiro elemento da table Teste? #Edit: tambem gostaria de saber o que é o #, exemplo #Teste, é para pegar o tamanho da table ou algo assim? Obrigado! Edited November 25, 2015 by Guest Link to comment
n3wage Posted November 25, 2015 Share Posted November 25, 2015 Para pegar o primeiro elemento da tabela basta usar Teste[1], Você até pode calcular o "top killer" com um loop, Mas existe uma função exatamente para isso: table.sort Ela ordena os elementos de uma tabela de acordo com uma função que você deve passar no segundo argumento: --Imagine que você queira ordenar esta tabela: tabela = { 4, 1, 26, 8, 16, 18, 22, -6 } -- ... dos números maiores para os menores, Você usaria: table.sort ( tabela, -- primeiro argumento, a tabela que você quer ordenar function ( a, b ) -- segundo argumento, a função que vai ordenar a tabela -- a e b correspondem a algum item da tabela -- com o > vamos ordenar do maior para o menor -- com < fazemos o contrario (menor pro maior) return a > b end ) -- se fizermos um loop agora podemos ver que a tabela já esta ordenada for k, v in ipairs ( tabela ) do print ( k, v ) end Porem, O código acima não vai funcionar com a sua tabela (Porque os itens dela são jogadores e não numeros, sendo assim não podemos checar se um jogador é maior (>) que o outro), Então temos que fazer algo assim: tabela = {} for _, v in ipairs ( getElementsByType ( "player" ) ) do table.insert ( tabela, v ) end -- table.sort ( tabela, function ( a, b ) -- como a e b são itens da tabela sabemos que vão ser elementos (jogadores) -- agora basta comparar as kills deles return getElementData ( a, "kills" ) > getElementData ( b, "kills" ) end ) Com esse codigo tabela[1] vai ser o primeiro jogador com mais kills, tabela[2] o segundo etc, Se não entendeu tente ver a explicação no Manual da linguagem. O # antes do 'nome' da tabela retorna o tamanho dela (no seu caso o total de jogadores no servidor). Link to comment
FelipeMallmann Posted November 25, 2015 Author Share Posted November 25, 2015 Hmm entendi! Eu ja imaginava usar um getElementData para ir comparando eles, mas nao sabia desse table.sort. Eu ia criar uma variavel e passar o kills do primeiro player pra ela e depois ir comparando ela com os kills de todos os outros da tabela, se nenhum fosse maior retornaria o primeiro, senao retornaria o maior. Mas esse jeito parece ser muito mais pratico. Mais uma vez, muito obrigado! edit: Esse return dentro do table.sort retorna eles ordenados para a tabela né? Link to comment
Stanley Sathler Posted November 25, 2015 Share Posted November 25, 2015 edit: Esse return dentro do table.sort retorna eles ordenados para a tabela né? Sim, Felipe. A propósito, n3wage teve a manha criando esse código. Típico da programação funcional tão aclamada do JavaScript. Passei no tópico mais para parabenizar isso. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now