2

私がやろうとしているのは、プレーヤーリストの名前とスコアをソート用の一時配列にダンプして、スコアボードに表示できるようにすることです。

何らかの理由で、値自体ではなく値への参照を保持しているようです。スコアボードを並べ替えた後、すべてのエントリについて「プレーヤー 4 - スコア 4」と表示されます。ソート方法が機能することは知っていますが、以前に別のゲームで使用したことがあります。

初期値は player1 - 1 player2 - 2 player3 - 3 player4 - 4

欠けていることの 1 つは、更新ごとにスコアリストにスコアをダンプすることです。それを機能させるために物事を再配置しようとした後、私はそれを取り出しました。

なぜこれが起こっているのか理解してください。ここでこの記事を読みましたが、あまり役に立ちませんでした。 http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

初期化

  ScoresList = DumpListToArray(PlayerManager.PlayerList);

アップデート

SortKillScores(ScoresList);

描く

private static void DrawKillScores(SpriteBatch spriteBatch)
    {
        for (int i = 0; i < 4; i++)
        {
            spriteBatch.DrawString(font, "" + ScoresList[i].Name + " - " + ScoresList[i].KillScore, new Vector2(900, 0 + 20 * i), Color.White, 0f, Vector2.Zero, 0.5f, SpriteEffects.None, 1f);  
        }

    }

メソッド

private static ScoreHolder[] DumpListToArray(List<Player> tempList)
    {
        ScoreHolder[] tempArray = new ScoreHolder[4];

        for (int i = 0; i < 4; i++)
        {
            tempArray[i] = new ScoreHolder();
            tempArray[i].Name = tempList[i].PlayerName;
            tempArray[i].KillScore = tempList[i].KillScore;
            tempArray[i].TimeScore = tempList[i].TimeScore;
            tempArray[i].PointScore = tempList[i].PointScore;
        }

        return tempArray;
    }

    private static void SortKillScores(ScoreHolder[] array)
    {
        for (int i = 0; i < array.Length; i++)
        {
            for (int k = i; k > 0 && array[k].KillScore > array[k - 1].KillScore; k--)
            {
                int score = array[k].KillScore;
                string name = array[k].Name;
                array[k] = array[k - 1];
                array[k - 1].KillScore = score;
                array[k - 1].Name = name;
            }
        }       
    }
4

2 に答える 2

5

あるセルから別のセルにプロパティをコピーしようとするのではなく、セルを交換するだけです。

private static void SortKillScores(ScoreHolder[] array)
{
    for (int i = 0; i < array.Length; i++)
    {
        for (int k = i; k > 0 && array[k].KillScore > array[k - 1].KillScore; k--)
        {
            var temp = array[k];
            array[k] = array[k - 1];
            array[k - 1] = temp;
        }
    }       
}

あなたが持っていたのは、同じアイテムへの参照をコピーしてから、同じアイテムであるアイテムarray[k]を編集することでした!k-1

int score = array[k].KillScore;
string name = array[k].Name;
array[k] = array[k - 1];          // cells k and k-1 are the same item!
array[k - 1].KillScore = score;   // this changes both k and k-1
array[k - 1].Name = name;         // and so does this!
于 2013-03-14T17:24:18.943 に答える
1

@MattBurland はここであなたをカバーしているようですが、拡張するには、並べ替えのみを行う場合は、メソッドを使用してみてくださいOrderBy

private static ScoreHolder[] SortKillScores(ScoreHolder[] array)
{
    return array.OrderBy(e => e.KillScore);
}
于 2013-03-14T17:32:27.363 に答える