我正在编写简单的纸牌游戏“ war ”作为家庭作业,现在游戏可以运行了,我正在努力使其更加模块化和井井有条。下面是 Main()
的一部分,其中包含大部分程序。我应该提一下,该类(class)是用 C# 教授的,但它不是 C# 类(class)。相反,我们正在学习基本逻辑和 OOP 概念,因此我可能没有利用某些 C# 功能。
bool sameCard = true;
while (sameCard)
{
sameCard = false;
card1.setVal(random.Next(1,14)); // set card value
val1 = determineFace(card1.getVal()); // assign 'face' cards accordingly
suit = suitArr[random.Next(0,4)]; // choose suit string from array
card1.setSuit(suit); // set card suit
card2.setVal(random.Next(1,14)); // rinse, repeat for card2...
val2 = determineFace(card2.getVal());
suit = suitArr[random.Next(0,4)];
card2.setSuit(suit);
// check if same card is drawn twice:
catchDuplicate(ref card1, ref card2, ref sameCard);
}
Console.WriteLine ("Player: {0} of {1}", val1, card1.getSuit());
Console.WriteLine ("Computer: {0} of {1}", val2, card2.getSuit());
// compare card values, display winner:
determineWinner(card1, card2);
所以这是我的问题:
- 我可以在 Main() 中使用循环并仍然认为它是模块化的吗?
- 抽卡过程是否写得好/包含得当?
- 在方法中打印消息是否被认为是不好的做法(即:
determineWinner()
)?
我只学了两个学期的编程,我想在这个阶段养成良好的习惯。任何输入/建议将不胜感激。
编辑:
catchDuplicate() 现在是一个 bool 方法,调用如下所示:
sameCard = catchDuplicate(card1, card2);
感谢@Douglas。
最佳答案
Can I use loops in Main() and still consider it modular?
是的,你可以。然而,OOP 程序中的 Main
通常只包含少数启动核心功能的方法调用,然后存储在其他类中。
Is the card-drawing process written well/contained properly?
部分。如果我正确理解您的代码(您只显示 Main
),您将执行一些操作,如果以错误的顺序或错误的值执行这些操作,可能不会有好的结果。这样想:如果您出售您的类库(不是整个产品,而只是您的类),对于外行用户来说,使用您的类库的最明确方式是什么?
即,考虑包含一副纸牌的类 Deck
。在创建时,它会创建所有卡片并洗牌。给它一个方法 Shuffle
来在你的类的用户需要洗牌时洗牌,并添加像 DrawCard
这样的方法来处理发牌。
此外:您拥有不包含在它们自己的类中但具有在类中更好的功能的方法。即,determineFace
更适合作为类 Card
的方法(假设 card2
是 Card
类型)。
Is it considered bad practice to print messages in a method (i.e.: determineWinner())?
是也不是。如果您只想在测试期间显示消息,请使用 Debug.WriteLine
。在生产构建中,这些将是空操作。但是,当您在生产版本中编写消息时,请确保从方法名称中清楚这一点。即,WriteWinnerToConsole
或其他内容。
更常见的是不这样做是因为:您将以什么格式打印信息?它应该附带什么文字?你如何处理本地化?但是,当您编写程序时,显然它必须包含将内容写入屏幕(或表单或网页)的方法。为此目的,这些通常包含在特定的类中。例如,这可能是 CardGameX
类。
总体思路
想想“一个方法/函数应该只有一个任务,只有一个任务,它不应该有副作用(比如计算平方和打印,那么打印就是副作用)”的原则。
类的原则是非常高层次的:一个类包含逻辑上属于一起并在同一组属性/字段上运行的方法。相反的例子:Shuffle
不应该是 Card
类中的方法。但是,它在逻辑上属于 Deck
类。
关于c# - 在 Main() 中保持模块化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10057958/