2017-05-09 1 views
0

Ich habe ein Problem mit einem Spiel, das ich mache. Ich versuche, die Highscore-Liste zu sortieren, aber es funktioniert nicht wie beabsichtigt. Beim Speichern der Partitur gehe ich in das Spiel hinein, ich will durch die Highscoreliste schauen und prüfen, ob es höher ist als ein Score in der Liste und wenn ja, setze den neuen Highscore in die Liste und verschiebe die anderen Scores in die Liste. -Code sieht wie folgt aus:Wie sortiere ich meine XML-Datei korrekt?

public void SaveHighScore(int score) 
    { 
     // Create the data that needs to be saved 
     HighScore data = LoadHighScores(HighScoresFilename); 
     int scoreIndex = 0; 
     for (int i = 4; i >= 0; i--) 
     { 
      if (score >= data.Score[i]) 
      { 
       scoreIndex = i; 
       break; 
      } 
     } 

     if (scoreIndex >= 0) 
     { 
      int[] tempScore = new int[5]; 
      for (int i = 4; i >= scoreIndex; i--) 
      { 
       tempScore[i] = data.Score[i]; 
      } 

      tempScore[scoreIndex] = score; 

      for (int i = scoreIndex; i > 0; i--) 
      { 
       tempScore[i - 1] = data.Score[i]; 
      } 
      for(int i = 0; i < data.Score.Length; i++) 
       data.Score[i] = tempScore[i]; 


      SaveHighScores(data, HighScoresFilename); 
     } 
    } 

Und meine Klasse sieht wie folgt aus: https://github.com/PalmerVincent/Game/projects

Das Problem ist, dass die Highscore-Liste nicht richtig sortiert bekommen, wenn ein neuer Highscore in das Array gesetzt wird.

Antwort

0

Wenn Ihr XML-Format für Sie kein Problem ist, schlage ich vor, dass Sie eine einfache Spieler Klasse und Verwendung Liste ...

public class Player 
{ 
     public string Name { get; set; } 
     public int Score { get; set; } 
} 

public int Count 
public List<Player> Players 

public HighScore() 
{ 
    Players = new List<Player>(); 
} 

//your initialize 
public static void Initialize() 
{ 
    string fullpath = ""; 
    HighScore data; 

    if (!File.Exists(fullpath)) 
    { 

      Player player = new Player { Name = "Neil", Score = 20 }; 
      Player player1 = new Player { Name = "Shawn", Score = 15 }; 
      Player player2 = new Player { Name = "Mark", Score = 10}; 
      Player player3 = new Player { Name = "Cindy", Score = 5 }; 
      Player player4 = new Player { Name = "Sam", Score = 1 }; 
      data.Players.Add(player); 
      data.Players.Add(player1); 
      data.Players.Add(player2); 
      data.Players.Add(player3); 
      data.Players.Add(player4); 

      SaveHighScores(data, fullpath); 
    } 
} 

public static void SaveHighScore(int score, string name) 
{ 
     HighScore data = LoadHighScores(HighScoresFilename); 

     var player = data.Players.FirstOrDefault(x => x.Name == "Vincent"); 

     // new player in town 
     if(player == null) 
     { 
      Player newPlayer = new Player { Name = "Vincent", Score = score }; 

      data.Players.Add(newPlayer); 

      data.Players = data.Players.OrderByDescending(o=>o.Score).ToList(); 
     } 
     else 
     { 
      //set new score 
      player.Score = score; 
      data.Players = data.Players.OrderByDescending(o => o.Score).ToList(); 
     } 

     data.Count = data.Players.Count; 
     SaveHighScores(data, HighScoresFilename); 
} 

und überprüfen Sie Ihre xml

HighScore.SaveHighScore(12, "Vincent"); 
0

ich erstellen kann Ich schlage vor, dass Sie das Rad nicht neu erfinden, wenn es ums Sortieren geht. C# kommt mit ein paar Sortiermethoden, und es gibt auch Open-Source-Projekte, die Sie verwenden können.

Aber in Ihrem Fall sortieren Sie nicht. Sie haben eine einfache Liste mit der höchsten Punktzahl am Anfang der Liste. Der Rest ist in absteigender Reihenfolge der Punktewerte.

Also wäre der MaxScore, Ausleihen von canar'sPlayer Klasse.

public int MaxScore { return list[0].Score; } 
public int MaxScorer { return list[0].Name; } 

Und von der Methodendefinition zu leihen canar erstellt.

public static void SaveHighScore(int score, string name) 
{ 
    var list = LoadHighScores(); 
    // verify score is > first score to make sure list stays sorted 
    if (list.Count > 0 && score <= list[0].Score) 
     return; // invalid high score 

    Player player = list.FirstOrDefault(p => p.Name == name); 
    if (player != null) 
    { 
     list.Remove(player); 
     player.Score = score; 
    } 
    else 
     player = new Player { Name = name, Score = score }; 
    list.InsertAt(0, player); 
    SaveHighScores(list); 
}