[RESOLU] Une variable qui se vide en 48 heures

Eléphanteau du PHP | 14 Messages

07 oct. 2013, 23:46

Bonjour,

Alors voila, j'ai une variable dont ça valeur est 100 et se nomme "vie"

Je veux que cette variable se vide petite à petit jusqu'à 0 en 48 heures !

D’abord voici se que je voulais faire ;

Créer les 2 champs pour stocker la vie (int) et la date de mise à jour (datetime) FAIT
Au chargement de la page, récupérer ces 2 valeurs FAIT

Calculer le nombre de points perdus depuis la dernière mise à jour (DateTime::diff) NON
Mettre à jour la vie du joueur dans la bdd et la date de mise à jour (à NOW()) NON

J'ai réussi à mettre les deux premier, mais le calcule et tout ! Je sais pas comment faire.

Une des personnes m'as proposée de faire comme ça :
//On transforme la date de la dernière mise à jour en Objet DateTime
 
//On demande et transforme la date actuel en Objet DateTime
//On fait la différence des 2 dates
//On retourne la différence en secondes
//Calcul de la perte de point de vie (1 PDV de perdu en 1728 secondes) difference/1728
Mais, je n'est sais toujours pas comment faire se script !!

Merci d'avance.

Eléphant du PHP | 100 Messages

08 oct. 2013, 00:19

Bonsoir,

Je vais te proposer deux solutions, la première étant de faire tournée une tache cron toutes les minutes pour enlever -1minutes au datetime que tu as en bases.
La seconde méthode est de faire comme tu l'as dis par le calcul à la connexion :

tu récupères ton datetime en base de données tu le stock dans la variable $date,
si celui-ci n'est pas un objet datetime tu le transforme comme cela :
$date = new DateTime('2012-09-01 12:00:00"); ou est le temps que tu récupère en bdd
$dateNow = new \DateTime('now'));

Ensuite tu compares les deux dates :

$interval = $date->diff($dateNow);
$interval = $interval->format('s');

tu n'as plus qu'à diviser $interval/1728

J'espère que cela aura répondu à ta question.

Bien cordialement

ViPHP
ViPHP | 928 Messages

08 oct. 2013, 00:24

Tu dois déterminer combien de vie tu perds par seconde, c'est plus facile car comme cela tu peux directement travailler avec time() qui te renvoi un temps en secondes.

Pour calculer la vie utilisée par seconde :
$tempsMax = 48 * 3600; // 48 heures en secondes
$vieParSeconde = 100 / $tempsMax; // Tu divises ta vie (100) par 48h (en secondes) afin de savoir combien de vie disparait par seconde
Tu dois donc stocker en base la vie, ainsi que le temps. Lors de la prochaine connexion, tu regardes combien de différence en seconde il y a entre le moment présent et la dernière date d'enregistrement, puis tu multiplies ce nombre de secondes par le cout de vie par seconde :
$dernierTemps = ...; // Ici tu dois récupérer la dernière date de mise à jour
$tempsActuel = time(); // Moment actuel
$tempsEcoule = $tempsActuel - $dernierTemps; // Nombre de secondes écoulées depuis la dernière mise à jour
$viePerdue = $vieParSeconde * $tempsEcoule;
++

Edit : ah quelqu'un a été plus rapide :D

Mammouth du PHP | 2278 Messages

08 oct. 2013, 10:57

calculs faits, ça fait 0,0217 vie par seconde soit 1 vie toutes les 46 secondes 1/10 soit 10 vies toutes les 461 secondes ou 10,416 vies toutes les 8 minutes
Pourquoi ces calculs? pour déterminer un intervalle raisonnable de mise à jour:
toutes les 8 minutes retirer 10 vies, ou toutes les 10 minutes 13 vies (2 centièmes de vie non retiré: donc toutes les 50 fois retirer 14 vies au lieu de 13)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 14 Messages

08 oct. 2013, 18:06

Salut,

Je vous remercie pour vos réponses !!!

Donc, normalement je dois faire comme ceci ? :
$vie = $donnees['sante'];
 $date = $donnees['date_vie'];
 
 $date = new DateTime('2012-09-01 12:00:00');
$dateNow = new \DateTime('now');
$interval = $date->diff($dateNow);
$interval = $interval->format('s');
$interval/1728;

Eléphanteau du PHP | 14 Messages

08 oct. 2013, 21:45

Ah oui j'ai oublier, et pour faire perdre le membre des points de vie j'ai fait ça, mais ça ne marche pas *-*
$vie= - 1 / 1728;


Et ça marche pas : ' (

Mammouth du PHP | 2278 Messages

09 oct. 2013, 20:43

$vie= - 1 / 1728;
ca serait pas:
$vie -= 1 / 1728;
par Balthazar?

Quand tu hésites, fais afficher les résultats:
print "<br>vie: $vie";
ou var_dump($vie);
Si mon chat s'en mêle, on va s'emmêler les touches du clavier...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 14 Messages

09 oct. 2013, 21:25

Re ,

J'ai fait ce que tu m'as dit :
$vie -= 1 / 1728;
Puis :
print "<br>vie: $vie";
Et le résultat est :

vie: 99.999421296296

Mammouth du PHP | 2278 Messages

10 oct. 2013, 09:58

résultat normal 1/1728 = 0,000578704; tu n'as qu'à afficher la partie entière du résultat pour l'information:
"il ne vous restera bientôt plus que: partie entière"

Que représente ce 1728? (simple curiosité)?
Il faut environ 1750 mises à jour pour retirer une vie: une mise à jour toutes les 10 minutes
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

10 oct. 2013, 15:41

tu stockes le timestamp initiale partir de time()

Ensuite : ((48 * 60 * 60 + $initiale - time()) * 100) / (48 * 60 * 60) devrait te fournir le résultat

$initiale représente time() au début
48 * 60 * 60 représente 48 heures en seconde

Eléphanteau du PHP | 14 Messages

10 oct. 2013, 21:13

J'ai essayer, mais ne marche pas !!

Alors voici se que je suis actuellement entrain de faire, et je pense que je suis tout prés du but :
 $date = new DateTime('2012-09-01 12:00:00');
$dateNow = new \DateTime('now');
$interval = $date->diff($dateNow);
$interval = $interval->format('%s seconds');
$interval/1728;
$vie = $vie - $interval/1728;

print "<br>vie: $vie <br>";
print "<br>interval: $interval <br>";
Alors la le résultat :

vie: 99.970486111111

interval: 51 seconds

Puis la vie commence à se vider petite à petit ! Mais quand le temps et à 60 secondes, puis reviens à 0, la vie reviens à 100 aussi et redescend petite à petit !!

Aussi, si j'utilise :
 <?php 
{
  echo "".$donnees['sante']."";
  }
  ?>
Pour afficher la variable au membre, ça reste 100 même si en print "<br>vie: $vie <br>"; deviens 99 ou moins !

Merci d'avance !

Mammouth du PHP | 2278 Messages

11 oct. 2013, 09:05

Si c'est un script qui est lancé régulièrement puis fermé, il faudrait peut-être stocker la date initiale (puis la date de mise à jour) et la valeur de vie dans un fichier (ou dans une session mais ça risque de délirer en cas de crash ou de déconnexion)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 14 Messages

11 oct. 2013, 17:25

Salut, merci pour ta réponse

Je pense que maintenant ça marche, mais avec une grosse difficulté, je vais vous présenter le code que j'ai fait, et vous me dites si c'est bel est bien comme ça qu'il faut faire, ou faut changer :
 $vie = $donnees['sante'];
$date = $donnees['date_vie']; 

 if($vie >= '1') {

$date = new DateTime(''.$donnees['date_vie'].''); 
$dateNow = new \DateTime('now');
$interval = $date->diff($dateNow);
$interval = $interval->format('%s seconds, %i minutes, %h heures, %d jours, %y années');
$interval/1728;
$vie = $vie - $interval/1728;

$req = $db-> prepare('UPDATE personnages SET sante='.$vie.' WHERE perso_proprietaire = :login');
$req-> execute(array(
 'login' => $_SESSION['login']
 ));
  
  $req->closeCursor();

}

print "<br>vie: $vie <br>";
print "<br>interval: $interval <br>";
Aussi j'ai fait :
$number_1 = $vie;
$rounded_number_1 = round($number_1);
Pour afficher la variable en deux chiffres par exemple : 25 et non 25.12487564 etc

Pour finir, j'ai du changer la colonne de vie dans ma bd qui été en INT, à DOUBLE pour afficher la variable complète ! C'est normal ?

Eléphanteau du PHP | 14 Messages

11 oct. 2013, 19:59

Je peux savoir comment faire tournée une tache cron toutes les minutes pour enlever -1minutes au datetime ?!

Eléphanteau du PHP | 14 Messages

11 oct. 2013, 21:51

Bon, la méthode des crons est vraiment inutile !

J'ai enfin fait mon codes, je vous remercie infiniment !

Cependant, voici le code complet, pour aider d'autres gens :
<?php

 $vie = $donnees['sante']; // les données du membre 
$date = $donnees['date_vie']; // les données du membre 

$vie = 100;

$date = new DateTime(''.$donnees['date_vie'].''); 
$dateNow = new DateTime('now');
$interval = $dateNow->getTimestamp() - $date->getTimestamp();
$vie = $vie - $interval/1728;

$req = $db-> prepare('UPDATE personnages SET sante='.$vie.' WHERE perso_proprietaire = :login');
$req-> execute(array(
 'login' => $_SESSION['login']
 ));
  
  $req->closeCursor();	 
?>   
Merci encore ! Sujet résolu ...