JeuWeb - Crée ton jeu par navigateur
[REGLE]Gerer des ressources ayant des caractéristiques differentes - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [REGLE]Gerer des ressources ayant des caractéristiques differentes (/showthread.php?tid=2174)

Pages : 1 2


[REGLE]Gerer des ressources ayant des caractéristiques differentes - Ogham - 22-12-2007

Bonsoir,

Je sors un peu de ma réserve, n'ayant pas le même niveau de compétences que certains ici, du moins je le crois, je ne peux pas apporter grand chose en terme de contribution pour le moment, ajoutez à cela un zeste de timidité mal contrôlée, même en étant anonyme planqué derrière son écran,si si ça existe ...
mais cela ne m'empêche pas de suivre très régulierement les discussions qui ont lieu et j'apprends d'ailleurs beaucoup de choses ... beaucoup de pistes à creuser.

Donc mon projet avance tout doucement mais je n'ai toujours rien de bien concret à présenter.
Je réfléchis et j'écris beaucoup et code très peu pour le moment.

Ceci étant dit j'aurais besoin de quelques conseils éclairés et si possible d'un exemple éclairant.

Voilà ce qui m'occupe actuellement:
Je réfléchis à un système de craft qui soit un tant soit peu ludique et pour ça j'aimerais donner la possibilité aux joueurs de créer des objets "uniques" ou du moins fortement personnalisés.

Pour ce faire ils auraient à leur disposition de nombreuses ressources elles aussi ayant des caractéristiques plus ou moins uniques ou du moins non déterminées à l'avance.
Un même type de ressource pouvant donc avoir des caractéristiques différentes.

Un exemple:
Un artisan qui craft des bâtons ou des manches d'outils peu importe a besoin de bois.
Nous avons donc un bucheron qui coupe du bois pour lui.

dans la foret du coin on trouve différentes essences de bois:
- Certaines sont plus rares que d'autres.

- Chaque essence à la particularité d'être associée à un des quatre éléments - terre - feu -air - eau - (qui donnera certaines propriétés aux objets craftés avec cette essence).
Cette "charge élémentaire" peut être plus ou moins élevée.

- enfin indépendamment des essences on trouve dans cette foret des bois de plus ou moins bonne qualité.

Notre bucheron lui a certaines capacités qui sont développées par le joueur et évoluent donc dans le temps.
- La force : un bucheron ne peut pas couper un arbre ayant une "charge élémentaire" supérieure à sa force.

- L' observation: détermine la probabilité de trouver une essence rare.

- L'endurance: détermine le nombre de coupes réalisables en un tour
Notre bucheron est géré comme un bâtiment de production a chaque tour il remplis sa réserve avec ce qu'il a récolté.

Donc pour l'exemple notre bucheron a:
force : 110 points
observation : 40%
endurance : 5 donc 5 coupes par tour.

donc pour calculer sa production je ferais une boucle
je vous demanderais plus tard s'il n'y a pas une meilleur solution parce que tel que pensé là ça fait beaucoup de requêtes je trouve

En français ou presque:
Citation :tant que $nb_coupe < 5
{
// on détermine si l'essence trouvée est rare ou non (40% de chance)
On génère un nombre au hasard entre 1 et 100
if le nombre est compris entre 1 et 40
{
on va piocher une essence rare dans la bdd => un cèdre du Liban
}
else
{
on pioche une essence courante => un bouleau élément eau
// notre bucheron n'a pas trouvé d'essence rare et a pioché un bouleau
$essence=bouleau
$element=eau
}
$charge_elementaire=un nombre au hasard entre 1 et $forcedubucheron
ex : $charge=52

$qualité = un nombre au hasard entre 1 et 100
ex: $qualité= 60%

on a donc un bouleau de charge élémentaire 52 et de qualité 60%
et on recommence 5 fois
}
Il est donc possible et fortement probable d'avoir 5 bouts de bois dont les caractéristiques sont différentes mais il est également possible qu'il y en ai plusieurs pareils tout comme il est possible qu'il y ai déjà des essences aux caractéristiques similaires dans la réserve.

donc pour l'insertion dans la bdd il faut d'abord rechercher si c'est le cas et updater le champ quantité ou dans le cas contraire créer une nouvelle entrée.

a priori la table réserve ressemblerait à ça
id
id_essence
id_element
charge_element
qualite
quantite.


Ce qui fait 15 requêtes dans cette malheureuse boucle et beaucoup plus si notre bucheron est très endurant.
Si en plus il y a plusieurs bucherons ...
De plus " on ne fait pas de requêtes dans une boucle malheureux !!!"
Du coup je ne vois pas trop comment procéder pour faire proprement cette mise à jour de production.

Je ne demande pas qu'on le code à ma place mais qu'on m'explique quelle est la meilleure méthode.

je pressens que la solution pourrait avoir un rapport avec ça quoi que je ne suis pas sure que ça convienne dans ce cas:

Citation :Il faut en fait construire la chaîne de caractère de la requête à l'aide d'une boucle et ensuite la donner en argument à un mysql_query() : ça te permet de garder un nombre correct de requête pour la mise à jour puisque deux suffisent.

Citation :Ce qu'il veut dire c'est qu'il faut éviter de mettre une requête dans la boucle. Car çà feras en fait n requête si la boucle est exécutè n fois...

Pour ce faire il te propose de créer une unique grosse requête avec ta boucle et de l'exécuter après celle ci. La requête généré par la boucle étant une chaine de caractere

De plus si c'est bien dans ce sens là qu'il faut creuser, un petit exemple concret ne serait pas de refus car j'ai beau y réfléchir je ne comprend pas comment faire.
Et ça ne règle pas la question de l'update qui vient se claquer en plein milieu :heuuu: enfin à vrai dire je n'en sais rien puisque je ne comprends pas.

je vous remercie pour votre aide.
Et pardon pour le pavé.


RE: Gerer des ressources ayant des caractéristiques differentes - Harparine - 22-12-2007

oxman a écrit :Je ne vais pas te demander d'aller te présenter puisque tu as fait un joli message en tout point ;o)

Tu es modérateur ? Tu as vérifié si Ogham s'était déjà présenté ?
Non, alors je pense que tu peux te passer de ce genre de remarque inutile...

Ogham, je crois que j'utiliserais des tableaux, personnellement. Le principe est le suivant (c'est un code fictif, je trouve plus lisible que les mots clés en français) :

Code PHP :
<?php 
//Connexion BDD
//On récupère les essences rares et on les stocke dans un array :
$aEssencesRares = new array();
$oRares = mysql_query("SELECT nom FROM arbres WHERE essence='rare'");
while (
$aRares = mysql_fetch_array($oRares)) {
$aEssencesRares[] = $aRares['nom'];
}
// ... On fait la même chose avec les essences normales dans le tableau $aEssencesNormales ...[/code]

// Ensuite, on récupère à chaque fois une essence pour la stocker dans un autre tableau :
$aProduction = new array();
for (
$i = 0; $i < $iNbCoupe; $i++) {
$iRarete = rand(1, 100);
if(
iRarete <= 40) {
//On ajoute l'arbre choisi dans le tableau de production
$aProduction[$i] = array_rand($aEssencesRares);
} else {
// ... Même topo avec les essences normales
}
}

//A la sortie de la boucle, tu te retrouves avec un tableau contenant les arbres coupés.

Il y a sans doute des fautes, je n'ai pas testé ma syntaxe, mais l'idée est là. Tu peux même optimiser ta requête pour en faire une seule pour récupérer les deux essences d'arbres.
Enfin, je sais qu'il est possible de faire des insertions multiples mais je laisse les pros de mysql le confirmer.
Ce qui te ferait seulement 2 requêtes au total.
@+


RE: Gerer des ressources ayant des caractéristiques differentes - Ogham - 22-12-2007

Bonjour,

@Oxman
puisqu'il semble que tu sois passé à côté => ma présentation Wink

Citation :J'ai peut-être mal lu mais pourquoi ça fait 15 requêtes ? J'en lit 10.
Une pour l'essence de la BDD, une pour enregistrer le bout de bois.
Une pour vérifier si un bout de bois similaire est déjà enregistré dans la bdd avant de créer une nouvelle entrée si besoin.

Enfin bref comme finalement je ne vais probablement pas procéder de cette manière ça n'a que peu d'importance.

enfin pour réponde sur le fond
Citation :Mais tu peux aussi revisiter ton principe, car il faut penser à quelque chose quand tu élabores un principe, ça ne sert à rien d'avoir un principe qui est lourd en code si le résultat n'est finalement pas aussi intéressant que le code est lourd.

Par exemple, bien tu auras des objets personnalisé, mais à quoi ça va servir ?
Est-ce qu'un objet personnalisé va vraiment être intéressant ? Où en fait cette personnalisation ne servira à rien ?
Si elle sert est ce que c'est équilibré ? Où bien est ce que tous les objets personnalisé d'une tel façon seront plus efficaces que d'autres ?

Cette personnalisation sera utile oui sinon quel intérêt ?
pourquoi ?
parce que les joueurs peuvent choisir pour leur aventurier l'objet qui lui correspondra le mieux en fonction de ses compétences, de ses envies, de ses finances du moment.

parce que cela transforme le système de craft qui est bien trop souvent une activité de production d'objets standards à la chaine, invendables de surcroit, car tous le monde produits les mêmes.
Et comme tous le monde veut "l'Uber épée niv 140 ++" fabriquée par "l'uber artisan niv 220" alors que le pauvre artisan qui débute est condamné à produire sa petite épée en fer niv 2 dont personne ne veut en boucle pour atteindre enfin le niv 220 et se retrouver enfin en concurrence avec une flopée de clones qui vendent la même chose que lui .
pas étonnant que la profession d'artisan soit délaissée dans ce cas.

là au moins la profession d'artisan est une prof de recherche où l'on est pas condamné à faire toujours la même chose.
On peut même travailler à la commande pour faire le bâton qui va bien pour cet aventurier là en particulier.
Un petit bâton cool mais pas trop puissant pour un petit aventurier qui chasse le lapin sauvage des montagnes et l'uber bâton "delamort-qui-tue-et-qui-coute-la-peau-des-fesses" pour le gros balaise qui veut buter des ours niv 360.

Ce qui fait aussi que la prof de collecteur de ressource est un peu plus intéressante aussi car non monotone et évolutive.

ce qui donne de l'intérêt au commerce et à la diplomatie puisqu'on a tout intérêt à nouer de bonnes relations avec l'artisan du coin pour qu'il nous fasse l'objet de nos rêves pour un peu moins cher qu'une fortune.

Enfin bref c'est en quelque sorte la base de mon projet.
Et la description de cette partie fait plusieurs dizaines de pages au bas mot.

Quand à l'équilibrage de nombreux paramètres entent en jeu et à priori cela me semble faisable.
voilà Smile

@Hasparine

Je te remercie c'est en effet beaucoup plus simple comme ça et je vais essayer de faire quelque chose d'approchant.
Il faut vraiment que je révise mes cours sur les arrays car ça ne coule pas toujours de source pour moi.
Je vais faire quelques recherches pour les insertions multiples.

Je vous remercie pour vos réponses.
Et si quelqu'un a d'autre propositions ... ou des question sur le projet.

Bonne journée.


RE: Gerer des ressources ayant des caractéristiques differentes - Ogham - 23-12-2007

Bonjour,

voilà, j'essaie de tester le petit bout de code proposé par Harparine et je rencontre un problème.

Je dois vous dire toute que je n'ai pas l'habitude de manipuler les arrays de cette manière et je n'ai pas trouvé sur le web de tutoriaux clairs qui vont un peu plus loin que les bases de construction des tableaux php (si vous avez un lien ?)

donc j'ai juste copié cette petite portion de code pour voir ce que ça donne et essayer de comprendre mais ça m'affiche une erreur.

Code PHP :
<?php 
$aEssencesRares
= new array();
$oRares = mysql_query("SELECT nom FROM arbres WHERE essence='rare'");
while (
$aRares = mysql_fetch_array($oRares)) {
$aEssencesRares[] = $aRares['nom'];
}

j'ai fais la petite table qui va avec et y ai mis quelques infos pour le test

voilà l'erreur:
Parse error: syntax error, unexpected T_ARRAY, expecting T_STRING or T_VARIABLE or '$' in ****** on line 147

la ligne 147 c'est la première.
quelqu'un pourrait m'expliquer ce qui ne vas pas et si possible me dire ce que font exactement ces deux lignes ?

Code PHP :
<?php 
$aEssencesRares
= new array();
$aEssencesRares[] = $aRares['nom'];

je suppose que la première crée un array vide et la seconde le rempli avec les noms piochés dans la base c'est bien ça ?

et enfin une dernière question idiote
comment afficher le resultat ? ce $aEssencesRares[] = $aRares['nom'] ça me perturbe .

merci pour votre aide.[/php]


RE: [REGLE] Gerer des ressources ayant des caractéristiques differentes - Ogham - 23-12-2007

Bon finalement j'ai compris ce qui clochait et j'ai réussi à faire fonctionner ce bout de code et je pense savoir comment faire l'insert multiple (j'ai pas testé).

cependant comme il faudrait en plus vérifier s'il y a des ressources en double dans le tableau et dans la table réserve avant de faire l'insertion dans la base ça devient compliqué je vais donc modifier un tout petit peu le mode d'attribution des ressources.

En tout cas cela m'a permis de me familiariser un peu mieux avec les arrays c'est déjà une bonne chose.


RE: [REGLE]Gerer des ressources ayant des caractéristiques differentes - Harparine - 24-12-2007

Pardon, je pensais t'avoir répondu tout à l'heure mais mon message ne semble pas avoir été posté. En résumé :

- La première ligne était bien la déclaration de tableau vide mais le new est en trop (j'ai confondu avec la syntaxe de flash).
- Ensuite, la ligne $aEssencesRares[] = $aRares['nom']; permet d'insérer le contenu de l'entrée de la base de données dans le tableau $aEssencesRares. Puisque l'on boucle sur toutes les entrées sélectionnées, ça permet de créer un tableau contenant toutes les essences rares de bois, afin d'éviter de recommencer un select à chaque coupe pendant la journée de travail de notre sympathique bucheron (on économise des requêtes).

Sinon, la meilleure doc sur les arrays est dans le manuel (php.net). Je ne suis pas développeur pro mais j'espère que ma méthode t'a tout de même servie un peu.

@+


RE: [REGLE]Gerer des ressources ayant des caractéristiques differentes - Ogham - 24-12-2007

Oui merci Harparine j'avais finalement trouvé qu'il fallait retiré le new devant array et une fois ce petit problème réglé je me suis un peu amusé à triturer tout ça, et du coup j'ai bien compris le système qui me resservira c'est sure.

merci pour ton aide Smile


RE: [REGLE]Gerer des ressources ayant des caractéristiques differentes - jo_link_noir - 24-12-2007

Il y a de multiple fonctions sur les array, dont une pour effacer les doublons.
array_unique - supprime les doublons d'un tableau
je pense que celle te convient Wink


RE: [REGLE]Gerer des ressources ayant des caractéristiques differentes - Ogham - 24-12-2007

merci j-12
je vais regarder ça de plus près.

cependant je ne peux pas supprimer les doublons car cela veut dire que mon joueur perd une de ses récoltes dans ce cas.
En fait s'il y a un doublon il faudrait mettre à jour un champ quantité dans la table réserve au lieu de créer une nouvelle entrée.ce qui fais une nouvelle requête et je dois bien avouer que je ne sais pas où la mettre celle ci.

Donc je pense que je vais plutôt modifier un poil le système de récolte.
au lieu de récolter des arbres x et y et z en un tour mon joueur aura des arbres x ou y ou z au premier tour pareils au suivants.
Ce qui ne change pas grand chose finalement.


RE: [REGLE]Gerer des ressources ayant des caractéristiques differentes - Harparine - 24-12-2007

Sinon, tu fais une requête pour savoir quelles essences possède le perso dans son équipement. Après, en faisant quelques comparaisons avec la production contenue dans le tableau, tu sauras si tu dois faire un insert (nouvelle essence) ou un update (quantité ++). Ca demande un peu de boulot mais si tu te fais un bonne fonction tu peux vraiment gagner du temps et faire un truc de qualité.