Gestion inventaire/équipement dans un jeu via php/Mysql [Résolu]

monoski 132 Messages postés mercredi 15 avril 2009Date d'inscription 13 mai 2013 Dernière intervention - 24 nov. 2010 à 16:57 - Dernière réponse : TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention
- 26 nov. 2010 à 15:08
Bonjour à tous !

Voila je reprends depuis peu la programmation d'un mini jeu de rôle. Dans celui-ci les personnages évoluent un peu à la manière d'un personnage de world of Warcraft. Ils peuvent obtenir des objets à placer dans leur inventaire, puis en équiper d'autre sur leur personnage.

J'aimerai savoir qu'elle est la meilleur façon d'aborder les choses, alors voici quelques questions que je soumet à la sagesse de cette merveilleuse communauté :
[list]
[*] Comment gérer d'une part l'inventaire dans la BDD, je précise : dois-je intégrer l'inventaire de chaque personnage au sein de la table qui résume ses informations personnelles ? Si oui, dois-je créer une entrée au sein de la table par emplacement disponible dans l'inventaire ou puis-je compresser les données au sein d'une seule entrée tout en conservant la possibilité d'éditer une partie des informations qui y sont contenues (lors de la suppression d'un objet de l'inventaire par exemple). Je dois préciser qu'il sera possible d'augmenter le nombre d'emplacement d'inventaire disponible.
[*] Pour cela il faut tenir compte aussi du fait que je dois aussi utiliser les objets au sein de l'inventaire afin de les équiper sur mon personnage (casque) ou de les consommer (potion par exemple).
/list

Pour le moment, j'ai créer une table pour les utilisateurs, et une table des objets qui répertorie l'ensemble des objets (nom, type, effet). Je pense d'autre part scinder cette table en deux, une pour les objets consomptibles, une autre pour les objets d'équipements.

Alors oui, toi développeur chevronné je requiert ton aide qui me sera précieuse. Quelles fonctions utiliser comment approcher la mise à jour de la BDD selon les hypothèses.

Je sais c'est large comme question et je ne fournis pas de code :'(

Merci à tous ceux qui m'ont lu !

Bonne journée à tous =)
Afficher la suite 

11 réponses

Répondre au sujet
TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention - 26 nov. 2010 à 00:37
+3
Utile
Salut,

je mettrais tous les ids des objet possèder dans le meme champ avec un split(';', $var);

Non !
Dans une base de donnés relationnelle on en fait surtout pas ça, on créé une autre table avec, si besoin, une table de liaison, afin de faire une jointure (cf Des bases de données relationnelles et multivaluées). Si on commence à partir sur une chaîne dégueu que l'on devra spliter, le projet va très vite devenir ingérable.

@monoski : voici un petit modèle fait vite fait :

(lien vers l'image)

On part de la table Characters qui sert à stocker un personnage. Un perso dispose d'un nom, d'un niveau et d'une race. Pour sa race, on utilise l'id de la race correspondante dans la table Races.
Une race dispose d'un nom et peut avoir zéro, un ou plusieurs effets (la race du perso influant dessus). On joint donc la table Races à la table Effects grace à la table de liaison Races_has_Effects qui permet de metrte en relation un id de race avec un id d'effet.
Un perso pouvant avoir 0 ou plusieurs objets, on utilise également une table de liaison pour le lier à la table Items. La table de liaison dispose ici d'une quantité afin d'éviter de se taper des entrées en doublon. Afin de gérer le port d'un objet (un perso pouvant avoir 2 armes sur lui mais ne se servir que d'une seule par exemple), on pourra par la suite rajouter le numéro du slot utilisé.
Un item ayant un (et un seul) type, il est lié à la table Item_types (si plusieurs tyeps sont possible, une table de liaison est nécessaire). Un item disposant également de 0 ou plusieurs effets, il est lié à ta table Effects par la table de liaison Items_has_Effects.

Voilà, en quelques minutes on fait une ébauche de ce que l'on cherchais.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de TychoBrahe
Dav_c 194 Messages postés dimanche 25 janvier 2004Date d'inscription 11 décembre 2015 Dernière intervention - 25 nov. 2010 à 03:02
0
Utile
Vite dememe je dirais :

Comment gérer d'une part l'inventaire dans la BDD, je précise : dois-je intégrer l'inventaire de chaque personnage au sein de la table qui résume ses informations personnelles ?


Moi je ferais une table contenant tous les objets posible.
Une table des personnage comportant un champ pour chaque type d'objet
-Casque - torse ect...
Ansi qu'un table de configuration des personnage:
Genre le nombre d'emplacement disponible par sac ect...

Si oui, dois-je créer une entrée au sein de la table par emplacement disponible dans l'inventaire ou puis-je compresser les données au sein d'une seule entrée tout en conservant la possibilité d'éditer une partie des informations qui y sont contenues (lors de la suppression d'un objet de l'inventaire par exemple). Je dois préciser qu'il sera possible d'augmenter le nombre d'emplacement d'inventaire disponible. 


Je vais me faire chialler après j'imagine mais je mettrais tous les ids des objet possèder dans le meme champ avec un split(';', $var);
Peutaire les séparer par sac dependament de ta vision.

Pour cela il faut tenir compte aussi du fait que je dois aussi utiliser les objets au sein de l'inventaire afin de les équiper sur mon personnage (casque) ou de les consommer (potion par exemple).


D'ou lutilisation d'un split pour traiter et enlever les objets sans devoir créer/supprimer un nouvelle insert a chaque utilasation.


Personnelement je ne couperais pas en 2 la table des objets + code pour rien je crois.

Pour finir tu peut developper un peu comment tu fais le moteur de jeux sa m'interresse.
Commenter la réponse de Dav_c
Dav_c 194 Messages postés dimanche 25 janvier 2004Date d'inscription 11 décembre 2015 Dernière intervention - 25 nov. 2010 à 03:06
0
Utile
A oui aussi si tu veut un exemple essait de faire un serveur priver world of warcraft...

Ils function justement par db
Commenter la réponse de Dav_c
monoski 132 Messages postés mercredi 15 avril 2009Date d'inscription 13 mai 2013 Dernière intervention - 25 nov. 2010 à 21:10
0
Utile
Merci très sympas pour les infos, tu peux m'en dire un petit peu plus sur le split le fonctionnement de cette fonction ? Puis je récupérer chaque objet sous forme de constante par la suite ?

En fait tu as décris le type de bdd à laquelle je pensais mais la fonction split dont tu me parles pourrait solver tous mes problèmes merci :-)
Commenter la réponse de monoski
monoski 132 Messages postés mercredi 15 avril 2009Date d'inscription 13 mai 2013 Dernière intervention - 26 nov. 2010 à 12:30
0
Utile
Ce schéma semble optimisé et tu as l'air de savoir de quoi tu parles.

Petite question, dans la table character has items, en fait à chaque fois qu'un objet est acquis par un individu je fais une nouvelle entrée dans la table, après je spécifie dans la table characters le nombre d'objet maximum ramassable, sachant que je vais faire en sorte que l'empilage de certains objets soit possible (ça ce sera géré en php).

Ou bien j'ai rien compris et dans la table character has items tu fais une ligne par character ?

D'autre part, je maîtrise pas du tout le joint (j'ai très peu d'expérience dans les bdd et j'ai toujours fais des doubles requêtes pour arriver à mes fins sachant pertinemment qu'une solution plus "propre" existait, pourrais tu me faire un petit exemple en utilisant les tables et les id présents en l'espèce ? (Je t'en demande beaucoup mais un exemple sera plus explicatif que toute les sources du web).

D'autre part, pour ce qui est de la table effects ça me parait un peu juste puisque à part le nom rien n'est pris en compte, enfin on peut pas déterminer à partir de la bdd quel sera l'effet concret de l'objet, dois-je en conclure que le traitement des effets se fait à partir d'une page php qui assignerait à chaque nom ou id d'effet un effet réeel, ou bien la table est incomplète et je dois rajouter ce qui me semble judicieux en son sein ?

Je te remercie énormément pour ton travail, puis-je savoir à l'aide de quel logiciel tu as pu matérialiser ce magnifique petit schéma ? :-) Je ne suis qu'un petit programmeur amateur, juriste et j'ai pas énormément de temps, j'admire l'aide complète que tu m'as apporté. Merci beaucoup !

Bonne journée à tous =)
Commenter la réponse de monoski
TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention - 26 nov. 2010 à 13:50
0
Utile
dans la table character has items, en fait à chaque fois qu'un objet est acquis par un individu je fais une nouvelle entrée dans la table

Tout à fait.

après je spécifie dans la table characters le nombre d'objet maximum ramassable

Seulement si c'est aléatoire. En effet, si ce nombre est fixe ou peut être calculé, alors
il ne faut pas lui faire un champ spécifique.

pourrais tu me faire un petit exemple en utilisant les tables et les id présents en l'espèce ?

Juste pour faire la remarque, une petite erreur s'est glissée dans la table Items_has_Effects : le champ Items_Item_types_id ne doit pas être présent (soucis de table auto-générée). J'ai également ajouté quelques tuples afin de tester tout ça. Ceci dit, voici quelques exemples :

Sélectionner le nom de chaque personnage ainsi que sa race :
mysql> SELECT Characters.name AS 'name', Races.name AS 'race' FROM Characters INNER JOIN Races ON Characters.Races_id = Races.id;
+--------------+--------+
| name         | race   |
+--------------+--------+
| Loveandpeace | Pony   |
| Blastator    | Goblin |
+--------------+--------+
2 rows in set (0.00 sec)


Sélectionner le nom de tous les items dont dispose un personage donné, ainsi que le type de l'objet et sa quantité.
mysql> SELECT
    ->  Items.name AS 'Item',
    ->  Item_types.name AS 'type',
    ->  Characters_has_Items.quantity AS 'quantity'
    -> FROM (((Characters INNER JOIN Characters_has_Items
    -> ON Characters.id = Characters_has_Items.Characters_id)
    ->    INNER JOIN Items
    ->    ON Characters_has_Items.Items_id = Items.id)
    ->       INNER JOIN Item_types
    ->       ON Items.Item_types_id = Item_types.id)
    -> WHERE Characters.id = 1;
+---------------------------+--------+----------+
| Item                      | type   | quantity |
+---------------------------+--------+----------+
| Shield of the undead pony | shield |        1 |
| Fire sword                | fire   |        1 |
+---------------------------+--------+----------+
2 rows in set (0.00 sec)
mysql> SELECT
    ->  Items.name AS 'Item',
    ->  Item_types.name AS 'type',
    ->  Characters_has_Items.quantity AS 'quantity'
    -> FROM (((Characters INNER JOIN Characters_has_Items
    -> ON Characters.id = Characters_has_Items.Characters_id)
    ->    INNER JOIN Items
    ->    ON Characters_has_Items.Items_id = Items.id)
    ->       INNER JOIN Item_types
    ->       ON Items.Item_types_id = Item_types.id)
    -> WHERE Characters.id = 2;
+------------+------+----------+
| Item       | type | quantity |
+------------+------+----------+
| Pony dress | cold |        3 |
+------------+------+----------+
1 row in set (0.00 sec)


Sélectionner tous les effets dont dispose un perso donné, donc aussi bien les effets raciaux que les effets des objets.
mysql> SELECT Effects.name AS 'Effect'
    -> FROM (((Characters
    ->    INNER JOIN Races
    ->    ON Characters.Races_id = Races.id)
    ->       INNER JOIN Races_has_Effects
    ->       ON Races.id = Races_has_Effects.Races_id)
    ->          INNER JOIN Effects
    ->          ON Races_has_Effects.Effects_id = Effects.id)
    -> WHERE Characters.id = 1
    -> 
    -> UNION
    -> 
    -> SELECT Effects.name AS 'Effect'
    -> FROM ((((Characters
    ->    INNER JOIN Characters_has_Items
    ->    ON Characters.id = Characters_has_Items.Characters_id)
    ->       INNER JOIN Items
    ->       ON Characters_has_Items.Items_id = Items.id)
    ->          INNER JOIN Items_has_Effects
    ->          ON Items.id = Items_has_Effects.Items_id)
    ->             INNER JOIN Effects
    ->             ON Items_has_Effects.Effects_id = Effects.id)
    -> WHERE Characters.id = 1;
+-------------+
| Effect      |
+-------------+
| kamiblast   |
| poney power |
| bonus X     |
| karapatate  |
+-------------+
4 rows in set (0.00 sec)


D'accord ça fait des grosses requêtes mais :
- Avec un peu d'habitude ça s'écrit facilement et rapidement.
- C'est carrément plus simple, plus rapide et plus propre que de gérer ça manuellement avec PHP (ou autre) derrière.
Commenter la réponse de TychoBrahe
monoski 132 Messages postés mercredi 15 avril 2009Date d'inscription 13 mai 2013 Dernière intervention - 26 nov. 2010 à 14:09
0
Utile
Aïe là j'ai un petit soucis conceptuel, tu envoies directement tes requête mySQL, moi je passais uniquement par PHP pour faire ça, comment peux tu faire en sortes d'envoyer directement la requête sans passer par un formulaire php (enfin j'utilise AJAX pour que ça soit agréable visuellement mais bon c'est du php au final).

D'autre part, pour ce qui est de la table effects ça me parait un peu juste puisque à part le nom rien n'est pris en compte, enfin on peut pas déterminer à partir de la bdd quel sera l'effet concret de l'objet, dois-je en conclure que le traitement des effets se fait à partir d'une page php qui assignerait à chaque nom ou id d'effet un effet réeel, ou bien la table est incomplète et je dois rajouter ce qui me semble judicieux en son sein ?
Bonne journée à tous =)
Commenter la réponse de monoski
TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention - 26 nov. 2010 à 14:10
0
Utile
Au fait, si tu veux t'entraîner, je met en ligne ce que j'ai utilisé comme exemple :
Fichier SQL (avec les tuples)
Fichier MySQL Workbench
Commenter la réponse de TychoBrahe
TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention - 26 nov. 2010 à 14:17
0
Utile
Aïe là j'ai un petit soucis conceptuel, tu envoies directement tes requête mySQL, moi je passais uniquement par PHP pour faire ça, comment peux tu faire en sortes d'envoyer directement la requête sans passer par un formulaire php (enfin j'utilise AJAX pour que ça soit agréable visuellement mais bon c'est du php au final).

Tu envoie tes requêtes comme tu l'a fait avant, ce n'est pas parce que j'ai utilisé la console mysql que ça t'empêche de faire autrement.

ou bien la table est incomplète et je dois rajouter ce qui me semble judicieux en son sein ?

C'est cela, c'était juste un exemple minimaliste que j'ai pris, donc forcément incomplet (d'autant plus que je ne sais pas ce que tu recherches exactement).

Sinon petite parenthèse : pour concevoir ses tables, MySQL Workbench c'est bien !
Commenter la réponse de TychoBrahe
monoski 132 Messages postés mercredi 15 avril 2009Date d'inscription 13 mai 2013 Dernière intervention - 26 nov. 2010 à 14:52
0
Utile
Merci c'est super, je vais m’entraîner en faisant quelques requêtes je te montrerai le résultat final, c'est assez sommaire pour le moment car le design du site est pas fait à proprement parler. Me faudra un graphiste après pour dessiner quelques items je pense...

Encore pas mal de boulot :p Puis j'ai rien de bon niveau sécurité ça fait que je me fais régulièrement hacker par un russe qui m'insère des scripts malicieux dans mes pages...

Faut que je revois tous les formulaires etc... D'ailleurs toi qui t'y connais pas mal tu connaîtrais pas un bon petit site en ce qui concerne la sécurité d'un site internet ? :-)

Bonne journée à tous =)
Commenter la réponse de monoski
TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention - 26 nov. 2010 à 15:08
0
Utile
D'ailleurs toi qui t'y connais pas mal tu connaîtrais pas un bon petit site en ce qui concerne la sécurité d'un site internet ?

2010 CWE/SANS Top 25 Most Dangerous Software Errors
Commenter la réponse de TychoBrahe

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.