JeuWeb - Crée ton jeu par navigateur
Encore et toujours, 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 : Encore et toujours, gestion des ressources (/showthread.php?tid=3006)

Pages : 1 2 3 4


Encore et toujours, gestion des ressources - pollop - 01-12-2010

Bonjour à tous,

J'ai une petite question concernant la gestion des ressources !

Donc, pour la base, c'est pas très compliqué, quand l'utilisateur arrive sur une page, on regarde combien de temps c'est écoulé depuis sa dernière visite et on met les ressources à jour en conséquence.

Mais je me pose une question quant au scénario suivant :

La dernière mise à jour des ressources remonte à 2h30.
L'utilisateur arrive sur la page.
Il suffirait normalement de faire $ressource += $time * $coef_production
Avec $coef_production qui depend du niveau du batiment de production.

Mais comment prendre en compte ceci:
Lors de sa dernière visite, l'utilisateur avait demandé l'amélioration de son batiment de production, ceci prend 1h.

Il faut donc faire :
$ressource += 1h * ancien_coef
$ressource += 1h30 * nouveau_coef

Comment gérer ceci de manière simple ?

Un grand merci d'avance Smile

Pollop.


RE: Encore et toujours, gestion des ressources - niahoo - 01-12-2010

heu tu donnes toi même la réponse à ta question là ...


RE: Encore et toujours, gestion des ressources - Jeckel - 01-12-2010

Je dirais un truc comme ça (mais je ne suis sans doute pas assez expérimenté sur le sujet pour fournir la meilleure réponse) :

Il faut d'abord calculer la durée restant de construction du bâtiment :
$timeBatLevel1 = heure de demande de construction + temps de construction - heure de dernière mise à jours

Puis la formule devient
$ressource += $timeBatLevel1 * $ancien_coef + ($time-$timeBatLevel1) * $nouveau_coef;

Ensuite, pour simplifier la formule, tu utilises un tableau avec les différents coefs en fonction du niveau du batiment

$coef = array(
1 => 10,
2 => 30,
3 => 60
};

$level = 1; // Ancien niveau du batiment

$resource = $timeBat * $coef[$level] + ($time - $timeBat) * $coef[$level + 1];



RE: Encore et toujours, gestion des ressources - pollop - 01-12-2010

Merci pour vos réponses Smile

@niahoo : Je sais bien que je donne la réponse, mais dans certain cas, ça peut vite devenir très très lourd.
Exemple: L'utilisateur à dans sa file de construction 4 bâtiments, 3 qui influencent les coefficient de production et 1 qui influence le temps de construction des bâtiments.
De plus, il a demandé la construction de 80 soldats mais le batiments qui influence le temps de construction sera fini avant la fin des 80 soldats, etc etc.

Si l'utilisateur revient après disons 3 jours, il va falloir décomposer le temps en énormément de tranche !
Surtout si l'argent n'est pas prélevé avant la construction mais seulement au moment où celle ci commence !

Le script devra faire ceci !

$time = Combien de temps avant que le batiment en cours ou le soldat en cours soit fini
On met à jour les ressource (sans compter le batiments)
On regarde si à ce moment là, il avait assez de ressource pour le batiment 2 dans la liste
Si oui, on calcule le temps nécessaire pour que ce batiment soit fini.
On met à jour les ressource (on tient compte du batiment 1 mais pas 2)
Sinon, on doit regarder le 3ème batiment dans la liste
Etc etc et ceci sans prendre en compte les soldat !
Imaginons que la construction d'un soldat prene 4minutes, il faut découper les 80*4 premières minutes en tranche de 4 minutes.
Il faudra alors 80 fois mettre à jour les ressources et verifier si il en avait assez pour construire un soldat supplémentaire...

Ceci est super gourmand en temps de calcul et en nombre de requête SQL, d'où ma question Tongue
Je voulais donc savoir s'il existe des algorithme ou des scripts un peu plus malin pour éviter de perdre trop de temps en calcul Smile

Merci Smile

PS: J'espère que mon explication est claire Tongue


RE: Encore et toujours, gestion des ressources - Jeckel - 01-12-2010

Pour les bâtiments... le mieux est de les traiter comme une file d'attente... il y a deux cas :

cas 1 : les bâtiments peuvent être construit en même temps, dans ce cas, il faut calculer pour chacun l'heure de fin, et traiter les bâtiments dans cet ordre

cas 2 : les bâtiments ne peuvent être construit en même temps, c'est plus simple, tu les traites dans l'ordre des demandes.

Pour les unités, je dirais que des fois, il ne faut pas chercher à faire le plus réaliste possible, et chercher la simplicité... de nombreux jeux vont construire toutes les unités en fonction des évolutions disponibles au moment de la demande... si un bâtiment qui accélère la production se termine en cours, il n'aura d'effet que sur la prochaine commande.

Enfin pour le coût en ressources, je dirais qu'il faut déduire "à la commande" les ressources nécessaires... ne pas faire le test au fur et à mesure. et par contre rembourser (out ou partie) quand la commande est annulée.


RE: Encore et toujours, gestion des ressources - pollop - 01-12-2010

Merci beaucoup pour ton aide Jeckel Smile

En ce qui concerne les unités, ta solution me semble très bien et même réaliste, quand on commande un produit, on commande souvent une certaine quantité et ce sont les prix du marché à ce moment la qui décideront du prix total !
Donc vendu pour les unités Smile

Je pense que je vais faire une table commande dans ma BDD qui contiendra :
L'heure de création de la commande
L'heure de fin de la commande (calculée en fonction des ressources et technologie lors de la création)
La quantité commandée
Le cout total (pour facilité le remboursement)
Temps pour une unité (je préfère quand même fournir chaque unité quand elle est prete plutôt que tout à la fin)

Enfin pour les bâtiments,
Je préfère le cas 2.
J'ai fait un petit pseudo code pour les bâtiments, qu'en penses tu ? Smile
(J'espère qu'il est compréhensible)
Petit explication : Dans la boucle, on considère que l'heure actuelle est l'heure lors de la dernière visite et petit à petit dans la boucle on va rapprocher cette valeur de l'heure actuelle.

$last_visite = Temps lors de la dernière visite
While 1
Si il y a un batiment en cours de construction ?
$temps_restant = Temps de construction restant lors de $last_visite
Si le temps écoulé est >= $temps_restant
On met à jour les ressources produite entre $last_visite et $last_visite + $temps_restant
On met à jour le niveau du batiments et les coef
$last_visite = $last_visite + $temps_restant
Sinon
On met à jour les ressources
$last_visite = NOW()
On sort de la boucle (break)
Sinon
Si la liste de construction est vide
On met à jour les ressources
$last_visite = NOW()
On sort de la boucle (break)
Sinon
Si on a assez de ressource pour le premier batiment de la liste
On enlève les ressources necessaires
On indique que le batiment est en construction
(Le prochain tour de boucle verifiera si le batiment est fini)
Sinon
On enlève le premier batiment de la liste, (le second sera examiné au prochain tour de boucle)
WhileEnd
PS : Bon après il faut mettre une limite à la taille de la liste de construction des bâtiments pour éviter de passer trop de temps dans la boucle !

Cela te semble t il bon ?

Encore merci Wink


RE: Encore et toujours, gestion des ressources - Jeckel - 01-12-2010

Ca me semble pas mal, et ça doit répondre à ton besoin.

Un avis strictement personnel (mais je suis un maniaque) les "while true" sont dangereux, et la moindre erreur peut transformer ta boucle en boucle infinie, et selon la configuration faire plus ou moins de dégâts, je préfère en général mettre une véritable clause de sortie (en plus des breaks) par exemple, réduire le temps restant à chaque itération, et faire une while temps restant > 0;

Voilà, mais c'est juste mon côté maniaque du code qui parle, sinon, ton algo me semble bon.


RE: Encore et toujours, gestion des ressources - php_addict - 02-12-2010

salut

toutes tes actions doivent etre listées par ordres chronologique...

ainsi tu les resoud toutes dans l'ordre, expl:

- tu augment le level de ta ferme
- tu te fais attaqué
- tu recrute

et bein a chaque action tu commence par calculer les ressources en fonctions du temps ecoulé, apres tu resoud les actions specifiques (attaque, augmentation de level, etc...)

tu te fais une table qui contient toutes les actions de tout les joueurs , ces tables peuvent pointer vers d'autres tables plu specifique

a+


RE: Encore et toujours, gestion des ressources - pollop - 07-01-2011

Merci beaucoup pour ta réponse !

Ton idée me semble parfaite et relativement simple a mettre en place Wink

Peux tu me donner un exemple de la table qui contient toutes les actions ainsi que les tables plus spécifiques ? Ce serait super sympa Wink

Encore merci Smile


RE: Encore et toujours, gestion des ressources - pollop - 05-02-2011

Re-bonjour à tous !

J'ai une petite question quand à l'augmentation des ressources !

Si je pars sur l'algo présenté ci dessus.

Donc à chaque fois que le joueur arrive sur une page, je récupère l'heure de la dernière mise à jour de ses ressources, calcule la différence avec l'heure actuelle et met à jour ses ressources en fonction.
Si par exemple le joueur gagne 2 unité d'une ressource par heure.
S'il arrive sur une page après 32 minutes d'inactivité, on calcule (32/60 * 2), il reçoit une unité et la date et heure du dernier update est enregistrée.

Mais s'il arrive sur une page après 20 min d'inactivité, il reçoit 0 unité (20/60 * 2) et la date de dernière mise à jour des ressources est enregistrée !
Donc s'il parcours le site toutes les 20 minutes, ses ressources n'augmentent jamais !
Sauf si les ressources sont stoquées sous forme de float dans la BDD, alors il reçoit 0.6666666 ressources après 20 minutes mais je ne sais pas si c'est vraiment optimal...

Voyez vous une autre solution ?

Merci Smile