2LITI1
Messages postés4Date d'inscriptionlundi 14 novembre 2005StatutMembreDernière intervention24 août 2006
-
1 avril 2006 à 13:33
dgouttegattat
Messages postés129Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention30 décembre 2007
-
1 avril 2006 à 16:06
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
// 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);
dgouttegattat
Messages postés129Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention30 décembre 20073 1 avril 2006 à 16:06
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);
}