JeuWeb - Crée ton jeu par navigateur
Bug script tours par tours - 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 : Bug script tours par tours (/showthread.php?tid=5002)

Pages : 1 2


Bug script tours par tours - vulcain - 21-07-2010




RE: Bug script tours par tours - Th3kid - 22-07-2010

Heu ... tu pourrais nous en dire plus sur le problèmes ?
Quand je test ton code je vois :
Code :
Vous venez de recevoir 7540000 et 7290010.

Chose qui me semble plus ou moins logique ...
Qu'est ce qui ne se passe pas ? Le code fonctionne parfaitement ...
Après la mise à jour dans la base de donnée ne correspond à rien, il y a tjs un apport par rapport aux 45dernières minutes calculée au début et non par apport par rapport au vrai temps réel!

Explique plus en détail ce que tu veux faire, je crois que ca sera plus simple Smile


RE: Bug script tours par tours - vulcain - 22-07-2010

Voilà le bug, comme tu l'as dit "Vous venez de recevoir 7540000 et 7290010" alors que ce message là doit s'afficher toutes les 45 minutes et doit afficher
"Vous venez de recevoir 50 000 gold et 1 tour". Et je veux que toutes les 45 minutes ça se rajoute par exemple à la somme actuelle du joueur, si le joueur possède 100 000 gold alors il en aura 150 000, et pareil pour le tour d'attaque.

Voici le petit code qui me permet d'afficher les ressources reçus :
Code PHP :
<?php 
echo"<br/><span id='barre1'>Gold : <font color='red'>".presentation($argentsarray['ors'],' ')."</font>
<br> Tours : <font color='red'>"
.presentation($argentsarray['tours'],' ')."</font></span>



RE: Bug script tours par tours - Globe - 22-07-2010

50000 ressources toutes les 45 minutes. Donc 2700 secondes dans 45 minutes donc 50000 / 2700 pour avoir ta production par seconde.

time() - 2700, donc tu obtiens le timestamp d'il y à 45 minutes. Si tu veux que la mise à jour ne s'opère que toutes les 45 minutes et pas en continu tu dois vérifier que cela fait plus de 2700 secondes que la dernière maj à été faite donc en gros.

Code PHP :
<?php 
$temps_actuel
= time();
$temps_ancien = $timestamp; // pioché dans la bdd
$temps_ecoule = $temps_actuel - $temps_ancien;
if (
$temps_ecoule >= 2700) {
$temps_maj = $temps_actuel-($temps_ecoule-2700); // on recupere la différence

mysql_query("UPDATE inscription SET ors=ors+50000,tours=tours+1, timestamp=$temps_maj WHERE pseudo='".$to['pseudo']."' ");
echo
"Vous avez gagné 50000 or et 1 tour.";
}

Tout simplement non ? Enfin possible que je me gourre complètement je fatigue sévère.


RE: Bug script tours par tours - vulcain - 22-07-2010

Merci à toi, mais ça ne fonctionne toujours pas :pleure2: ça m'affiche toujours "Vous venez de recevoir 7540000 et 7290010"

et mon code modifié :
Code PHP :
<?php 
// Initialisation des variables
$iRessourcesDepart = 250000; // Le joueur possède 250 000 or
$iProductionParSeconde = 2700; // Il en reçoit 50 000 toutes les 45 minutes
$iTempsDerniereModif = time() - (2 * 1350); // On va dire que la dernière mie à jour a été effectué il y a 45 min.

//on calcule le nombre de secondes écoulées depuis la dernière mise à jour
$iTempsActuel = time();
$iTempsEcoule = $iTempsActuel - $iTempsDerniereModif ;

// On calcule le nombre de ressources produites durant le temps écoulé
$iRessourceProduite = $iProductionParSeconde * $iTempsEcoule;

$iRessourceTotale = $iRessourcesDepart + $iRessourceProduite;

// Mise a jour dans la bdd
//[...]

// Initialisation des variables
$iTourDepart = 10; // Le joueur possède 10 tours
$iTourParSeconde = 2700; // Il en reçoit 1 toute les 45 minutes
$iTempsDerniereModif = time() - (2 * 1350); // On va dire que la dernière mie à jour a été effectué il y a 45 min.

//on calcule le nombre de secondes écoulées depuis la dernière mise à jour
$iTempsActuel = time();
$iTempsEcoule = $iTempsActuel - $iTempsDerniereModif ;

// On calcule le nombre de ressources produites durant le temps écoulé
$iTourProduit = $iProductionParSeconde * $iTempsEcoule;

$iTourTotale = $iTourDepart + $iTourProduit;

$temps_actuel = time();
$temps_ancien = $timestamp; // pioché dans la bdd
$temps_ecoule = $temps_actuel - $temps_ancien;
if (
$temps_ecoule >= 2700) {
$temps_maj = $temps_actuel-($temps_ecoule-2700); // on recupere la différence

mysql_query("UPDATE inscription SET ors=ors+50000,tours=tours+1, timestamp=$temps_maj WHERE pseudo='".$to['pseudo']."' ");
echo
"Vous avez gagné 50000 or et 1 tour.";

}



RE: Bug script tours par tours - Globe - 22-07-2010

Code PHP :
<?php 
// Initialisation des variables
$iTempsDerniereModif = time() - (2 * 1350); // On va dire que la dernière mie à jour a été effectué il y a 45 min.
$temps_actuel = time();
$temps_ecoule = $temps_actuel - $iTempsDerniereModif;

if (
$temps_ecoule >= 2700) {
$temps_maj = $temps_actuel-($temps_ecoule-2700); // on recupere la différence ici 0 puisque tu as défini l'ancien timestamp comme étant égal au timestamp actuel-2700

mysql_query("UPDATE inscription SET ors=ors+50000,tours=tours+1, timestamp=$temps_maj WHERE pseudo='".$to['pseudo']."' ");
echo
"Vous avez gagné 50000 or et 1 tour.";

}

Tu as réfléchi avant de copier ce que j'ai mis ? Dans ta table tu as bien un champs timestamp qui stocke le time() ? Là logiquement le code exact que je t'ai mis ici t'affiches "Vous avez gagné 50000 or et 1 tour." mais il est absolument pas interactif vu que tu définis le temps écoulé en variable et pas en le récupérant dans ta base de données.


RE: Bug script tours par tours - vulcain - 22-07-2010

Oui, j'ai crée un timestamp =>

`timestamp` time NOT NULL,

Dans ma table, le timestamp reste à zéro :/ et ça me met constamment "Vous avez gagné 50000 or et 1 tour."


RE: Bug script tours par tours - Globe - 22-07-2010

Mais c'est normal dans le script tu initialise la variable du timestamp comme étant le timestamp d'il y à 45 minutes.
Lis le code s'il te plaît ça ne sert à rien que je t'explique sinon.

En gros tu vas récupérer l'ancien timestamp dans la bdd et stocker ton timestamp actuel à chaque fois que tu rafraichis la page, le script vérifie si la différence entre les deux est supérieure ou égale à 2700, si c'est le cas il t'affiche le message. Tu peux rajouter un texte utilisant les données de ta table pour écrire "Vous avez gagné 50 000 d'or et 1 tour. Vous possédez désormais 300 000 or et 11 tours." si on part du principe que tu avais déjà 250000 d'or et 10 tours. Mais utilises ta base de données, ton script est basé sur des variables, est-ce que tu comprends ce que tu codes ? Je ne veux pas être désobligeant mais j'ai un peu l'impression de parler à un mur.

Edit: J'ai fait un script à la va vite surement truffé d'erreurs. Définis ton timestamp dans ta table avant de l'executer.
Code PHP :
<?
$requete_inscription
= "SELECT ors, tours, timestamp FROM inscription WHERE pseudo='".$to['pseudo']."'";
$req = mysql_query($requete_inscription) or die('Erreur SQL !<br>'.$requete_inscription.'<br>'.mysql_error());
$infos_inscription = mysql_fetch_assoc($req);


$temps_actuel = time();
$temps_ancien = $infos_inscription['timestamp'];
$temps_ecoule = $temps_actuel - $temps_ancien;
if (
$temps_ecoule >= 2700) {
$temps_maj = $temps_actuel-($temps_ecoule-2700); // on recupere la différence
$or_total = $infos_inscription['ors']+50000;
$tours_total = $infos_inscription['tours']+1;
mysql_query("UPDATE inscription SET ors=ors+50000,tours=tours+1, timestamp=$temps_maj WHERE pseudo='".$to['pseudo']."' ");
echo
"Vous avez gagné 50000 or et 1 tour. Vous avez désormais '".$or_total."' or et '".$tours_total."' tours. ";
}

?>



RE: Bug script tours par tours - vulcain - 22-07-2010

Ok ok Wink

Donc si j'ai bien compris, il faut que je récupère l'ancien timestamp est au bout de 45 minutes prendre le nouveau ?
Voilà mon nouveau script :

Code PHP :
<?php
//Je cherche le timestamp enregistré dans ma BDD et les infos des membres
$reponse = mysql_query("SELECT timestamp FROM inscription")or die (mysql_error());
$timestampbdd = mysql_fetch_array($reponse);
//Maintenant les info des membres
$reponse_membres = mysql_query("SELECT pseudo, ors, tours FROM inscription") or dir (mysql_error());
// Maintenant le timestap actuel
$temps_actuel = time();
//Maintenant combien de temps y c'est écoulé
$timestamp_ecoule = $timestamp_actuel - $timestampBDD;
//Si il c'est écoulé entre 0 et 45 minutes
if ($temps_ecoule >= 2700) {
$temps_maj = $temps_actuel-($temps_ecoule-2700); // on recupere la différence
$or_total = $infos_inscription['ors']+50000;
$tours_total = $infos_inscription['tours']+1;
mysql_query("UPDATE inscription SET ors=ors+50000,tours=tours+1, timestamp=$temps_maj WHERE pseudo='".$to['pseudo']."' ");
echo
"Vous avez gagné 50000 or et 1 tour. Vous avez désormais '".$or_total."' or et '".$tours_total."' tours. ";
}

?>

Maintenant j'ai plus le message que ça m'affichai tout le temps. Mais il ne se passe toujours rien


RE: Bug script tours par tours - Globe - 22-07-2010

timestamp valeur en secondes depuis une certaine date (lancement d'unix je me rappelle plus...), donc il est en constante évolution, donc tu stockes le timestamp dans ta table, donc t'as une valeur correspondant à un moment antérieur en secondes. le timestamp actuel est donc supérieur à celui stocké donc tu t'en sers pour déterminer combien de secondes se sont écoulées depuis la dernière fois ou ton code à été executé.

Toi tu veux vérifier si 45 minutes (2700 secondes) se sont écoulées. Donc tu vas vérifier si le nouveau timestamp est supérieur ou égal à l'ancien timestamp additionné de 2700. Si c'est le cas tu vas lancer ton script donc faire une mise à jour de ta table pour changer ta quantité d'or et de tours. En meme temps tu vas redéfinir le timestamp stocké.

Sauf que prenons un cas pratique : Cela fait 50 minutes que tu n'as pas executé le script donc 3000 secondes, il serait injuste que le mec ai à attendre 45 minutes de nouveau il devrait n'avoir à attendre que 40 minutes, donc le nouveau timestamp que tu vas stocker va etre égal au timestamp actuel - la différence de temps. Donc timestamp ancien + 2700 logiquement (je sais pas si j'avais fait ça avant je m'embrouille). La mise à jour de la table n'utiliseras alors pas le timestamp actuel.

Je m'embrouille pour rien j'ai un peu de mal, enfin bref j'essaye de t'expliquer le fonctionnement mais va falloir y réfléchir un peu par toi même si tu veux comprendre.