JeuWeb - Crée ton jeu par navigateur
Gestion des formules selon les niveaux - 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 formules selon les niveaux (/showthread.php?tid=7129)

Pages : 1 2 3 4


Gestion des formules selon les niveaux - Insectoid - 03-09-2014

Bonjour,

Je planche depuis un long moment sur la gestion et l'interprétation de formule d'évolution pour le jeux que je developpe

Exemple :

Pour construire tel bâtiment au niveau supérieur, il faut :
  1. 1.6^(levelBat-1) unite de sable
  2. 1.7^(levelBat-1) ciment

ça prendra (1.6^(levelBat-1) * 5 + 1.7^(levelBat-1) * 4) * 1 - (1/(2^(LevelTechno-1)))

Ce n'est qu'un exemple simple de formule.

Le soucis et d'enregistrer ces formules et ensuite de les exploiter

Des idées ?

Merci

Insectoïd


RE: Gestion des formules selon les niveaux - Xenos - 03-09-2014

Hum...

Faire une classe qui possède une méthode acceptant, en entrée, le niveau du bâtiment et qui renvoie la quantité de ressource demandée (donc, 2 classes s'il y a deux ressources)? Avec une interface/classe abstraite par-dessus pour ne pas faire de dépendances en dur (toujours travailler avec une classe abtrasite/interface dans les typehinting et la conception plutôt que des classes réelles).


<?php

namespace
{
/**
* Représente un calculateur de quantité de sable pour TelBatiment.
*/
interface ITelBatimentSableCalculator
{
public function calculate(ITelBatimentStructureLevel $p_structureLevel);
}

/**
* Calcule la quantité de sable requise pour accéder au niveau indiqué.
* Note: le niveau entré doit être le niveau pour un batiment "TelBatiment"
*/
class TelBatimentSableCalculator implements ITelBatimentSableCalculator
{
protected $baseExponent = 1.6;
public function calculate(ITelBatimentStructureLevel $p_structureLevel)
{
return pow($this->baseExponent, $p_structureLevel->getLevel() - 1);
}
}

/**
* Représente un niveau d'une structure quelconque; on pourrait utiliser un integer directement sinon.
*/
interface IStructureLevel
{
}

/**
* Niveau d'un bâtiment de type quelconque.
*/
interface IBatimentStructureLevel extends IStructureLevel
{
}

/**
* Niveau d'un batiment quel qu'il soit.
*/
abstract class ABatimentStructureLevel implements IBatimentStructureLevel
{
protected $level = 0;
public function getLevel()
{
return $this->level;
}
}


/**
* Niveau d'un bâtiment de type ITelBatiment
*/
interface ITelBatimentStructureLevel extends IStructureLevel
{
}

/**
* Niveau d'un TelBatiment.
*/
class TelBatimentStructureLevel extends ABatimentStructureLevel implements ITelBatimentStructureLevel
{
protected $level = 5;
}


$niveauBatiment = new TelBatimentStructureLevel();
$calculateur = new TelBatimentSableCalculator();
$sableQuantite = $calculateur->calculate($niveauBatiment);
var_dump($sableQuantite);
}

?>

En version "j'me contente des classes concrètes et zut pour les dépendances, interfaces, extensibilité et combinatoire", on peut ne garder que les classes concrètes "TelBatimentSableCalculator " et "TelBatimentStructureLevel".

Après, la quantité retournée devrait être typée (schématiquement sans tenir compte des dépendances engendrées et en mono-ligne, return new RessourceSableQuantite( pow($this->baseExponent, $p_structureLevel->getLevel() - 1) ); la classe représentant alors une quantité de la ressource "sable").

Si t'as plusieurs fois le même patron de fonction (exemple: n^p +q*p) alors tu peux en faire une autre classe ou une fonction (pourquoi pas pour le coup, c'est logique) et la réutiliser dans TelBatimentSableCalculator.


RE: Gestion des formules selon les niveaux - Insectoid - 03-09-2014

Merci, oui je vois

L'objectif et de considérer que ces formules initiales pourront être compléter dans l'évolution du jeu.

Les class semblent alors être pas mal

J'avais pensé au départ via des tableaux (array) avec des series de array

décomposer les type d'élément
-> batiments
-> technologie
-> personnage
-> ressourcesConsctuction
-> ressourcesAlimentaires

ensuite via un syteme de syntaxe retrouver chacun avec les minimums requis pour tel ou tel élément, puis les besoin pour passé au level suivent de l'élément

Avec ce que tu me proposes, je pense qu'il est possible alors d'utiliser les liste via des array, puis de les exploiter via les class comme tu le présente...

je vais vois de ce coté et je proposerai alors un résultat (bon j'espère Tongue )

Voilou
Insectoïd


RE: Gestion des formules selon les niveaux - niahoo - 04-09-2014

Hello,

J'ai du mal à comprendre où est-ce que tu coinces en fait. Vu que tu exprimes tes ressources nécessaires sous formes de fonctions mathématiques et que PHP te permet d'écrire de telles fonctions, où est le problème ?

De plus, tu dis que tu veux que ce soit évolutif, mais tu peux changer ton source pour le faire évoluer ... donc où est-ce que tu as besoin d'aide ?


RE: Gestion des formules selon les niveaux - Aedius - 04-09-2014

Si vraiment des modifs coté clients sont génante, peut être la création d'un client lourd.

Mais même ainsi, c'est toujours possible de faire des modifications ( mais c'est plus compliqué )


RE: Gestion des formules selon les niveaux - Insectoid - 04-09-2014

Je cherche une méthode

Là, c'est du théorique

J'ai utiliser les array pour mettre mes formules puis à parser la chaine de caractere pour en exraire la formule utilisable...

Une cata...

Et je seche sur une méthode facile à faire évoluer


RE: Gestion des formules selon les niveaux - niahoo - 04-09-2014

Mais pourquoi dans ton array tu ne mets pas de vraies fonctions. Ou dans une classe plus simplement.


Librairie

<?php namespace Game\Math\Bati;

class StationDeMetro {

function technoRatio($niveauTechno) {
return 1 - 1/(pow(2,$niveauTechno - 1));
}

function sable($niveauSup, $niveauTechno) {
return pow(1.6,($niveauSup -1)) * 5 * technoRatio($niveauTechno);
}

function ciment($niveauSup, $niveauTechno) {
return pow(1.7,($niveauSup -1)) * 4 * technoRatio($niveauTechno);
}

}

?>

Dans ton code

<?php
use Game\Math\Bati\StationDeMetro;

// pour construire un batiment niveau 5 si j'ai le niveau 3 il me faut
var_dump([
'sable' => StationDeMetro:Confusedable(5,3),
'ciment' => StationDeMetro::ciment(5,3),
]);

?>

bien sûr à factoriser ...


RE: Gestion des formules selon les niveaux - Insectoid - 04-09-2014

Je ne pensais pas du tout à ça...

Mais oui, c'est la solution Smile

Lors du chargement de la page, les variables sont initialisé par rapport de level de chaque élément.

Non seulement ça évite un calcul supplémentaire, mais en plus, tout est fait à l'avance Smile
ça accélère le traitement

J'opte pour cette solution Smile

Les besoin pour chaque élément lors d'un up de level sont connus et permette alors l'autorisation rapide pour construire ou non Smile

Merci


RE: Gestion des formules selon les niveaux - niahoo - 04-09-2014

Penses à utiliser l'héritage pour toutes les fonctions communes à tous les bâtiments. Et si tu as un modèle bâtiment de base tout ceci n'a pas grand chose à voir dans un namespace "Math".

Concernant l'abstraction, les interfaces et tout ça, c'est bien beau, mais dans un JV la plupart des modèles ont des spécificités. Au final, avoir des interfaces vides et des classes pour transporter un simple entier c'est (excuse moi Xenos) un peu de la branlette. Si tu ne veux pas passer toute ta vie sur un seul jeu il vaut mieux accélérer le dev en acceptant que comme de toute façon tu vas te taper énormément de contenu à la main ça ne fait pas de mal d'utiliser des constantes et "fonctions constantes" en dur dans le code ; du moment que c'est bien rangé.

Créer un jeu ce n'est pas que du code. Il y a beaucoup d'autres choses à apprendre alors ne pas passer tout son temps à avoir du code théoriquement parfait mais qui colle aux doigts c'est pas plus mal.

Ceci étant dit, tu peux utiliser dans ton code des variables à la place des 1.6, 1.7 et stocker ces ratios dans ta base de données pour ton bâtiment-type, à condition que tous (~=) les bâtiments utilisent un tel ratio.


RE: Gestion des formules selon les niveaux - Insectoid - 04-09-2014

Oui oui, bien sur Wink

Je ne cherche pas une méthode parfaite universelle qui fait tout. Juste quelque chose d'assez souple à maintenir

Pour l'instant mes formules de calcul sont dans un beau table dans un tableur avec des graphique pour vérifier que l'évolution n'est ni trop lente ni trop rapide. (restera à vérifier) Ces formules ne concernent à ce jour qu'un seul type d'insecte.

Il y en aura d'autre dans l'évolution du jeu avec des ratio bien différents selon les types d'insectes permettant alors plus de richesse de jeu pour les joueurs (enfin j'espère Wink )

Mettre sous forme d'array les bases des différents éléments et gérer leur besoin pour l'évolution via ce qui m'est présenté s'adapte je pense très bien à mes besoins

Voilou