2017-05-09 2 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

I並べ替えを行うときには、あなたは車輪を再発明しないことをお勧めします。 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); 
} 
関連する問題