C# - gestion de records

Signaler
Messages postés
4
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
24 août 2006
-
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
-
Bonjour à tous,


Je suis en train de faire un petit jeu en c#, et, après plusieurs
heures de codes, j'ai un problème que je n'arrive pas à résoudre. Il
s'agit du problème suivant:





- Je stock dans un fichier txt des données de ce style:


Mario, %5.1


Lol, %5.0


Luigi, %4.0


Peach, %1.0





le signe "%" me permet de splitter dans un tableau le nom et son score.





J'aimerai faire que lorsqu'un joueur ayant insérer son nom du style
"Bowser", qui imaginons obtienne le score 4.5 soit insérer dans mon
fichier texte dans l'ordre! C'est à dire qu'il soit, toujours dans
notre exemple, qu'il soit écrit entre Lol et luigi. Peach dégagerait du
fichier txt puisque le classement se fait sur les 4 meilleurs records.





Voila, si quelqu'un pouvait m'aider, en me donnant un exemple
fonctionnel, cela me serait très utile et je lui en serait très
reconnaissant

3 réponses

Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Bonjour,

voilà une solution possible pour peu que tu utilises le framework .NET 2.0.


D'abord, il faut créer une classe qui représentera les scores:


public class ScoreRecord : IComparable
{
private string player;
private float score;

public string Player
{
get {return player;}
set {player = value;}
}

public string Score
{
get {return score;}
set {score = value;}
}

public ScoreRecord(string player, float score)
{
this.player = player;
this.score = score;}
}

// Implémentation de l'interface IComparable
public int CompareTo(object obj)
{
ScoreRecord record = obj as ScoreRecord;

// comparer les scores, le plus élevé l'emporte
return -score.CompareTo(record.score);
}
}

Ensuite, il faut créer une classe dérivée de la classe List<T> qui représentera une liste de taille fixe et triée.
public class FixedSortedList<T> : List<T>
{
private int maxSize;

public FixedList(int size)
{
maxSize = size;
}

public new void Add(T item)
{
// ajouter le nouvel élément et trier la liste
base.Add(item);
Sort();

// enlever le dernier élément si la liste était déjà pleine
if (Count > maxSize)
RemoveAt(Count - 1);
}
}

Voilà. Maintenant, il suffit de créer une FixedSortedList de taille 4 et d'y ajouter les objets ScoreRecord.

FixedSortedList<ScoreRecord> bestRecords = new FixedSortedList<ScoreRecord>(4);
bestRecords.Add(new ScoreRecord("player1", 1.0));

Pour sauver dans un fichier:
foreach (ScoreRecord record in bestRecords)
myTextWriter.WriteLine("{0}, %{1}", record.Player, record.Score);
Messages postés
4
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
24 août 2006

Merci, mais le pb cest que pour une raison bien trop longue à expliquer je suis obligé d'utiliser la version SDK 1.1



J'aimerai avoir un exemple avec l'utilisation des StreamReader et StreamWriter
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Dans ce cas, au lieu d'utiliser une collection générique, tu peux utiliser un tableau contenant des objets ScoreRecord et utiliser la méthode statique Sort() de la classe Array.

Si on suppose que tu remplis le tableau de la manière suivante:

ScoreRecord[] bestRecords = new ScoreRecord[4];
StringReader recordFile = new StringReader("records.txt");
int index = 0;
while (recordFile.Peek() > -1)
{
if (index >= 4)
{
// le fichier contient plus de 4 entrées,
// ne pas tenir compte des entrées en trop
break;
}
string[] fields = reader.ReadLine().Split(new char[] {'%'}, StringSplitOptions.RemoveEnptyEntries);
string player = fields[0];
float score = Single.Parse(fields[1]);
bestScores[index] = new ScoreRecord(player, score);
index++;
}
recordFile.Close();

// Il est normalement inutile de trier le tableau si les
// entrées du fichier sont déjà triées, mais on ne sait jamais...
Array.Sort(bestRecords);

... tu peux ajouter un nouveau score comme suit
// tester si le score est supérieur au dernier score du tableau
if (bestScores[4] == null || newScore.Score > bestScores[4].Score)
{
// remplacer le dernier score du tableau par le nouveau score
bestScores[4] = newScore;

// et retrier le tableau
Array.Sort(bestRecords);
}