检查另一个 class [C#] 中的私有值

Checking a private value in another class [C#]

我正在控制台中制作一个简单的飞镖游戏,用于练习在任何地方使用私有列表和变量的作业。一些上下文的程序基本流程如下:

  1. 用户进入菜单
  2. 用户从1-4中选择。 (1 = 添加玩家,2 = 添加 CPU,3 = 开始游戏,4 = 退出)
  3. 游戏开始。玩家每回合手动添加 3 次投掷,CPU 随机获得。
  4. 当玩家或 CPU 得分达到 301 时,循环结束,您现在可以看到获胜者的每一次投掷。

class 结构上下文的 UML 图:https://i.imgur.com/bL5pZV5.png

一切都差不多完成了。我已经将程序制作到玩家和 CPUs 都获得随机值(被视为 CPU 玩家)的程度,它会正确打印出所有内容并按照流程进行到底。

我现在的问题是,我希望能够从游戏 class 访问玩家 class 中私有的 is_CPU 变量,并在 IF 检查中使用它, 指示值是手动添加还是随机生成。

伪代码:

FOREACH (var player in player_list)
  IF (is_CPU == TRUE) 
    THEN Assign random values 
  ELSE
    THEN Manually enter values

我试着弄乱了 get-set 的东西,但我不完全理解如何使用它们以及它们是如何工作的。我在这里环顾四周,仍然看不出在这种情况下我应该如何使用它们,如果有的话。

我可以想到一种方法来解决这个问题,那就是通过创建一个方法 just 来检查该值和 returns true/false,但这似乎是 'lazy' 或不正确的方法,并且有几个缺点。我觉得应该有一个更好的方法来做到这一点,一个以后不会回来咬我屁股的方法。希望有,在这里问一下就知道了。

编辑: 变量和列表必须是私有的。这是我们学习如何处理这些问题的练习的一部分。

为了访问 class 实例的 private members,您必须使用 public getter 在 class 上定义 properties,如下所示:

public class Player
{
    private Boolean m_IsCPU;

    public Boolean IsCPU
    {
        get { return m_IsCPU; }
    }

    // ...
}

或更改这些成员以使它们成为public,如下:

public class Player
{
    public Boolean IsCPU;

    // ...
}

无论您选择什么(我建议您选择 first approach),在您必须检查每个实例的 IsCPU property/member 的代码的任何部分Player class,你可以这样操作:

foreach (Player player in players)
{
    if (player.IsCPU)
        // Do Something...
    else
        // Do Something Else...
}

一些有趣的链接:

我想你只是想在你的播放器 class 上获得 属性。

public bool IsCpu { get { return is_CPU; }}

另见 c# properties

像这样重新设计您的应用程序:

   Class Game
          List<IPlayer> Players
          ShowMenu()
          AddPlayer()
          StartGame()
          IsGameOver(): boolean

   Interface IPlayer
          Turn() : Score

   CpuPlayer: IPlayer
   Player: IPlayer

将你的逻辑分成两个不同的类:你不需要检查。在游戏中对每个玩家都一视同仁。稍后,如果您提出 'NetworkPlayer'、'AIPlayer'、'SuperPlayer',您可以轻松地添加到您的系统中。

在您的菜单中:

    switch (userInput) {
          case AddUser:
                 AddPlayer(new Player());
                 break;
          case AddCpuPlayer:
                 AddPlayer(new CpuPlayer());
                 break;

在您的游戏中:

    while (!IsGameOver) 
    {
          var nextPlayer = ... next player
          nextPlayer.Turn() ...
    }