跟踪列表中的得分以及名称

时间:2014-02-14 13:53:14

标签: c# list loops

嗨,亲爱的StackOverflow!我是学习C#的新手,而且我坚持使用“添加分数”计划。

我正在尝试做的基本想法是:

  • 输入多个玩家
  • 说明上述球员数量
  • 让所有玩家在3轮中增加3个分数
  • 显示每位玩家每轮的得分。

例如:

players = 1
name = bilbo

round1 begins:
score1 = 10
score2 = 10
score3 = 10

round2 begins:
score1 = 20
score2 = 20
score3 = 20

round2 begins:
score1 = 30
score2 = 30
score3 = 30

game ends:
Congratulations bilbo your score was as follows:
round1:
10,10,10
round2:
20,20,20
round3:
30,30,30
Total score: 180

我的问题是我不知道如何跟踪每轮。它现在对我有用的方式是它覆盖了分数,所以显示的唯一分数是最后一分。在这种情况下,输出看起来像

total score: 90 // aka the last 3 scores

如何跟踪每一轮并将该分数连接到正确的玩家?

我知道几乎没有验证,但这对我来说不是问题所在:)

周末度过了愉快的周末,并感谢你们提供任何帮助。

到目前为止

代码:

class Program
{
  static void Main(string[] args)
  {
    List<Player> players = new List<Player>();
    Console.WriteLine("How many players?");
    int howManyPlayers = Convert.ToInt32(Console.ReadLine());

    for (int i = 0; i < howManyPlayers; i++)
    {
      Console.WriteLine("Name the player");
      Player playa = new Player() { Name = Console.ReadLine()};
      players.Add(playa);
    }

    for (int i = 0; i < 3; i++)
    {
      foreach (var item in players)
      {
        Console.WriteLine("Enter points1 for round {}", i);
        int round1Input = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine("Enter points2 for round {}", i);
        int runda2Input = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine("Enter points3 for round {}", i);
        int runda3Input = Convert.ToInt32(Console.ReadLine());
        item.totalScore(item.arrow1 = round1Input, 
        item.arrow2 = runda2Input,   item.arrow3 = runda3Input);
      }
    }

    printAllPlayers(players);
  }

  static void printAllPlayers(List<Player> players)
  {
    Console.WriteLine("Printing {0} players ...", players.Count);
    foreach (Player player in players)
    {
      Console.WriteLine("Player: {0} \nScore: {1}", player.Name, player.Score);
    }
  }
}

class Player
{
  public string Name { get; set; }
  public int Score { get; set; }
  public int arrow1 { get; set; }
  public int arrow2 { get; set; }
  public int arrow3 { get; set; }

  public void totalScore(int arrow1, int arrow2, int arrow3)
  {
    Score = arrow1 + arrow2 + arrow3;
  }
}

3 个答案:

答案 0 :(得分:3)

根据John W的建议:

    static void Main(string[] args)
    {

        List<Player> players = new List<Player>();
        Console.WriteLine("How many players?");
        int howManyPlayers = Convert.ToInt32(Console.ReadLine());

        for (int i = 0; i < howManyPlayers; i++)
        {
            Console.WriteLine("Name the player");
            Player playa = new Player() { Name = Console.ReadLine() };
            players.Add(playa);
        }


        for (int i = 0; i < 3; i++)
        {
            foreach (var item in players)
            {
                // to avoid this repeating code, you could create a Round class
                // populate the Arrow*x* properties in a loop
                // and add the populated Round to the Player.
                Console.WriteLine("Player {0} - Enter points 1 for round {1}", item.Name, i + 1);
                int round1Input = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Player {0} - Enter points 2 for round {1}", item.Name, i + 1);
                int runda2Input = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Player {0} - Enter points 3 for round {1}", item.Name, i + 1);
                int runda3Input = Convert.ToInt32(Console.ReadLine());
                item.Rounds.Add(new Round(round1Input, runda2Input, runda3Input));
            }
        }

        printAllPlayers(players);
    }


    static void printAllPlayers(List<Player> players)
    {
        Console.WriteLine("Printing {0} players ...", players.Count);
        foreach (Player player in players)
        {
            Console.WriteLine("Player: {0} \nScore: {1}", player.Name, player.TotalScore);
        }
        Console.ReadLine();
    }

}

class Round
{
    public Round()
    {
    }

    public Round(int Arrow1, int Arrow2, int Arrow3)
    {
        arrow1 = Arrow1;
        arrow2 = Arrow2;
        arrow3 = Arrow3;
    }

    public int arrow1 { get; set; }
    public int arrow2 { get; set; }
    public int arrow3 { get; set; }
    public int Score
    {
        get
        {
            return arrow1 + arrow2 + arrow3;
        }

    }
}

class Player
{
    public Player()
    {
        Rounds = new List<Round>();
    }

    public string Name { get; set; }
    public List<Round> Rounds { get; set; }

    public int TotalScore
    {
        get
        {
            int score;
            score = 0;
            // iterate through the player's Rounds, summing the Scores
            foreach (var r in Rounds)
            {
                score += r.Score;
            }
            return score;
        }
    }

答案 1 :(得分:1)

听起来你需要一个Game对象,其属性为List<Round>Round可能有Dictionary<string,int>,其中string是玩家名称和int是分数。 Round也可以拥有RoundNumber属性

答案 2 :(得分:1)

我试图保持简单,并且大部分都遵循您的初始实施。如果事情不清楚,请告诉我。

static void Main(string[] args)
{  
    ...

    for (int i = 0; i < 3; i++) //this loop is for the 3 rounds
    {
        foreach (var player in players) //this one is for all the players
        {
            Console.WriteLine("Player {0}", player.Name); //output the player name

            List<int> roundScores;
            //this is not the best way to do it, but it's easier to understand
            if (j=0) roundScores = player.round1Scores;
            else if (j=1) roundScores = player.round2Scores;
            else if (j=2) roundScores = player.round3Scores;

            Console.WriteLine("Enter points1 for round {}", i + 1);
            roundScores.Add(Convert.ToInt32(Console.ReadLine()));
            Console.WriteLine("Enter points2 for round {}", i + 1);
            roundScores.Add(Convert.ToInt32(Console.ReadLine()));
            Console.WriteLine("Enter points3 for round {}", i + 1);
            roundScores.Add(Convert.ToInt32(Console.ReadLine()));
        }
    }
    printAllPlayers(players);
}

static void printAllPlayers(List<Player> players)
{
    Console.WriteLine("Printing {0} players ...", players.Count);
    foreach (Player player in players)
    {
        player.calcTotalScore(); //calculate the total score for this player
        Console.WriteLine("Player: {0} \nScore: {1}", player.Name, player.Score);
    }
}


class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
    public List<int> round1Scores { get; set; } // I used a List<int> here but you can choose to use an array int[] too
    public List<int> round2Scores { get; set; }
    public List<int> round3Scores { get; set; }

    public void calcTotalScore()
    {
        Score = 0; //initialize the total score.

        for (int i = 0; i < 3; i++)
        {
            Score += round1Scores[i];
            Score += round2Scores[i];
            Score += round3Scores[i];
        }
    }
}