Witam, mam krótką grę quizową i proszę o jakieś pomysły jak zaimplementować ranking punktów. Chciałbym aby była to lista np. 20 elementowa i dopiero jak ktoś przebije ostatni wynik to wskakuje na listę. Jak to czytać w programie? Jako słownik? Liste? Nie mam za bardzo pomysłu aby się z tym nie męczyć dużo. Fajnie by było żeby po deserializacji z pliku fajnie by było to wyświetlic w jakims richtextboxie czy jakoś innaczej posortowane w formie. Z góry dzięki za jakiś pomysł.
0
0
Użyj słownika, klucz jako imię gracza i wartość jako punkty, posortuj wg punktów i tyle. Albo stwórz klasę, która przechowuje graczy z punktami i wsadź ich na listę, zaimplementuj własnego Comparer'a i też sortuj i wyświetlaj.
Wiele rozwiązań jest w necie, wystarczy poszukać "csharp highscores"...
0
class Program
{
static void Main(string[] args)
{
Ranking ranking = new Ranking();
ranking.Add("A", 3);
ranking.Add("A", 7);
ranking.Add("A", 4);
ranking.Add("B", 0);
ranking.Add("B", 9);
ranking.Add("B", 2);
var top5 = ranking.GetTop(5);
foreach (var score in top5)
{
Console.WriteLine("{0} zdobył {1} punktów.", score.Name, score.Points);
}
Console.ReadLine();
}
}
class Ranking
{
private List<Score> _scores;
public IEnumerable<Score> GetTop(int count)
{
return _scores.OrderByDescending(entry => entry.Points).Take(count);
}
public void Add(Score score)
{
_scores.Add(score);
}
public void Add(string name, int points)
{
_scores.Add(new Score(name,points));
}
public Ranking()
{
_scores = new List<Score>();
}
}
class Score
{
public string Name;
public int Points;
public Score(string name, int points)
{
this.Name = name;
this.Points = points;
}
}
0
Nie bójmy się stosować struktur z publicznymi polami w tego typu sytuacjach.
TryAddScore
zwraca true
, jeżeli wynik dostał się na listę i false
w przeciwnym wypadku.
struct Score : IComparable<Score>
{
public string Nickname;
public int Points;
public int CompareTo(Score other)
{
return other.Points.CompareTo(Points);
}
}
class Highscores
{
const int MAX_HIGHSCORES = 5;
Score[] _scores = new Score[MAX_HIGHSCORES];
public bool TryAddScore(Score score)
{
int idx = Math.Abs(Array.BinarySearch(_scores, score) + 1);
if (idx >= _scores.Length)
return false;
Array.Copy(_scores, idx, _scores, idx + 1, _scores.Length - idx - 1);
_scores[idx] = score;
return true;
}
public IEnumerable<Score> GetScores()
{
return _scores;
}
}