1

désolé si je vous dérange maintenant, je suis encore en train d'apprendre. mais j'ai besoin d'aide. pourriez-vous me corriger et écrire comment vérifier et ensuite obtenir la valeur de tableau 2d pour vérifier plus loin et compter les points?Lua tableau contient une valeur spécifique pour vérifier plus loin

exemple de syntaxe array2d que je construis:

role = {{[name],[points],[indexpoint]}, 
     {[...],[...],[...]}} 

exemple valeur array2d que je fais:

role = {{"mike", 30, "1"}, 
     {"michael", 40, "2"}, 
     {"mike", 40, "2"}, 
     {"michael", 50, "3"}, 
     {"frost", 50, "3"}, 
     {"nick", 60, "4"}} 

ce que je voulais est. quand je cherche le nom "michael". il va détecter la valeur dans le tableau. quelque chose comme ça

local player_data = {{"michael", 40, "2"},{"michael", 50, "3"}} 

donc après cela, je peux compter les points qu'il a déjà. 40 + 50 et le résultat "90", il enverra à de nouvelles variables comme resultpoint = 90

donc l'impression montrera comme ce

Player "Michael" 
Your points is "90" 
Here is the list of your index that you earned : 
1. earn 40 points in index point "2" 
2. earn 50 points in index point "3" 

mon code long ici:

role = {{"mike", "30", "1"}, 
     {"michael", "40", "2"}, 
     {"mike", "40", "2"}, 
     {"michael", "50", "3"}, 
     {"frost", "50", "3"}, 
     {"nick", "60", "4"}} 

function check_role1(tab, val) 
     for index, value in ipairs (tab) do 
      -- We grab the first index of our sub-table instead for player name 
      if value[1] == val then 
       return true 
      end 
     end 
     return false 
    end 

    function check_role2(tab, val) 
     for index, value in ipairs (tab) do 
      -- We grab the third index of our sub-table instead for index point 
      if value[3] == val then 
       return true 
      end 
     end 
     return false 
    end 

    function detectroles(name) 
     pn = name 
     if check_role1 (role, pn) then 
      print ('Yep') 
      --[[for i = 1, #role do 
       player_checkname[i] = role[i][1] -- Get Player Name From Array for checking further 
       player_checkpnt[i] = role[i][2] -- Get Player Point From Array for checking further 
       player_checkidpnt[i] = role[i][3] -- Get Player Point From Array for checking further]] 
      -- is this correct code to get value ? 
      end 
     else 
      print ('You dont earn any points') 
     end 
    end 

    detectroles("jack") -- this is call function, for checking name jack if he is in array or not 

est-ce vraiment possible? s'il y a un moyen simple ou plus de code, faites le moi savoir. Je sais, c'est trop de code. Je suis encore débutant

+0

Ne serait-il pas plus facile de stocker les joueurs dans un dictionnaire, où chaque nom est égal à un tableau de leurs points? Ensuite, vous avez des recherches rapides et faciles, et faciles à insérer des scores. – warspyking

+0

umm, comme quoi? – Han

+0

Stockez les données comme suit: 'données locales = {Nom1 = {score1, score2}, Name2 = {score1, score2}}' puis pour accéder à une liste de chaque score qu'une personne possède: 'data.Name1' – warspyking

Répondre

1

Ce que vous semblez rechercher sont quelques fonctions générales de structure de données connues sous le nom filter (parfois appelé select) et reduce.


filter est une fonction simple qui fonctionne sur un ensemble de valeurs, la création d'un nouvel ensemble contenant seulement ceux qui sont conformes à un prédicat fourni. La mise en œuvre de filter est très straight-forward:

  • Créer une nouvelle série vide
  • Itérer dans votre ensemble existant, la lecture de chaque valeur
  • Poussez toutes les valeurs qui passent le test dans le nouvel ensemble

Le résultat de l'opération est le nouvel ensemble.

Dans Lua:

local function filter (list, test) 
    local result = {} 

    for index, value in ipairs(list) do 
     if test(value, index) then 
      result[#result + 1] = value 
     end 
    end 

    return result 
end 

Nous pouvons utiliser cette fonction pour obtenir un ensemble filtré de valeurs, où la première entrée dans chaque table est 'michael':

local set = { 
    { "mike", "30", "1" }, 
    { "michael", "40", "2" }, 
    { "mike", "40", "2" }, 
    { "michael", "50", "3" }, 
    { "frost", "50", "3" }, 
    { "nick", "60", "4" } 
} 

local filtered_set = filter(set, function (person) 
    return person[1] == 'michael' 
end) 

for _, person in ipairs(filtered_set) do 
    print(unpack(person)) 
end 

--[[stdout: 
    michael 40 2 
    michael 50 3 
]] 

reduce est un fonction qui accumule une seule valeur en itérant sur un ensemble de valeurs. reduce permet généralement une valeur initiale fournie, sinon la valeur initiale est la première valeur de l'ensemble.

Dans Lua:

local function reduce (set, action, initial_value) 
    local result 
    local index 

    if initial_value ~= nil then 
     result = initial_value 
     index = 1 
    else 
     result = set[1] 
     index = 2 
    end 

    for i = index, #set do 
     result = action(result, set[i], i) 
    end 

    return result 
end 

que nous pouvons utiliser pour déterminer une valeur combinée pour les entrées de set:

local value = reduce(filtered_set, function (score, next_entry) 
    return score + next_entry[2] -- Careful with relying on stringly-math 
end, 0) 

print(value) --> prints 90 

Bien absent de la bibliothèque standard Lua, ceux-ci sont très fréquents fonctionnelles opérations, et apprendre à les mettre en œuvre (et d'autres comme each, map, reject, count, index, has, find) vous en apprendra beaucoup sur l'utilisation de structures de données. Essayez de penser à la façon dont ils s'intégreraient dans votre code actuel.

+0

yay merci pour l'aide, pouvez-vous me dire comment puis-je obtenir le tableau de personne '_ pour, personne ipairs (filtered_set) faire \t impression (déballer (personne)) end' je dois envoyer ce valeurs de tableau à nouveau comme je l'ai dit 'local player_data = {{" michael ", 40," 2 "}, {" michael ", 50," 3 "}}' – Han

+1

@Han C'est ce que 'filtered_set' _is_. – Oka

+0

oh ouais, je l'ai compris, avant de répondre .. merci beaucoup! – Han