在C#Windows窗体中创建高分表

时间:2018-10-14 14:13:23

标签: c#

我知道这个主题上有很多类似的问题,但是找不到任何对我有帮助的答案。我已经创建了一个游戏,您必须在其中声明您的玩家编号(1、2、3等)。完成游戏后,它将在记分板上显示您的球员人数和得分。我正在尝试使计分板起作用,以便它将得分从高到低排序,并在每个得分旁给出正确的球员人数。我把这两个都保存为列表。我知道我可以使用.Sort()和.Reverse()来将得分从高到低排序,但是如何确保它们仍与正确的球员号码相关联?我想出了以下代码,对得分进行了细微排序,但并不完全。 例如,如果玩家1得分为2,玩家2得分为3,而玩家3得分为5,则从高到低排序为; 玩家2得分3, 玩家3得分5, 玩家1得分2。 我明白为什么我的代码无法完全正常工作,但是我尝试对其进行任何修复都会导致错误。

列表初始化如下:

public static List<int> score = new List<int>();
public static List<int> player = new List<int>();

这是代码的一部分,如果您失败了游戏,它将存储您的球员编号和得分,然后打开记分板表格。

else
        {
            MessageBox.Show("Final Score: " + sequence.Count, "Fail!");

            score.Add(sequence.Count);
            player.Add(Convert.ToInt32(PlayerNo.Text));
             for (int i = 0; i < (player.Count - 1); i++)
             {
                 if (score[i + 1] > score[i])
                 {
                     int hi = score[i];
                     int hi1 = player[i];
                     score[i] = score[i + 1];
                     player[i] = player[i + 1];
                     score[i + 1] = hi;
                     player[i + 1] = hi1;
                 }
             }


            number = 0;
            sequence = new List<int>();

                Score s = new Score();
            this.Hide();
            s.ShowDialog();
                this.Close();
            }

记分板形式看起来像这样(我知道它花了很多时间,但是我不知道有什么更好的方法-我没有用C#编写代码太久了)。

public Score()
    {
        InitializeComponent();
        switch (Form5.player.Count)
        {
            case 1:
                textBox1.Text = "Player " + Form5.player[0] + " scored " + Form5.score[0];
                break;
            case 2:
                textBox1.Text = "Player " + Form5.player[0] + " scored " + Form5.score[0];
                textBox2.Text = "Player " + Form5.player[1] + " scored " + Form5.score[1];
                break;
            case 3:
                textBox1.Text = "Player " + Form5.player[0] + " scored " + Form5.score[0];
                textBox2.Text = "Player " + Form5.player[1] + " scored " + Form5.score[1];
                textBox3.Text = "Player " + Form5.player[2] + " scored " + Form5.score[2];
                break;
            case 4:
                textBox1.Text = "Player " + Form5.player[0] + " scored " + Form5.score[0];
                textBox2.Text = "Player " + Form5.player[1] + " scored " + Form5.score[1];
                textBox3.Text = "Player " + Form5.player[2] + " scored " + Form5.score[2];
                textBox4.Text = "Player " + Form5.player[3] + " scored " + Form5.score[3];
                break;
            case 5:
                textBox1.Text = "Player " + Form5.player[0] + " scored " + Form5.score[0];
                textBox2.Text = "Player " + Form5.player[1] + " scored " + Form5.score[1];
                textBox3.Text = "Player " + Form5.player[2] + " scored " + Form5.score[2];
                textBox4.Text = "Player " + Form5.player[3] + " scored " + Form5.score[3];
                textBox5.Text = "Player " + Form5.player[4] + " scored " + Form5.score[4];
                break;

记分板表单本身只是5个文本框。 关于如何解决/完成此问题的任何想法,或关于新方法的建议?我见过有人提到XML文件,但我不知道如何使用这些文件。 在此先感谢您的任何建议。

3 个答案:

答案 0 :(得分:2)

理想情况下,您想要创建一个对象,将其命名为PlayerScore,该对象将同时包含玩家编号和得分。

然后,您可以按分数对PlayerScores列表进行排序,而玩家ID仍与排序后的分数列表具有关联。

public class PlayerScore
{
    public int PlayerId
    {
        get;
        set;
    }
    public int Score
    {
        get;
        set;
    }
    public PlayerScore(){

    }   

}

答案 1 :(得分:0)

如果我对您的理解正确,那么您遇到的问题就是“排序”部分。 您可以使用linq轻松对其进行排序。

让我们假设您有一个名为“ PlayerScores”的集合,如Joshua所说,它具有所有玩家/得分对(或者,如果您愿意的话,它也可以在这里使用字典),那么您可以执行以下操作:

var orderedScores = PlayerScores.OrderByDescending(x => x.Score);

此外,如果您更喜欢使用数组,则可以使用ToArray()将其链接起来:

var orderedScores = PlayerScores.OrderByDescending(x => x.Score).ToArray();

答案 2 :(得分:0)

您可以通过使用循环并按如下所示通过id查找元素来改进排行榜代码。您可能必须将“控件”更改为承载文本框的容器。

for (int i = 0; i < Form5.player.Count; i++)
{
    var control = Controls.Find($"textBox{i+1}", true).First();
    control.Text = $"Player {Form5.player[i]} scored {Form5.score[i]}";
}