JeuWeb - Crée ton jeu par navigateur
[réglé] Système de monnaie - 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 : [réglé] Système de monnaie (/showthread.php?tid=1469)



[réglé] Système de monnaie - nemesis_elite - 14-07-2007

Bonjour bonjour

Il me semblait qu'il existait déjà un post concernant un système de monnaie, seulement, pas moyen de remettre la main dessus.
Alors j'en créer un ! :heuuu:

Tout d'abords les bases :
- 1 pièce d’or = 10 pièces d’argent = 100 pièces de cuivre = 1000 pièces de bronze
- 1 pièce d’argent = 10 pièces de cuivre = 100 pièces de bronze
- 1 pièce de cuivre = 10 pièces de bronze

Dans ma bdd, je stocke un seul nombre, celui des pièces de bronze que possède le joueur. C'est à partir de celui-ci que je "formate" les autres nombres de pièce d'or, d'argent, et de cuivre.

Exemple :
Code :
Le joueurs possède 1234 Pb (pièce de bronze)
Cà affichera :
Po : 1
Pa : 2
Pc : 3
Pb : 4

Voici le code :
Code PHP :
<?php

$iPieceBronze
= 1234; // Vien de la bdd
$iPieceOr = 0;
$iPieceArgent = 0;
$iPieceCuivre = 0;


if(
$iPieceBronze >= 1000)
{
$aPieceOr = explode('.', $iPieceBronze/1000);
$iPieceOr = $aPieceOr[0];
$iPieceBronze = $aPieceOr[1];
}
if(
$iPieceBronze >= 100)
{
$aPieceArgent = explode('.', $iPieceBronze/100);
$iPieceArgent = $aPieceArgent[0];
$iPieceBronze = $aPieceArgent[1];
}
if(
$iPieceBronze >= 10)
{
$aPieceCuivre = explode('.', $iPieceBronze/10);
$iPieceCuivre = $aPieceCuivre[0];
$iPieceBronze = $aPieceCuivre[1];
}


echo
'PO : '.$iPieceOr.'<br /> PA : '.$iPieceArgent.'<br /> PC : '.$iPieceCuivre.'<br /> PB : '.$iPieceBronze;
?>

Je trouve ce code un peu long, y'aurait-il moyen de l'optimiser ?

Merci d'avance Smile


RE: Système de monnaie - Obscurantis - 14-07-2007

Bonjour,

Avec des fonctions chaines de caractères ça marche :

Code PHP :
<?php 
$iPieceBronze
= 1234;
$iPieceOr = 0;
$iPieceArgent = 0;
$iPieceCuivre = 0;

// on retourne le nombre de pièce de bronze.
$buffer = strrev( (string) $iPieceBronze );

// on découpe buffer pour chaque type de pièce.
$iPieceBronze = (int) substr( $buffer , 0 , 1 );
$iPieceCuivre = (int) substr( $buffer , 1 , 1 );
$iPieceArgent = (int) substr( $buffer , 2 , 1 );
$iPieceOr = (int) strrev( substr( $buffer , 3 ) );

echo
'Pb : '.$iPieceBronze.'<br />';
echo
'Pc : '.$iPieceCuivre.'<br />';
echo
'Pa : '.$iPieceArgent.'<br />';
echo
'Po : '.$iPieceOr.'<br />';

Après il y a peu être (sûrement) une méthode mathématique un peu plus `noble` ^^.

EDIT : Une méthode plus mathématique,

Code PHP :
<?php 
$iPieceBronze
= 1234;
$iPieceOr = 0;
$iPieceArgent = 0;
$iPieceCuivre = 0;

$buffer = $iPieceBronze;

$iPieceBronze = $buffer % 10;
$iPieceCuivre = ( $buffer % 100 - $buffer % 10 ) / 10;
$iPieceArgent = ( $buffer % 1000 - $buffer % 100 ) / 100;
$iPieceOr = ( $buffer - $buffer % 1000 ) / 1000;

echo
'Pb : '.$iPieceBronze.'<br />';
echo
'Pc : '.$iPieceCuivre.'<br />';
echo
'Pa : '.$iPieceArgent.'<br />';
echo
'Po : '.$iPieceOr.'<br />';



RE: Système de monnaie - Shidame - 14-07-2007

C'est peu être pas optimisé mais c'est une autre approche :
(que je n'ai pas vérifiée je ne suis pas chez moi)
Code PHP :
<?php 
$var
= 158796; // nombre de pièces de bronze
$size = strlen($var); // renvoie 6

$unite = $var{$size-1}; // renvoie 6 (pieces de bronze)
$dizaine = $var{$size-2}; // renvoie 9 (pieces de cuivre)
$centaine= $var{$size-3}; // renvoie 7 (pieces d'argent)
$millier_et_plus = substr($var, 0, $size-4); // renvoie 158 (pieces d'or)
Au passage j'aurai inversé cuivre et bronze dans le classement des valeur ^^


RE: Système de monnaie - nemesis_elite - 14-07-2007

Merci d'avoir répondu si vite Smile

La seconde méthode me plait mieux que la première ^^.

Encore merci à toi Smile

[edit] Shidame, merci également de ta réponse Smile
Pour ce qui est du classes des valeur, je me suis basé la dessus
(Etant donnée que je fait un jeu sur çà! )


RE: [réglé] Système de monnaie - elazard - 14-07-2007

cool c'est la classe merci nemesis_elite(et les autres contributeurs :p) encore un truc qui me sera util^^


RE: [réglé] Système de monnaie - naholyr - 14-07-2007

J'ai retrouvé cette fonction générique que j'avais utilisé pour un ancien projet :
Code PHP :
<?php 
function details_valeur($somme, $unite, $regle) {
$keys = array_keys($regle);
$nb_keys = count($keys);
$result = array( $unite => $somme );
for (
$i=$nb_keys-1; $i>0; $i--) {
$unite = $keys[$i];
if (isset(
$result[$unite])) {
$unite2 = $keys[$i-1];
$ratio = $regle[$unite2];
$quotient = intval(floor($result[$unite] / $ratio));
if (
$quotient == 0) {
break;
}
$reste = $result[$unite] % $ratio;
$result[$unite] = $reste;
$result[$unite2] = $quotient;
}
}
return
$result;
}

La règle est un tableau assez simple à lire :
Code PHP :
<?php 
array( 'po' => 20, 'pa' => 12, 'pb' => 50, 'pf' => 1 )
signifie
  • 1 po (pièce d'or) = 20 pa (pièce d'argent)
  • 1 pa = 12 pb (pièce de bronze)
  • 1 pb = 50 pf (pièce de fer)

La fonction prend en paramètre une somme, l'unité de cette somme, et renvoie le détail des conversions, par exemple avec la règle ci-dessus, si on exécute
Code PHP :
<?php 
var_dump
(details_valeur(1123, 'pf', $regle))
On obtient
Code :
array
  'pf' => int 23
  'pb' => int 10
  'pa' => int 1
Le détail des calculs que la fonction a effectué c'est simplement cette série de divisions euclidiennes :
  • 1123 pf = (50*22 + 23) pf = 22 pb + 23 pf
  • 22 pb = (1*12 + 10) pb = 1 pa + 10 pb
  • 1 pa = (0*20 + 1) pa = 0 po + 1 pa

L'avantage d'un système comme celui-là c'est que c'est ultra-simple à paramétrer et surtout évolutif, si demain tu veux rajouter les pièces de nickel hop on change la règle pour l'insérer au milieu
Code PHP :
<?php 
array ( 'po' => 20, 'pa' => 2, 'pn' => 6, 'pb' => 50, 'pf' => 1 )
Et surtout, tu peux changer le cours d'une monnaie en claquant des doigts «oh le cours de l'argent a doublé»
Code PHP :
<?php 
array ( 'po' => 10, 'pa' => 24, 'pb' => 50, 'pf' => 1 )
Dommage pour ceux qui collectionnaient l'or et le bronze… Tongue

C'est sympa d'avoir cette liberté Smile


RE: [réglé] Système de monnaie - Mysterarts - 14-07-2007

Encore une fonction bien utile !
Ca meritrai presque une topic dans ta section modules, nan ?

Mysterarts


RE: [réglé] Système de monnaie - elazard - 14-07-2007

oki donc en gros dans la fonction de naholyr (bah encore merci quoi même si ca sent le rechauffé xD et +1 pour le mettre dans les scripts)
var_dump(details_valeur(1123, 'pf', $regle)) le 1123 est à modifier par la valeur du membre, le seul truc que j'ai pas suivi (jsuis pas un grand coutumier des fonctions custom) c'est il fait quoi le 'pf'? $regle oki c'est l'array de conversion mais 'pf' je capte pas trop xD

EDIT: jtrouve aussi qu'un post voire une section regroupant les différentes fonctions custom (west coast ) serait sympa et instructif^^


RE: [réglé] Système de monnaie - naholyr - 14-07-2007

le 'pf' c'est l'unité, en l'occurrence des pièces de fer. Cela correspond à une clé dans le tableau $regle


RE: [réglé] Système de monnaie - elazard - 14-07-2007

ah oui oki j'avais pas vu que pf => 1 dans les deux cas