实现类似类

Implementing Similar Classes

本文关键字:实现      更新时间:2023-10-16

我是C++编程的新手,正在Visual C++中制作Pong。我的游戏将有两种游戏模式,多人和单人。现在,我正计划为单人划桨和多人划桨开设一个单独的课程。(所以我会有PaddleMP RpaddleMP, LpaddleMP;PaddleSP RpaddleSP, LpaddleSP;,其中R和L分别代表左右划桨)。然而,多人划桨和单人划桨的代码将非常相似。两者都使用一个类,并简单地有一个初始化器函数,让我可以选择是单人划桨还是多人划桨,或者我应该为两者都创建一个新的类,这会更好吗?

桨就是桨,不管你把它放在哪里,也不管谁控制它。

控制(人工智能或人工控制)应而不是桨的一部分,因此不应影响桨类。

同样,如果您需要重写类以将其放置在屏幕的另一端,则这是一个非常糟糕的操作。

这在很大程度上取决于类中的代码类型。根据这一点,您可以:

  • 使用相同的类,并在初始化时传递详细信息(如果它们在本质上与大部分共享代码非常相似)
  • 编写一个实现共享代码的基类,并派生特定功能的类

在大多数情况下,后者更有意义。

IMO,这里有两个问题。首先,我认为你选择的名字(单人对多人)很糟糕。其次,我认为球拍本身应该独立于移动球拍的输入。

因此,实际上应该只有一种桨型。你可以告诉它向上或向下移动,它会按照你告诉它的方向移动,但球拍本身对移动命令的来源一无所知。

然后我会有一些东西来创建/发送输入到桨板。在我看来,这里的相关区别不是单人与多人,而是玩家输入和人工智能输入之间的区别。

因此,我们有一个玩家输入,可以从鼠标、键盘、操纵杆等读取相关数据,并将其转换为相关命令发送到桨板。我们还有一个AI输入,它可以产生类似的命令,但基于自己的计算,而不是用户的输入。

这就是你想要继承的地方——AI输入和玩家输入都继承自可以生成命令的通用输入类型。根据你的口味,你可能也不想要真正的玩家输入——相反,你可能需要键盘输入、操纵杆输入和鼠标输入。例如,如果你决定添加对多点触摸屏之类的东西的支持,这可能会让事情变得更容易,这可能至少与上面的任何一个有所不同(但仍然遵循相同的协议/实现相同的界面)。

从面向对象的角度来看,在Paddle类中填充多人或单人数据是没有意义的。Paddle类应该只描述球拍特有的行为,例如尺寸、运动和你拥有的东西。

一个或多个桨叶的使用方式应在单独的类别中定义,可能在Behavior类别中,例如桨叶的位置是否应取决于另一个桨叶的位置。您可能应该拥有MultiplayerBehaviorSinglePlayerBehavior

最终,您可以拥有将这两个绑定在一起的代码,即一组Paddle实例和一个特定的Behavior。这可能是Setup类,它聚合了这两个类。

好吧,我认为最适合你的决定是创建一个抽象基类Paddle,它将拥有各种球拍的所有公共代码,然后从中派生多人和单人球拍

class Paddle {};
class PaddleMP : public Paddle {};
class PaddleSP : public Paddle {};

同样,您可以从PaddleMP导出RpaddleMPLpaddleMP,从PaddleSP导出RpaddleSPLpaddleSP。如果这种方法对您来说是新的,我建议您阅读更多关于C++中继承的内容。