Page 1 sur 1

[résolu] questions à propos d'une liste

Publié : dim. 20/mars/2011 20:59
par blendman
salut

En ce moment, je bosse sur l'inventaire pour mon jeu, mais je rencontre le problème suivant :
- lorsque j'ajoute un objet à mon inventaire, si l'objet est déjà présent, au lieu d'être ajouté à l'élément existant de ma liste, cela me crée un nouvel élément, sauf pour le premier élément.

voici mon code (simplifié), on voit le problème pour les éléments dont l'id = 2 :

Code : Tout sélectionner

Structure objet 
  id.i
  nb.i
EndStructure
 
  
NewList drop.objet()
NewList inventaire.objet()


AddElement(inventaire())
inventaire()\id = 1
inventaire()\nb = 2

AddElement(inventaire())
inventaire()\id = 2
inventaire()\nb = 5




AddElement(drop())
drop()\id = 1
drop()\nb = 3

AddElement(drop())
drop()\id = 2
drop()\nb = 9

AddElement(drop())
drop()\id = 1
drop()\nb = 4

AddElement(drop())
drop()\id = 3
drop()\nb = 18

ForEach drop()
   For i=0 To ListSize(inventaire())-1
      If SelectElement(inventaire(),i)
        If inventaire()\id  = drop()\id          
          inventaire()\nb + drop()\nb
          ChangeCurrentElement(inventaire(),i)
          DeleteElement(drop()) 
          Break 
        Else
          If inventaire()\id <> drop()\id
            If SelectElement(inventaire(),ListSize(inventaire())-1)
              AddElement(inventaire())
              inventaire()\id = drop()\id
              inventaire()\nb = drop()\nb
              DeleteElement(drop())
              Break 
            EndIf
          EndIf
        EndIf
      EndIf
   Next i
Next
     
     
     
     Debug "--------------------Inventaire ---------------------"
ForEach inventaire()
  Debug "Id : " + Str(inventaire()\id)
  Debug "nb : " + Str(inventaire()\nb)
Next
Je suppose qu'il y a quelque chose que je dois mal faire, donc, si vous voyez où j'ai bugué, cela m'intéresse ;)

merci à vous :)

Re: questions à propos d'une liste

Publié : dim. 20/mars/2011 21:21
par Backup
...............

Re: questions à propos d'une liste

Publié : dim. 20/mars/2011 21:37
par Backup
.............

Re: questions à propos d'une liste

Publié : dim. 20/mars/2011 21:52
par blendman
Dobro a écrit :normal lorsque tu fait
AddElement(inventaire())
inventaire()\id = drop()\id

tu ajoute un élément

mais si tu fais seulement
inventaire()\id = drop()\id
tu modifie l'element courant !

faut voir la liste chainée comme une pile() Assembleur
il y a un pointeur (le PC (pointer counter)en Ass pour garder l'image )
ce pointeur ne perd pas l'indice de l'element en cours

si tu fait
AddElement(inventaire())
le pointeur est incrementé
mais si tu fait juste
inventaire()\id = drop()\id , c'est l'élément courant (celui que le pointeur pointe)
qui est changé ;)
Merci pour ton explication, je comprends, mais là, je fais justement la 1ère chose :
j'ajoute un élément et je le change :

Code : Tout sélectionner

If SelectElement(inventaire(),ListSize(inventaire())-1)
              AddElement(inventaire())
              inventaire()\id = drop()\id
              inventaire()\nb = drop()\nb
              DeleteElement(drop())
               EndIf
on voit bien :
AddElement(inventaire())
suivi de
inventaire()\id = drop()\id

et pourtant ça ne marche pas, donc, je ne comprends pas car logiquement, ça devrait marcher :)

EDIT : oup's autant pour moi, le problème n'est pas là en fait, au contraire, il crée un élément alors qu'il devrait ajouter la valeur à un autre élément existant qui a le même id (le N°2 )
c'est pourquoi il existe les fonctions
NextElement
LastElement
PreviousElement
etc ... c'est pour changer le pointeur d'element de la list

avec ces fonction tu peux modifier n'importe quel valeur de ta liste ...
Et bien, j'ai essayé beaucoup de choses, mais je n'y arrive pas.

Ce que je ne comprends pas c'est que ça marche pour le tout premier element (id =1), mais ça ne marche plus ensuite pour les autres : il crée un nouvel élément au lieu d'additionner les nombre avec :

Code : Tout sélectionner

If inventaire()\id  = drop()\id          
          inventaire()\nb + drop()\nb
          ChangeCurrentElement(inventaire(),i)
là, je suis bien sur l'élément courant, et je dis bien à cet élément d'ajouter drop()\nb, puis de changer cet élément courant non ?

Re: questions à propos d'une liste

Publié : dim. 20/mars/2011 22:12
par G-Rom
je te conseil l'utilisation des Map() pour cela , c'est plus rapide en temps d'accès que les liste en plus.

Code : Tout sélectionner

Global newmap Inventaire.i()

Inventaire("EPEE") = 1
Inventaire("BOUCLIER") = 1
Inventaire("POTION") = 10
tu peut bien évidement structuré tout ca. , le point clé des map , c'est la clé , c'est à dire le string que tu passes en paramètre est tranformé en clé unique ( qui sera un index dans un tableau ) , ca s'appelle table de hashage , mais bon , utilisé les maps , c'est très bien pour géré un inventaire.

@+

Re: questions à propos d'une liste

Publié : dim. 20/mars/2011 22:32
par blendman
G-Rom a écrit :je te conseil l'utilisation des Map() pour cela , c'est plus rapide en temps d'accès que les liste en plus.

Code : Tout sélectionner

Global newmap Inventaire.i()

Inventaire("EPEE") = 1
Inventaire("BOUCLIER") = 1
Inventaire("POTION") = 10
tu peut bien évidement structuré tout ca. , le point clé des map , c'est la clé , c'est à dire le string que tu passes en paramètre est tranformé en clé unique ( qui sera un index dans un tableau ) , ca s'appelle table de hashage , mais bon , utilisé les maps , c'est très bien pour géré un inventaire.

@+
salut G-rom :)
Effectivement, je viens de tester et c'est beaucoup plus simple (pour moi :)).

Merci à toi de ce conseil fort judicieux et merci à Dobro pour ton explication ;).

Voici le code corrigé :

Code : Tout sélectionner

Structure objet 
  id.i
  nb.i
EndStructure
 
  
NewList drop.objet()
NewMap inventaire.objet()



inventaire("1")\id = 1
inventaire()\nb = 2


inventaire("2")\id = 2
inventaire()\nb = 5


AddElement(drop())
drop()\id = 1
drop()\nb = 3

AddElement(drop())
drop()\id = 2
drop()\nb = 8

AddElement(drop())
drop()\id = 1
drop()\nb = 4

AddElement(drop())
drop()\id = 3
drop()\nb = 18


AddElement(drop())
drop()\id = 2
drop()\nb = 4

AddElement(drop())
drop()\id = 3
drop()\nb = 3

ForEach drop()
   For i=1 To MapSize(inventaire())
        If inventaire(Str(i))\id  = drop()\id 
          inventaire(Str(i))\nb + drop()\nb
          DeleteElement(drop()) 
          Break
        Else
          If inventaire(Str(i))\id <> drop()\id And MapKey(inventaire()) = Str(MapSize(inventaire()))

            AddMapElement(inventaire(),Str(i+1))

              inventaire(Str(i+1))\id = drop()\id
              inventaire(Str(i+1))\nb = drop()\nb
              DeleteElement(drop())
              Break
           EndIf
       EndIf
   Next i    
Next
     
     
     
     Debug "--------------------Inventaire ---------------------"
ForEach inventaire()
  Debug "Id : " + Str(inventaire()\id)
  Debug "nb : " + Str(inventaire()\nb)
Next
ce code peut facilement être adapté pour un inventaire ou tout type de menu proche d'un inventaire :).

Re: questions à propos d'une liste

Publié : dim. 20/mars/2011 23:06
par Backup
.................