达特兰游戏

Netsid.

成员
加入
2月10日,2020年
消息
21
编程经验
Beginner
我正在做另一个学校项目,我有点陷入困境..我建立了一个非常简单的达特兰游戏,并且已经为带有字符串和int的字符串创建了一个课程的课程。我列出了那个课程的清单,我想我设法让它在这一点上工作。这是我困扰的地方。这将是滚动玩家列表的最佳方式,显示当前的玩家名称和点,我认为我会手动输入他们的点或选择在添加之前在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);
        }
    }
}
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
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.

成员
加入
2月10日,2020年
消息
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行是IM在RN尝试输入当前播放器和点的位置。我也必须弄清楚如何通过转级类添加点到当前播放器。

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);
        }
    }
}
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
您完全按照我的显示实施。当您想要获取当前玩家的名称以显示或更新他们的分数时,您调用getCurrentPlayer。当该玩家的转弯完成后,您调用selectnextplayer。 GetCurrentPlayer将返回下一个播放器。如代码中的建议,SelectNextPlayer将在最后一次后自动包装回第一个播放器。只要你在打电话给这些方法之前将至少一个玩家添加到列表之前,你就会好转。
 

Netsid.

成员
加入
2月10日,2020年
消息
21
编程经验
Beginner
您完全按照我的显示实施。当您想要获取当前玩家的名称以显示或更新他们的分数时,您调用getCurrentPlayer。当该玩家的转弯完成后,您调用selectnextplayer。 GetCurrentPlayer将返回下一个播放器。如代码中的建议,SelectNextPlayer将在最后一次后自动包装回第一个播放器。只要你在打电话给这些方法之前将至少一个玩家添加到列表之前,你就会好转。
男人我没有得到它的工作,我不确定之前有一些潜在的问题。我进入控制台的唯一消息是"namespace.Classname" or "system.collections.generic.list`1 [testdartboard.player] "不应该是一个问题从一个带有字符串和int的类中的列表中的问题?对不起,我觉得我是我的  :哈哈:  O_O.  O_O.
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
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.
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
你觉得这应该怎么做?
C#:
console.writeline(players);
玩家 是A. 列表<Player>。当您为控制台编写一个复杂对象时,您认为应该发生什么?为什么?那是你真正想在那一点写的东西吗?
 

Netsid.

成员
加入
2月10日,2020年
消息
21
编程经验
Beginner
你觉得这应该怎么做?
C#:
console.writeline(players);
玩家 是A. 列表<Player>。当您为控制台编写一个复杂对象时,您认为应该发生什么?为什么?那是你真正想在那一点写的东西吗?
我留下了控制台.Writeline(玩家);更像是我想要做的信号,我也许应该留下评论。我试过它
console.writeline("目前播放:{0}",getCurrentPlayer());
或console.writeline("目前播放:{CurrentPlayerIndex}",getCurrentPlayer());约有1000种其他方式..
 

Netsid.

成员
加入
2月10日,2020年
消息
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.
所以我需要一个在目标类中的方法,我想展示拓展?
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
我留下了控制台.Writeline(玩家);更像是我想要做的信号,我也许应该留下评论。我试过它
console.writeline("目前播放:{0}",getCurrentPlayer());
或console.writeline("目前播放:{CurrentPlayerIndex}",getCurrentPlayer());约有1000种其他方式..
getCurrentPlayer. 返回A. 播放器 目的。您究竟想显示什么,为什么您认为应该自动发生?如果要显示该播放器的名称,则获取名称并显示。如果您希望以特定方式格式化的名称和分数,则获得这些值,格式化它们并显示。如果您希望自动发生这种情况,那么该功能必须在内部 播放器 班级。具体来说,内部 toString. 方法,如已经陈述了。你有没有研究过 toString. method?
 

jmplhinney.

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

Netsid.

成员
加入
2月10日,2020年
消息
21
编程经验
Beginner
toString. 返回A. 细绳 当前对象的表示。如果您不想接受默认实现,即对象类型的名称,那么您必须自己提供该实现,即覆盖该方法。如果您仍然不确定如何继续,下一步是打开您喜欢的搜索引擎并输入"c# override tostring".
我真的不知道,得责怪我的老师  :哈哈: 我正在做的课程缺乏任何血统学习材料,我真的很疯狂。谢谢,我想我现在应该能够解决它......很重 :Roflmao::Roflmao:
 

Netsid.

成员
加入
2月10日,2020年
消息
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);
        }
    }
}
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
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-Casing为公共属性,也是最常见的惯例,(构造函数)方法参数的骆驼壳。现在你可以对待 名称 就像你都会有其他财产,例如,这 文本 A. 文本框 .

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

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
在玩家课程之外没有课程需要访问范围 名称 属性如果OP是将值传递给构造函数。从划分的潜在观点;它击败了他们在那里的目的。在Get Setder访问块之后也不应该是任何分号,并且他们将在我看来中最好地设定私密。尽管有了语法错误,但它会做这项工作。 +1
公共字符串名称{GET;放; };公共INT点{GET;放; };
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
在玩家课程之外没有课程需要访问范围 名称 属性如果OP是将值传递给构造函数。从划分的潜在观点;它击败了他们在那里的目的。
具体问题是如何改变玩家的分数,以便至少需要一种方法来修改。实际上,我可能会说构造函数只应该将名称作为分数默认为零。名称可能是只读的,因为可能不应该需要更改播放器名称中游戏。
Get Setsers访问块后也不应该是任何分号
这就是我在网站上直接编辑而不是与Vs进行编辑的。 :翻白眼:
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
旧习惯约翰,他们总会抓住你。  ;)

我明白了这个问题。我只是以为你会走额外的一点,以不同的方式实现它,以便该类仅实现所需的内容,并且也使其严格键入。实际上纠正自己,现在自己。我认为分数不应该存储在玩家课程中,因为这也击败了C#中的一个班级建筑法律。不要超过课程的目的要做的目的,因此实际上应该在单独的课程中处理分数。  (y)

我很快就会回来。尽快回复你!
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
在此上下文中,我没有这个类的问题。如果你在谈论联赛或锦标赛,那里一名球员是一个人在多场比赛中发挥的人,我可以看到你在说什么。但是,在这种情况下,播放器仅存在于单个游戏的持续时间内,因此分数是该实体的一部分是有意义的。在一个更复杂的应用程序中,您将拥有一种类型的类型,它代表了这个人而不是名称的字符串,但您仍然有一些识别与他们的分数耦合的人的东西。
 

Netsid.

成员
加入
2月10日,2020年
消息
21
编程经验
Beginner
这个作业我表示,如果我想要任何更高的等级,我需要将所有字段和列表设置为私人,而不是只是通过,我真的不能告诉你为什么,但我希望有一个原因..  :哈哈: 不,但真的我认为它所以我们学会究竟是我们的老板/客户想要它的命令和建立程序,但其中一些项目已经真的愚蠢了..我再次读了作业并意识到我搞砸了。课堂播放器常规不需要包含点字段,但应该保持一个<List>转身,转动类的列表......但是我可以存储分数,但是我想要的方式是这个,我不能弄明白,我不能想到更好的方式 :使困惑:
 
最佳 底部