tester une map

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

tester une map

Message par blendman »

salut

J'essaie d'ajouter des objets dans un inventaire et vérifier si la case est prise, mais je suis un peu coincé ^^.

Voici à quoi ressemble le code que je voulais utiliser :

Code : Tout sélectionner

Structure stObj
  kaz.a
EndStructure
Global NewMap inventaire.stobj()

AddMapElement(inventaire(),"1")
inventaire("1")\kaz = 2
AddMapElement(inventaire(),"2")
inventaire("2")\kaz = 3
AddMapElement(inventaire(),"3")
inventaire("3")\kaz = 5

For nbreObj = 0 To 1 ; on va ajouter 2 objets
  fin_list =0
  ResetMap(inventaire())
  NextMapElement(inventaire())
  Debug "----------------------- objet : "+Str(nbreObj)+"-----------------------------"
  For kaze = 1 To 8
    fin_list =0
    Debug kaze
    ForEach inventaire() 
      fin_list+1
      If kaze = inventaire()\kaz  ; la case est prise      
        Debug "Case "+Str(kaze)+" drop déjà prise" 
        Break 
      Else
        If fin_list = MapSize(inventaire())  
          Debug "on est à la fin de la liste - Case non prise ! Ajout de l'objet dans la case"+Str(kaze)
          inventaire(Str(MapSize(inventaire())+1))\kaz = kaze  
          Break 2
        EndIf                 
      EndIf    
    Next
  Next kaze  
Next nbreObj
Normalement, je devrais tester les cases et trouver que la une est libre pour le 1er objet, puis la 4, mais ça ne marche pas.

Une idée de la boulette que j'ai faite ? :D.

Merci ;)

EDIT : j'ai modifié un peu le code, mais ça ne marche toujours pas. Mais au moins, on voit mieux que ça ne marche pas ^^.

EDIT 2 : bon, j'ai trouvé, mais je ne sais pas si c'est la meilleure technique, si vous avez une meilleure solution, n'hésitez pas ;).
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: tester une map

Message par Le Soldat Inconnu »

Je t'avoue que je ne comprends pas bien ton système, c'est quoi que tu range dans Kaz ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: tester une map

Message par blendman »

Kaz, c'est la case sur laquelle se trouve l'objet, dans l'inventaire.

Par exemple, j'ai dans mon jeu :

Code : Tout sélectionner

inventaire()\id = 18 ; c'est l'identifiant de l'objet, il me permet d'avoir les informations souhaitées, lorsque je le veux.
inventaire()\nom ="Potion de vie" ; le nom de l'objet
inventaire()\kaz = 3 ; il est sur la 3ème case.
inventaire()\nb = 3 ; c'est le nombre d'objet du même "id" qu'on a dans l'inventaire
;etc...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: tester une map

Message par comtois »

j'utiliserais le no de la case comme clé de la map. Pour savoir si une case est libre tu as juste à tester ainsi
If FindMapElement(inventaire(), drop$)

Code : Tout sélectionner

Global NewMap inventaire.i()
;la clé correspond au numéro de la Case
inventaire("1") = 2 ;No id de l'objet , si on a besoin de plus d'infos on se réfère à cet id ! 
inventaire("2") = 3
inventaire("3") = 5

;Tu parles de drop , donc tu connais déjà le no de la case souhaitée et donc à tester ?
;Dans ce cas pourquoi ne pas utiliser FindMapElement(inventaire(), drop$) ?

;Le joueur a choisi la case 3
Objet = 0
Drop$ = "3" ; Teste aussi avec "0"

;On teste si cette case est libre
If  FindMapElement(inventaire(), drop$) 
  Debug "La case " + Drop$ + " est déjà prise"
Else
  Debug "Case non prise ! Ajout de l'objet dans la case " +Drop$
  inventaire(Drop$) = Objet
EndIf
inventaire()\nb = 3 ; c'est le nombre d'objet du même "id" qu'on a dans l'inventaire
Pour moi un id doit être unique, tu ne peux pas avoir 3 objets avec le même id, tu parles sans doute du type d'objet ? ou des objets ayant le même nom ?

Sinon pour un inventaire, un simple tableau ne suffirait pas ? Le nombre de cases doit être limité et figé non ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: tester une map

Message par blendman »

comtois a écrit :j'utiliserais le no de la case comme clé de la map. Pour savoir si une case est libre tu as juste à tester ainsi

Code : Tout sélectionner

If FindMapElement(inventaire(), drop$)

Code : Tout sélectionner

Global NewMap inventaire.i()
;la clé correspond au numéro de la Case
inventaire("1") = 2 ;No id de l'objet , si on a besoin de plus d'infos on se réfère à cet id ! 
inventaire("2") = 3
inventaire("3") = 5

;Tu parles de drop , donc tu connais déjà le no de la case souhaitée et donc à tester ?
;Dans ce cas pourquoi ne pas utiliser FindMapElement(inventaire(), drop$) ?[/quote]en fait, on ne connait pas forcément le numéro de la case à utiliser, car on teste justement pour voir si celle-ci est libre ou non.
Dans mon inventaire, on peut réorganiser nos objets, en drag and drop. Donc, on peut avoir des cases libres entre des cases prises, comme on le voit sur cette image :
http://www.3arks.com/arkeos/images/screen/arkeos0.10_3.jpg
Si on supprime un objet, on le supprime de la map, et la case se "libère" (on peut y mettre un autre objet).

Je pense que mon système est un peu inversé, je ne gère pas des cases sur lesquelles on peut mettre des objets, mais plus un groupe d'objets que l'on met sur des cases.

[quote][quote]inventaire()\nb = 3 ; c'est le nombre d'objet du même "id" qu'on a dans l'inventaire[/quote]
Pour moi un id doit être unique, tu ne peux pas avoir 3 objets avec le même id, tu parles sans doute du type d'objet ? ou des objets ayant le même nom ?[/quote]OUi, il est unique, mais on peut avoir plusieurs objet identiques (donc ayant le même id). Donc on n'a pas de duplicata de cet objet dans l'inventaire, mais on incrémente/décrémente son nombre plutôt. Du coup, 50 objet ayant le même id prennent une seule case et corresponde en réalité à un seul objet sur la map.

Par exemple, si l'id 1 représente : une potion de vie donnant 20 points de vie. On peut avoir 30 potions identiques. Donc, j'ai bien 1 seul objet dans l'inventaire ayant cet id et le nombre est alors de 30.
Cela me permet plusieurs objets identique (même id), et qui n'utilisent qu'une seule case et une seule place dans la map/liste.

[quote]Sinon pour un inventaire, un simple tableau ne suffirait pas ? Le nombre de cases doit être limité et figé non ?[/quote]j'y avais pensé, mais en fait, je gère plutôt une liste d'objet que des cases d'inventaire, car le nombre est certes limité(disons inférieur à 150 au départ), mais il peut évoluer, en fonction de certains paramètres (force, personnage choisi, bonus, etc..).
J'ai aussi pensé à utiliser une liste, car je pourrais la trier par type d'objet, par nombre, par nom, etc.. Et ce serait intéressant je pense :).

Cela dit, je vais peut être testé un tableau, mais je me demande si ça ne va pas être plus délicat à gérer.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: tester une map

Message par PAPIPP »

Bonjour Blendman
et comme cela peut être

Code : Tout sélectionner

Structure stObj
	kaz.a
EndStructure
Global NewMap inventaire.stobj()

AddMapElement(inventaire(),"2")
inventaire()\kaz = 2
AddMapElement(inventaire(),"3")
inventaire()\kaz = 3
AddMapElement(inventaire(),"5")
inventaire()\kaz = 5

For nbreObj = 0 To 1 ; on va ajouter 2 objets
	fin_list =0
	ResetMap(inventaire())
	NextMapElement(inventaire())
	Debug "----------------------- objet : "+Str(nbreObj)+"-----------------------------"
	For kaze = 1 To 8
		fin_list =0
		Debug kaze
		ForEach inventaire() 
			fin_list+1
			If kaze = inventaire()\kaz  ; la case est prise      
				Debug "Case "+Str(kaze)+" drop déjà prise" 
				Break 
			Else
				If fin_list = MapSize(inventaire())  
					Debug "on est à la fin de la liste - Case non prise ! Ajout de l'objet dans la case"+Str(kaze)
					inventaire(Str(MapSize(inventaire())+1))\kaz = kaze  
					Break 2
				EndIf                 
			EndIf    
		Next
	Next kaze  
Next nbreObj

Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: tester une map

Message par case »

ben... tu peux faire une liste qui ne contiens que les index des cases vides...
si tu as besoin de prendre une case vide tu prend celle en tête de liste. et tu la sort de la liste.

pour l'inverse si tu as une case pleine qui se vide, tu peux la mettre en fin de liste par exemple
et faire un tri pour que tes cases vides se remplissent dans l'ordre.

et si le joueur met un objet dans une case particulière tu teste si elle est vide ou pas, si elle est vide tu parcours ta liste et tu la vire des cases vides...
ImageImage
Répondre