diff --git a/Memory.Cmd/CmdGame.cs b/Memory.Cmd/CmdGame.cs index 4412e94..fd602f3 100644 --- a/Memory.Cmd/CmdGame.cs +++ b/Memory.Cmd/CmdGame.cs @@ -102,7 +102,7 @@ namespace Memory.Cmd // Print the players score to the console then loop over highscores to print those aswell Console.WriteLine($"Your score: {game.Scoring.Points}\nTop 10 Highscores:"); List highscores = game.ScoreHandler.GetTopScores(); - for (int i = 0; i < highscores.Count; i++) + for (int i = 0; i < Math.Min(Game.LEADERBOARDSIZE, highscores.Count); i++) { Score score = highscores[i]; Console.WriteLine($"{i+1}. {score.Name}: {score.Points}"); diff --git a/Memory.Data/ScoreHandler.cs b/Memory.Data/ScoreHandler.cs index 0703a3a..2d10af7 100644 --- a/Memory.Data/ScoreHandler.cs +++ b/Memory.Data/ScoreHandler.cs @@ -17,22 +17,19 @@ namespace Memory.Data connection.Close(); } - // Check if the score is higher than 10th place - private static bool IsTop10(int points) + // Get the position of a certain score + public int GetScorePosition(int score) { using SQLiteConnection connection = new(URI); connection.Open(); - using SQLiteCommand command = new("SELECT Points FROM Scores ORDER BY Points DESC LIMIT 1 OFFSET 9", connection); + using SQLiteCommand command = new("SELECT COUNT(*) + 1 FROM Scores WHERE Points > @Score", connection); + command.Parameters.AddWithValue("@Score", score); using SQLiteDataReader reader = command.ExecuteReader(); - // If there aren't atleast 10 highscores, return true by default if (!reader.Read()) { - connection.Close(); - return true; + return 0; } - int lowest = reader.GetInt32(0); - connection.Close(); - return points > lowest; + return reader.GetInt32(0); } // Get the top 10 highscores @@ -41,7 +38,7 @@ namespace Memory.Data List scores = []; using SQLiteConnection connection = new(URI); connection.Open(); - using SQLiteCommand command = new("SELECT Name, Points FROM Scores ORDER BY Points DESC LIMIT 10", connection); + using SQLiteCommand command = new("SELECT Name, Points FROM Scores ORDER BY Points DESC", connection); using SQLiteDataReader reader = command.ExecuteReader(); while (reader.Read()) { @@ -52,20 +49,15 @@ namespace Memory.Data } // Write the new score to the database - public bool WriteScore(Score score) + public void WriteScore(Score score) { - if (IsTop10(score.Points)) - { - using SQLiteConnection connection = new(URI); - connection.Open(); - using SQLiteCommand command = new("INSERT INTO Scores(Name, Points) VALUES(@Name, @Points)", connection); - command.Parameters.AddWithValue("@Name", score.Name); - command.Parameters.AddWithValue("@Points", score.Points); - command.ExecuteNonQuery(); - connection.Close(); - return true; - } - return false; + using SQLiteConnection connection = new(URI); + connection.Open(); + using SQLiteCommand command = new("INSERT INTO Scores(Name, Points) VALUES(@Name, @Points)", connection); + command.Parameters.AddWithValue("@Name", score.Name); + command.Parameters.AddWithValue("@Points", score.Points); + command.ExecuteNonQuery(); + connection.Close(); } } } diff --git a/Memory.Gui/MainWindow.xaml.cs b/Memory.Gui/MainWindow.xaml.cs index 787e924..5629b34 100644 --- a/Memory.Gui/MainWindow.xaml.cs +++ b/Memory.Gui/MainWindow.xaml.cs @@ -67,7 +67,7 @@ namespace Memory.Gui Highscores.Children.Clear(); OwnScore.Content = $"Your score: {game!.Scoring.Points}"; List highscores = game.ScoreHandler.GetTopScores(); - for (int i = 0; i < highscores.Count; i++) + for (int i = 0; i < Math.Min(Game.LEADERBOARDSIZE, highscores.Count); i++) { Score score = highscores[i]; Label label = new() diff --git a/Memory.Logic/Game.cs b/Memory.Logic/Game.cs index 9088244..00ef215 100644 --- a/Memory.Logic/Game.cs +++ b/Memory.Logic/Game.cs @@ -6,6 +6,7 @@ public const int MINPOINTS = 10; public const int MAXTIME = 10000; public const int STARTSCORE = 100; + public const int LEADERBOARDSIZE = 10; public int DeckSize { get; } = deckSize; public int GridSize { get; } = GetGridSize(deckSize).Rows; @@ -93,7 +94,10 @@ if (IsFinished()) { CalculateScore(DateTimeOffset.Now.ToUnixTimeMilliseconds()); - ScoreHandler.WriteScore(Scoring); + if (ScoreHandler.GetScorePosition(Scoring.Points) <= LEADERBOARDSIZE) + { + ScoreHandler.WriteScore(Scoring); + } } } } diff --git a/Memory.Logic/IScoreHandler.cs b/Memory.Logic/IScoreHandler.cs index 6ece896..e678b0f 100644 --- a/Memory.Logic/IScoreHandler.cs +++ b/Memory.Logic/IScoreHandler.cs @@ -2,7 +2,8 @@ { public interface IScoreHandler { - public bool WriteScore(Score score); + public int GetScorePosition(int score); + public void WriteScore(Score score); public List GetTopScores(); } }