2017-05-09 94 views
0

我有一個遊戲即時通訊問題。我試圖排序高分列表,但它不按預期工作。當我保存比分時,我想進入比賽,我想查看比分高的名單,並檢查它是否高於列表中的分數,如果是的話,將新的高分放入列表中,並將其他分數下移到列表中。 代碼如下所示:如何正確排序我的xml文件?

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

而且我的課是這樣的:https://github.com/PalmerVincent/Game/projects

的問題是,高分列表不能正確,如果一個新的高分被放入數組排序。

回答

0

如果你的XML格式是不是對你的問題,我建議你可以創建一個簡單的播放器類,並使用列表...

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

,並檢查您的XML

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

我建議您在分揀時不要重新發明輪子。 C#提供了幾種排序方法,還有一些可以使用的開源項目。

但是,在你的情況下,你沒有排序。你有一個簡單的列表,最高分在列表頂部。其餘的按照得分值的降序排列。

因此,MaxScore會從canar'sPlayer類中借用。

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

並借用方法定義canar創建。

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