检查另一个 class [C#] 中的私有值
Checking a private value in another class [C#]
我正在控制台中制作一个简单的飞镖游戏,用于练习在任何地方使用私有列表和变量的作业。一些上下文的程序基本流程如下:
- 用户进入菜单
- 用户从1-4中选择。 (1 = 添加玩家,2 = 添加 CPU,3 = 开始游戏,4 = 退出)
- 游戏开始。玩家每回合手动添加 3 次投掷,CPU 随机获得。
- 当玩家或 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...
}
一些有趣的链接:
- Access Modifiers
- C# Properties
- Why prefer Properties to public variables?
我想你只是想在你的播放器 class 上获得 属性。
public bool IsCpu { get { return is_CPU; }}
像这样重新设计您的应用程序:
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() ...
}
我正在控制台中制作一个简单的飞镖游戏,用于练习在任何地方使用私有列表和变量的作业。一些上下文的程序基本流程如下:
- 用户进入菜单
- 用户从1-4中选择。 (1 = 添加玩家,2 = 添加 CPU,3 = 开始游戏,4 = 退出)
- 游戏开始。玩家每回合手动添加 3 次投掷,CPU 随机获得。
- 当玩家或 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...
}
一些有趣的链接:
- Access Modifiers
- C# Properties
- Why prefer Properties to public variables?
我想你只是想在你的播放器 class 上获得 属性。
public bool IsCpu { get { return is_CPU; }}
像这样重新设计您的应用程序:
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() ...
}