Ranking punktowy w grze

0

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

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;
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1