我在设计方面遇到了一些问题。也许我认为这一切都错了,但我所设计的似乎只是以程序的方式运作良好。
游戏
我正在做一个游戏,这个游戏有大约10-20名玩家,由3轮组成。当玩家启动游戏时,服务器从数据库加载他们的数据,将其存储在java类中,并将请求的数据发送给客户端。让我们称之为Player.java
。这门课在比赛的两回合之间持续不断
游戏中的每个玩家都有自己的角色。这个角色在每一轮之间都会发生变化,我需要这个角色以某种方式与Player.java
联系起来。现在我有三个角色:猎人、探索者和旁观者。每个角色都有相同的基本内容:onDeath()
、onRespawn()
、onKill(KillEvent event)
。我还需要能够轻松地检查玩家的角色。(例如,用枚举链接角色)。
问题
我现在遇到的问题是如何以OOP的方式实现它?最初,我将每个角色作为实现Role.java
的类,每次创建角色时,都会在构造函数中使用Player
。这一切都很好,直到我开始在回合中间和每回合结束后改变人们的角色。对我来说,如果我一直把球员的角色设定为一个新的对象,这似乎是一种糟糕的做法。
摘要
综上所述(因为我不擅长描述事物),似乎所有这些都可以以程序化的方式完美地工作,但我一生都无法找到使用OOP实现这一概念的好方法。按照我现在实现的方式,每个Player
都有一个枚举,说明它们的角色,为了更改该角色,我只需更改Player
中的枚举。话虽如此,一旦我进入游戏逻辑,我最终会得到大量嵌套的if语句,我觉得通过一些多态性可以大大减少这些语句。
因此,最后要问一个问题,以面向对象的方式实现这个(或这个系统的稍微修改的版本),而不必始终如一地创建新对象来接受旧对象的数据,什么是好的攻击计划?(我对OOP没有太多经验,但对我来说,这似乎是个坏主意)
我想我会选择这个解决方案:
- 使
Player
成为接口 - 为它创建一个代理类(一个只有一个属性的类,其类型为Player,并将所有方法重定向到此对象)。让我们称之为
ConcretePlayer
- 添加一个
setRole
方法,将Role作为ConcretePlayer
- 使
Role
实现Player
- 像您所做的那样创建
Role
的子类,每个子类的构造函数中都有一个ConcretePlayer
- 存储
ConcretePlayer
中所有角色之间共享的统计信息 - 外部使用
Player
或ConcretePlayer
访问所有内容
它没有完美地充实,但我想你已经明白了。您可能会发现Role
和Player
不应该共享同一个接口,或者您想为回调创建一个自己的接口,但这取决于您的其余代码和用例。