我知道这个主题上有很多类似的问题,但是找不到任何对我有帮助的答案。我已经创建了一个游戏,您必须在其中声明您的玩家编号(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文件,但我不知道如何使用这些文件。 在此先感谢您的任何建议。
答案 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]}";
}