嗨,亲爱的StackOverflow!我是学习C#的新手,而且我坚持使用“添加分数”计划。
我正在尝试做的基本想法是:
例如:
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;
}
}
答案 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];
}
}
}