JeuWeb - Crée ton jeu par navigateur
Gestion des ressources - 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 : Gestion des ressources (/showthread.php?tid=3446)



Gestion des ressources - Reaven - 27-12-2008

Bonjour,

Si je poste dans cette section ce n'est surement pas pour bavarder de tout et de rien ^^ mais parce que j'ai un petit soucis avec mon script "Gestion des ressources".

Avant-propos

Ce qu'il vous faut savoir avant tout, ce sont quelques informations à propos de mon script. Bon tout est dans le titre Wink mais je préfère pérciser. Le but de ce script est de gérer les ressources de chaque utilisateurs.

Dans mon projet qui est en vue et dont le développement vient tout juste de commencer, j'ai introduit 4 ressources différentes à savoir:
  • Or
  • Bois
  • Pierre
  • Nourriture

Chaque ressources est individuellement produite par un bâtiment spécifique. Les fermes s'occuperont de produirent la nourriture alors que les mines produiront l'or, les carrières les pierres et enfin les scieries le bois.

J'ai introduit dans ma table principale "nil_membres" divers champs que voici:
  • membre_id
  • membre_seigneur
  • membre_ressource_or
  • membre_ressource_bois
  • membre_ressource_pierre
  • membre_ressource_nourriture
  • membre_mine_niveau
  • membre_carriere_niveau
  • membre_ferme_niveau
  • membre_scierie_niveau
  • membre_timestamp

Et dans une autre table "nil_batiments" les champs suivants:
  • batiment_id
  • batiment_nom
  • batiment_coef_prod
  • batiment_prod ( >>> production de base <<< )

J'ai ensuite pour les tests insérée un enregistrement dans ma table "nil_batiments":
  • "1"
  • "Carrière"
  • "2.5"
  • "30"

Et dans ma table '"nil_membres":
  • "1"
  • "Valkan"
  • "500"
  • "1000"
  • "1000"
  • "500"
  • "0"
  • "0"
  • "0"
  • "0"
  • dernier timestamp enregistré

Enfin, j'ai écrit le code dans un fichier externe que j'incluerai dans les pages où j'afficherai les ressources (toutes ^^).

Mon problème:

Voilà mon problème est que le champ "membre_ressource_pierre" ne change pas au fil du temps. La valeur reste toujours à "1000".

Mes pages:

Voici donc les deux pages que j'ai créée pour les tests.

Le script de gestion:
Code PHP :
<?php
session_start
();

if(!isset(
$_SESSION['id'])) {
header("Location: ../index.php");
}
else {
require_once(
"../includes/config.php");
mysql_connect($server,$user,$pass);
mysql_select_db($database);

$ressources_joueur= mysql_query("SELECT membre_ressource_or, membre_ressource_bois, membre_ressource_pierre, membre_ressource_nourriture,
membre_timestamp, membre_carriere_niveau FROM nil_membres WHERE membre_id='"
.$_SESSION['id']."'")or die(mysql_error());
$batiment_carriere= mysql_query("SELECT * FROM nil_batiments WHERE batiment_nom='Carrière'")or die(mysql_error());
$tableau_ressource= mysql_fetch_array($ressources_joueur);
$tableau_batiment= mysql_fetch_array($batiment_carriere);

$temps_actuel= time();
$temps_ancien= $tableau_ressource['membre_timestamp'];
$temps_ecoule= $temps_actuel - $temps_ancien;

$production_pierre= floor((((($tableau_batiment['batiment_coef_prod']*$tableau_ressource['membre_carriere_niveau'])*10))+$tableau_batiment['batiment_prod'])/3600)*$temps_ecoule;
$ressource_pierre= $production_pierre + $tableau_ressource['membre_ressource_pierre'];

mysql_query("UPDATE nil_membres SET membre_ressource_pierre='$ressource_pierre', membre_timestamp='$temps_actuel' WHERE membre_id='".$_SESSION['id']."'")or die(mysql_error());
}
?>

La page d'affichage:
Code PHP :
<?php    
include("../includes/head.php");
include(
"../includes/menu.php");
include(
"gestion-ressource.php");
?>

<h3><strong>Votre Royaume: <?php echo $tableau["membre_citee"];?></strong></h3><br>
<table id="royaume" align="center" width="400" style="border:1px solid black">
<td align="center">Or: <?php echo $tableau_ressource['membre_ressource_or'];?></td>
<td align="center">Bois: <?php echo $tableau_ressource['membre_ressource_bois'];?></td>
<td align="center">Pierre: <?php echo $tableau_ressource['membre_ressource_pierre'];?></td>
<td align="center">Nourriture: <?php echo $tableau_ressource['membre_ressource_nourriture'];?></td></td>
</table>

<?php include("../includes/footer.php");?>

Voilà où j'en sui et je ne trouve pas d'erreurs dans mon code. Elle peut provenir du calcul de production comme de mes requêtes ou autre mais je ne vois rien.

Merci,
Dark Angels


RE: Gestion des ressources - wild-D - 27-12-2008

si t'as production est "fixe" (au sens ou elle est pas aléatoire, mais qu'elle se fait à un rythme régulier)
tu dois plutot stocker le stock s à un temps t (donc 2 champs).

et ensuite tu calculeras ton stock réel en ajoutant au stock initial ce qui a été produit entre temps. (tu t'amuse pas à faire la mise à jour du stock s et du temps t dans la bdd sans arrêt^^; tu ne le fais que quand c'est nécessaire: dépense de ressources pour un achat, changement du rythme de production du fait construction/destruction batiment, etc... ).

l'avantage du système est simple; tu fais une requête à la bdd à la connection pour récupérer s et t (et à 2-3 autre moment sensible), idem pour la production. que tu stock ensuite en session.
après à chaque affichage tu fais le calcul temps réel du stock courant = s + ( now - t) * production.

---
edit: moi pas lu correctement question >_<; mais le concept expliqué reste vrai.

>> dans ton code y a un truc sur; c'est que tu as un floor () d'un truc divisé par 3600... autant dire que si tu as pas assez de broduction (niveau carrière et autre truc), le floor va faire que tu auras: 0 * multiplié par temps = 0... donc ta produc vaudra toujours 0.

c'est pas un problème de code mais de conception de tes formules :p


RE: Gestion des ressources - Reaven - 27-12-2008

Ca me semble assez compliqué ton truc ^^. Je pense pas avoir saisit. Mais maintenant si je veux garder mon code, où pourrais être l'erreur ?


RE: Gestion des ressources - wild-D - 28-12-2008

-_-' ce que je propose n'a rien de compliqué; ça revient à faire en gros ce que tu fais; sans le UPDATE à chaque page. (ça sera donc plus léger pour le serveur).

reprend t'as formule;
$production_pierre= floor((((($tableau_batiment['batiment_coef_prod']*$tableau_ressource['membre_carriere_niveau'])*10))+$tableau_batiment['batiment_prod'])/3600)*$temps_ecoule;

tu connais la fonction echo ou var_dump ?; ben quand t'as un problème; tu peux t'en servir pour afficher ce qui va pas; genre les variables utilisées dans ton clacul.
ça devrait te donner un truc du genre:

$tableau_batiment['batiment_coef_prod'] = 2.5
$tableau_ressource['membre_carriere_niveau'] = 0
$tableau_batiment['batiment_prod'] = 30
$temps_ecoule = XYZ

$production_pierre = 0

je te laisse faire le calcul à la mimine pour comprendre pourquoi t'as bien zéro.
Tes erreurs, elles sautent aux yeux.

p.s.
"Mais maintenant si je veux garder mon code, où pourrais être l'erreur"
je t'avais déjà mis le nez dessus dans mon précédent message.
compte pas sur moi pour te refiler une formule en préfabriqué; ça t'apportera rien; à la prochaine formule tu referas la même erreur en croyant que t'as pas à faire de math parce que l'ordi calculera tout seul. Alors qu'un ordi est incapable de faire une addition correctement !


RE: Gestion des ressources - Reaven - 28-12-2008

Ok dsl je n'avais pas lu le edit que tu as écrit après ma réponse. D'après ce que tu dis c'est le floor qui pose problème mais j'avais déjà au départ écrit mon code et testé celui-ci sans le floor. Le problème reviens toujours. Maintenant je vais essayer d'utiliser le concept de ton premier message mais je cherche toujours une solution à mon problème Wink .

--------------------
EDIT: c'est bon j'ai trouvé le problème. Il venait d'un accent.


RE: Gestion des ressources - sulu_03 - 15-01-2009

Quand tu affiche le résultat de la formule sans le floor directement après le calcul (avec un echo par exemple) as tu un nombre a virgule ?

Si tu as 0, tu as peut être un 0 qui traine dans ta formule et qui fait que le résultat vaut 0.

Si tu as un résultat a virgule, cherche du coté de la base de donnée :
Peut être que tu as déclaré ton membre_ressource_pierre en INT.
A ce moment la, il me semble que mySQL coupe simplement la virgule, et que ça revient a faire un floor en php.
Si tu veux conserver la virgule, change le format du champ.
Moi j'aime bien le varchar parce qu'au moins tu stock ce que tu veux dedans...