飞镖游戏

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
我正在做另一个学校项目,有点卡住了。.我建立了一个非常简单的飞镖游戏,并开设了一个班级,用名称的字符串和积分的字符串创建玩家。我列出了该课程的清单,我认为我已经设法使它发挥了作用。这就是我卡住的地方。这将是滚动播放器列表,显示当前播放器名称和分数的最佳方法,我想让播放器手动输入其点数,或选择获取1-20之间的3个随机点,然后在添加之前将其随机写入到他们当前的分数,然后继续前进到下一个玩家。欢迎所有想法,建议适当!

dartgame:
using System;
using System.Collections.Generic;
using System.Text;

namespace dartboardskiss
{
    class Game
    {
        private List<Player> players = new List<Player>();

        public void AddPlayer()
        {
            Console.WriteLine("Type the name of the player and press enter.");
            string name = Console.ReadLine();
            Player person = new Player(name, 0);
            players.Add(person);
        }
        private int PlayerCounter()                    //method to keep track of players
        {
            int playercounter = 0;
            foreach (Player _player in players)
            {
                if (_player != null)
                    playercounter++;
            }
            return playercounter;
        }


        public Game()
        {
            do
            {
                //switch statement menu
                Console.WriteLine("Welcome to the Dartgame, what would you like to do?");
                Console.WriteLine("1. Add player");
                Console.WriteLine("2. Start the game");
                int choice = int.Parse(Console.ReadLine());
                switch (choice)
                {
                    case 1:
                        this.AddPlayer();
                        break;
                    case 2:
                        Console.WriteLine("");
                        break;
                    default:
                        Console.WriteLine("");
                        break;
                }
            } while (true);
        }
    }
    class Player                    //class for creating player                               
    {
        private string name;
        private int points;

        public Player(string name, int points)
        {
            this.name = name;
            this.points = points;
        }
        //Tuple for returning values
        public static implicit operator Player((string nname, int npoints) v)
        {
            return new Player(v.nname, v.npoints);
        }
    }
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
如果我正确地解释了您的问题,那么您所需要做的就是:
C#:
private int currentPlayerIndex = 0;
private readonly List<Player> players = new List<Player>();

private Player GetCurrentPlayer()
{
    return players[currentPlayerIndex];
}

private void SelectNextPlayer()
{
    // Increment the index and wrap back to zero when passing the upper bound.
    currentPlayerIndex = (currentPlayerIndex + 1) % players.Count;
}
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
如果我正确地解释了您的问题,那么您所需要做的就是:
C#:
private int currentPlayerIndex = 0;
private readonly List<Player> players = new List<Player>();

private Player GetCurrentPlayer()
{
    return players[currentPlayerIndex];
}

private void SelectNextPlayer()
{
    // Increment the index and wrap back to zero when passing the upper bound.
    currentPlayerIndex = (currentPlayerIndex + 1) % players.Count;
}

感谢您的帮助!我不确定如何实现该目标,我已经重写了一些代码,现在看起来像这样。.这些都是为了通过学校项目而不得不使用的所有类和方法。第12-23行是即时通讯试图输入当前玩家并指向的位置。我还必须弄清楚如何通过Turns类将积分添加到当前玩家。

C#:
using System;
using System.Collections.Generic;
using System.Text;

namespace testdartboard
{

    class Game
    {
        private List<Player> players = new List<Player>();

        public List<Player> ReturnPlayer()
        {
            return players;
        }

        public void PlayGame()
        {
                Console.WriteLine("Enter points 1-20 and press enter, to randomize type 21!");
                Console.WriteLine("Currently playing: ");
                Console.WriteLine(players);
                Console.ReadLine();   
        }
        public Game()
        {
            do
            {
                //switch statement menu
                Console.WriteLine("Welcome to the Dartgame, what would you like to do?");
                Console.WriteLine("1. Add player");
                Console.WriteLine("2. Start the game");
                int choice = int.Parse(Console.ReadLine());
                switch (choice)
                {
                    case 1:
                        this.AddPlayer();
                        break;
                    case 2:
                        this.PlayGame();
                        break;

                    default:
                        Console.WriteLine("");
                        break;
                }
            } while (true);
        }
        public void AddPlayer()                         //method for adding players
        {
            Console.WriteLine("Type the name of the player and press enter.");
            string name = Console.ReadLine();
            Player person = new Player(name, 0);
            players.Add(person);
        }
        /*      private int PlayerCounter()                    //method to keep track of players
          {
              int playercounter = 0;
              foreach (Player _player in players)
              {
                  if (_player != null)
                      playercounter++;
              }
              return playercounter;
          }*/
    }
    class Player                    //class for creating player                               
    {
        private string name;
        private int points;

        public Player(string name, int points)      //constructor to access class
        {
            this.name = name;
            this.points = points;
        }
    }
    class Program       //runs Game
    {
        static void Main(string[] args)
        {
            Game game = new Game();
        }
    }
    class Turns
    {
        private int turnOne;
        private int turnTwo;
        private int turnThree;
        public Turns(int _turnOne, int _turnTwo, int _turnThree)
        {
            turnOne = _turnOne;
            turnTwo = _turnTwo;
            turnThree = _turnThree;
        }

        public int Get_Score()
        {
            int total;
            total = turnOne + turnTwo + turnThree;
            return total;
        }

        public override string ToString()
        {
            return string.Format("Throw #1 : {0}, Throw #2 : {1},  Throw #3 : {2}", turnOne, turnTwo, turnThree);
        }
    }
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
您完全按照我的说明实施了它。要获取当前玩家的名称以显示或更新其得分时,可以调用GetCurrentPlayer。该玩家的回合结束后,您可以调用SelectNextPlayer。然后,GetCurrentPlayer将返回下一个播放器。根据代码中的建议,SelectNextPlayer将自动换回最后一个播放器。只要在调用这些方法之前将至少一个播放器添加到列表中,您就可以进行。
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
您完全按照我的说明实施了它。要获取当前玩家的名称以显示或更新其得分时,可以调用GetCurrentPlayer。该玩家的回合结束后,您可以调用SelectNextPlayer。然后,GetCurrentPlayer将返回下一个播放器。根据代码中的建议,SelectNextPlayer将自动换回最后一个播放器。只要在调用这些方法之前将至少一个播放器添加到列表中,您就可以进行。
我无法使其正常工作,我不确定之前是否存在一些潜在问题。我在控制台中得到的唯一消息是"namespace.Classname" or "System.Collections.Generic.List`1 [testdartboard.Player] "从具有字符串和int的类中创建这样的列表应该不是问题吗?对不起,我觉得你像个傻瓜 :哈哈: o_Oo_O
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,606
地点
弗吉尼亚州切萨皮克
编程经验
10+
The behavior you are seeing is as expecting. The ToString() needs to be overridden by each class implementation if they want to change what is displayed. The default implementation of ToString() is to just return the type information of the class.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
您认为这到底应该做什么?
C#:
Console.WriteLine(players);
玩家 是一个 列表<Player>。当您将类似的复杂对象写入控制台时,您认为应该怎么办?为什么?那就是您当时实际上想要写的东西吗?
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
您认为这到底应该做什么?
C#:
Console.WriteLine(players);
玩家 是一个 列表<Player>。当您将类似的复杂对象写入控制台时,您认为应该怎么办?为什么?那就是您当时实际上想要写的东西吗?
我离开了Console.WriteLine(players);作为我正在尝试做的事情的信号,我也许应该留下评论了。
Console.WriteLine("当前正在播放:{0}",GetCurrentPlayer());
或Console.WriteLine("目前正在播放:{currentPlayerIndex}",GetCurrentPlayer());以及大约1000种其他方式
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
The behavior you are seeing is as expecting. The ToString() needs to be overridden by each class implementation if they want to change what is displayed. The default implementation of ToString() is to just return the type information of the class.
所以我需要在目标类中具有要显示的超值的方法?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
我离开了Console.WriteLine(players);作为我正在尝试做的事情的信号,我也许应该留下评论了。
Console.WriteLine("当前正在播放:{0}",GetCurrentPlayer());
或Console.WriteLine("目前正在播放:{currentPlayerIndex}",GetCurrentPlayer());以及大约1000种其他方式
GetCurrentPlayer 返回一个 播放器 目的。您想确切显示什么?为什么要自动显示呢?如果要显示该播放器的名称,请获取名称并显示。如果要以特定方式格式化名称和分数,则获取这些值,对其进行格式化并显示出来。如果您希望这种情况自动发生,则该功能必须位于 播放器 班级。具体来说,在 ToString 如前所述。你研究了 ToString method?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
所以我需要在目标类中具有要显示的超值的方法?
ToString 返回一个 细绳 当前对象的表示形式。如果您不想接受默认的实现,即对象类型的名称,则必须自己提供该实现,即覆盖该方法。如果您仍然不确定如何继续,则下一步是打开您喜欢的搜索引擎并输入"c# override tostring".
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
ToString 返回一个 细绳 当前对象的表示形式。如果您不想接受默认的实现,即对象类型的名称,则必须自己提供该实现,即覆盖该方法。如果您仍然不确定如何继续,则下一步是打开您喜欢的搜索引擎并输入"c# override tostring".
我真的不知道,要怪我的老师 :哈哈: 我正在做的这门课程缺乏任何后裔学习材料,而且我真的发疯了。谢谢,我想我应该现在就可以弄清楚。 :ROFLMAO::ROFLMAO:
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
非常感谢你们的帮助,但我再次陷入困境,这不是最后一次确定 :极客::哈哈: 我如何在不更改名称的情况下更改当前玩家的积分值?实际上,我什至无法弄清楚如何同时更改它们两者?这是RN nyways上的即时消息:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dartboardtostringproblems
{
    class Game
    {
        private List<Player> players = new List<Player>();
        private List<Turns> turn_list = new List<Turns>();      //WILL BE USED TO ADD POINTS LATER
        public void PlayGame()
        {   

            for (int i = 0; i < players.Count; i++)
            {
                Player _name = players[i];
                Console.WriteLine("Enter points 1-20 and press enter! First to 301 wins!!");
                Console.WriteLine(_name);
                Console.ReadLine();
                //int v = int.Parse(Console.ReadLine());            THIS IS WHERE IM TRYING TO CHANGE THE POINTS
                //players[i] = v;
            }
            
        }
        public Game()
        {
            do
            {
                //switch statement menu
                Console.WriteLine("Welcome to the Dartgame, what would you like to do?");
                Console.WriteLine("1. Add player");
                Console.WriteLine("2. Start the game");
                int choice = int.Parse(Console.ReadLine());
                switch (choice)
                {
                    case 1:
                        this.AddPlayer();
                        break;
                    case 2:
                        this.PlayGame();
                        break;

                    default:
                        Console.WriteLine("");
                        break;
                }
            } while (true);
        }
        public void AddPlayer()                         //method for adding players
        {
            Console.WriteLine("Type the name of the player and press enter.");
            string name = Console.ReadLine();
            Player person = new Player(name, 0);
            players.Add(person);
        }
    }
    class Player                    //class for creating player                               
    {
        private string name;
        private int points;

        public override string ToString()
        {
            return string.Format("Player: {0} has Points: {1}", this.name, this.points);
        }
        public Player(string Name, int Points)      //constructor to access class
        {
            name = Name;
            points = Points;
            Console.WriteLine("A new player was added.");
        }
    }
    class Program       //runs Game
    {
        static void Main(string[] args)
        {
#pragma warning disable IDE0059 // Unnecessary assignment of a value
            Game game = new Game();
#pragma warning restore IDE0059 // Unnecessary assignment of a value
        }
    }
    class Turns
    {
        private readonly int turnOne;
        private readonly int turnTwo;
        private readonly int turnThree;
        public Turns(int _turnOne, int _turnTwo, int _turnThree)
        {
            turnOne = _turnOne;
            turnTwo = _turnTwo;
            turnThree = _turnThree;
        }

        public int Get_Score()
        {
            int total;
            total = turnOne + turnTwo + turnThree;
            return total;
        }

        public override string ToString()
        {
            return string.Format("Throw #1 : {0}, Throw #2 : {1},  Throw #3 : {2}", turnOne, turnTwo, turnThree);
        }
    }
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
您遇到麻烦的原因是 播放器 课程实施不力。您只有那些值的专用字段。您应该具有公共属性:
C#:
class Player                    //class for creating player                              
{
    public string Name { get; set; }
    public int Points { get; set; }

    public override string ToString()
    {
        return string.Format("Player: {0} has Points: {1}", this.Name, this.Points);
    }
   
    public Player(string name, int points)      //constructor to access class
    {
        Name = name;
        Points = points;
        Console.WriteLine("A new player was added.");
    }
}
请注意,我已经将Pascal框用于公共属性,并且按照最常见的约定,将骆驼框用于(构造函数)方法参数。现在可以治疗 姓名点数 就像您拥有其他任何财产一样这 文本文本框.

顺便说一句,我倾向于使用 分数 而不是 点数.
 
Last edited:

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
玩家类别之外的任何类别都不需要访问以下内容的范围 姓名 点数 属性,如果OP将值传递给构造函数。从范围界定的未来;它打败了他们在那里的目的。在get setters访问块之后也不应有任何分号,在我看来,最好将它们设置为私有。尽管存在语法错误,它仍然可以完成工作。 +1
公共字符串名称{get;放; }; public int Points {获取;放; };
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
玩家类别之外的任何类别都不需要访问以下内容的范围 姓名 点数 属性,如果OP将值传递给构造函数。从范围界定的未来;它打败了他们在那里的目的。
具体的问题是如何更改玩家的分数,因此至少需要一种方法来修改分数。实际上,我可能会说构造函数应该仅使用名称,因为分数可能默认为零。该名称可能是只读的,因为可能不需要在游戏中更改玩家的名称。
在get setters访问块之后也不应有任何分号
这就是我直接在网站而不是VS中进行编辑所得到的。 :翻白眼:
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
老习惯约翰,他们总是会吸引你的。 ;)

我明白这个问题。我只是以为您会花更多的精力来实现它,因此该类将仅实现所需的内容,并对其进行严格类型化。实际上纠正自己,现在纠正自己。我认为分数也不应该存储在玩家类中,因为这也违反了C#中的类建立法则。不要超出某个班级意图的目的,因此分数应实际上在单独的班级中处理。 (y)

我希望很快会回来。尽快回复你!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
在这种情况下,我对该类没有问题。如果您谈论的是联赛或锦标赛,而玩家是一个会参加多场比赛的人,那么我就能明白您在说什么。但是,在这种情况下,玩家只在单个游戏的持续时间内存在,因此得分是该实体的一部分是有意义的。在更复杂的应用程序中,您将拥有一个代表该人的类型的属性,而不仅仅是代表姓名的字符串,但是您仍然会有一些东西可以识别该人及其得分。
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
我得到的这份作业说,如果我想获得不只是通过的更高等级,就需要将所有字段和列表都设置为私有,我真的不能告诉你为什么,但是我希望有原因。 :哈哈: 不,但是我确实认为如此,因此我们学会了按照老板/客户的要求去定购和构建程序,但是其中一些项目确实很愚蠢。.我再次阅读作业,意识到我搞砸了。班级播放器视情况不需要包含点数字段,但应该包含一个<List>转弯,是转弯类的列表,但是...但是我可以存储点数,但是我想出的方式是这样,我无法弄清楚我也无法想出更好的方法 :使困惑:
 
最佳 底部