Score d'un jeu dans un fichier

Eléphanteau du PHP | 47 Messages

17 août 2013, 01:12

Bonjour, j'utilise un fichier texte pour stocker les scores des joueurs :
$fichier = fopen("score-joueur1.txt","r+");
$nb = fgets($fichier,255); // Le score actuel du joueur
$nb = $nb+$points; // Ajouter les points qu'il vient d'obtenir
fseek($fichier,0);
fputs($fichier,$nb);
fclose($fichier);
J'aimerais savoir s'il est possible de simplifier ce script, je le trouve complexe pour un simple petit ajout de points.
En fait, je ne comprends pas à quoi sert "fseek" et "255" là-dedans.

Mammouth du PHP | 1966 Messages

19 août 2013, 16:17

Si tu clique sur ces fonctions sur ton propre post, tu arrive directement sur le site de la doc php.net qui t'expliquera le fonctionnement des fonctions et l'utilité des paramètres.

Le 255 indique à php la longueur de la chaine de caractère à lire.
C'est un peu long sauf si les scores peuvent atteindre 10^256

le fseek sert à retourner au début du fichier. Lors de la lecture d'un fichier, php se sert d'un curseur. à l'ouverture le curseur est placé au début du fichier (index 0) comme tu lis les 255 premiers caractères avec fgets, le curseur est donc à la position 255. mais tu veux écrire le score au début du fichier, il est donc nécessaire d'y retourner avec le fseek($fichier,0).

Pour simplifier ton code, tu peux utiliser file_get_contents et file_put_contents
par exemple :
$fichier ="score-joueur1.txt";
$nb = intval(file_get_contents($fichier)); // Le score actuel du joueur
$nb = $nb+$points; // Ajouter les points qu'il vient d'obtenir
file_put_contents($fichier,$nb);
Si ton fichier ne contient que le score du joueur et rien d'autre sinon il faut jouer avec les autres paramètres de ces fonctions
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 47 Messages

20 août 2013, 12:01

Ok, merci.
J'utilise bien ce fichier texte uniquement pour le "score total". Et un autre fichier pour le "nombre de parties". Cela me permet de calculer sa moyenne : score total/nombre de parties.

Si je comprends bien, j'ai la possibilité d'utiliser un seul fichier texte pour stocker plusieurs valeurs ?
Exemple :

Code : Tout sélectionner

45 3
La première ligne pour le score total. (variable $nb)
La 2e ligne pour le nombre de parties. (variable $nbpartie)

Dans ce cas, comment récupérer ces valeurs ? Et comment sélectionner la bonne ligne pour incrémenter ces valeurs ?

Mammouth du PHP | 1966 Messages

20 août 2013, 13:54

Tout à fait, le nombre d'information par fichier est (en théorie) illimité.

Pour avoir plusieurs informations dans un seul fichier, tu devra les hièrarchiser. il y a beaucoup de manière de faire.
une info par ligne en connaissant l'ordre
chaque info avec son label et séparer par un caractère spécifique par exemple "score_j1=74;nb_partie_j1=21;score_j2=154;nb_partie_j2=34;"

Ou encore, ce que je te conseille vu que le nombre de donnée est limité utiliser les fonctions serialize et unserialize de php.
Ces fonctions te servent à à transformer un tableau php en chaine de caractères (serialize) et l'inverse est possible également avec unserialize.
$fichier ="score-joueur1.txt";
$data = unserialize(file_get_contents($fichier)); 
$data['score_j1'] = $data['score_j1'] + $points; // Ajouter les points qu'il vient d'obtenir
$data['nb_partie_j1']++; //incrémente le nombre de partie
file_put_contents($fichier,serialize($data));
Cela te permet plus de souplesse comme des tableaux multiples par exemple
$data = array(
    'joueur1' => array(
        'nom' => 'spols',
        'score' => 198,
        'nb_partie' => 18),
    'joueur2' => array(
        'nom' => 'fatalfury',
        'score' => 52,
        'nb_partie' => 39));
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 47 Messages

20 août 2013, 18:20

Ca ne marche pas avec serialize.

Le contenu de mon fichier :

Code : Tout sélectionner

score_j1=74; nb_partie_j1=21;
après avoir ajouté 25 pts et incrémenté d'une partie, il devient n'importe quoi :

Code : Tout sélectionner

a:2:{s:8:"score_j1";i:25;s:12:"nb_partie_j1";i:1;}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 août 2013, 23:01

Salut,

Ce n'est pas n'importe quoi c'est le résultat de la serialisation du tableau.

Tu t'en fou du contenu du fichier ce qui compte c'est que tu ai tes données et qu'ensuite tu puisse les exploiter.

Pour réutiliser ce qu'il y a dans le fichier utilise file_get_contents et unserialise.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 47 Messages

20 août 2013, 23:58

D'accord, mais quand j'essaye de récupérer ces deux variables :
$fichier ="score.txt";
$data = unserialize(file_get_contents($fichier));

$nb = $data['score_j1'];
$nbpartie = $data['nb_partie_j1'];

echo 'Pts total : '.$nb;
echo '<br>Nb parties : '.$nbpartie;
Cela affiche 25 pour les points total, 1 pour le nombre de parties.
Normalement c'est 74+25 = 99 points.
21+ 1 partie = 22 parties !
Donc c'est pas bon.

De plus, quand le fichier est encore sous forme :

Code : Tout sélectionner

score_j1=74; nb_partie_j1=21;
Je n'arrive pas à récupérer les valeurs !

Mammouth du PHP | 1966 Messages

21 août 2013, 08:27

Recommence avec un fichier vide, créé ton tableau dans ton script et place le dans ton fichier.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube