我一直在思考这个面向对象的设计问题已经有一段时间了,但是我还没有想出一个令人满意的解决方案,所以我想我应该向这里的人们公开发表一些意见。
我有一个游戏类,代表一个基于转弯的棋盘游戏,我们可以假设它类似于垄断这个问题的目的。在我的设计中,我有一个Player类,它包含一个方法TakeTurn。
游戏遍历所有的Player_s,并调用TakeTurn方法来完成所有必要的事情。我希望能够有n个播放器,并且能够将任意数量的播放器设置为计算机播放器。所以,我的想法是有一个HumanPlayer类和一个_ComputerPlayer类,这两个类都来自Player。
游戏只知道玩家类,然后依次调用每个玩家的TakeTurn方法。我的问题在于,ComputerPlayer对象可以完全自动化,即与Monopoly示例保持一致,可以使用某种逻辑来决定购买属性。现在,对于HumanPlayer对象,它需要从实际用户那里获得一个输入,例如,它可以购买一个属性,这似乎意味着一个不同的接口,可能意味着它们不应该派生
如果不让Game类显式地了解各个Player类的实际实现,我就无法想出一个很好的解决方案。我总是可以在游戏类中假设只有人类和计算机玩家,并有效地关闭它以进行扩展,但这似乎不是很好的OO编程。
如对此有任何意见,将不胜感激。
发布于 2008-09-18 09:21:29
我认为你不应该让游戏类处理IO。这样,(阻塞) TakeTurn方法将隐藏在游戏板上的实现手段。它可以使用其他对象与用户通信。
所有的游戏课应该关注的是董事会的状态和转弯。玩家都应该实现一个单一的玩家界面,并隐藏所有的实现对游戏。
发布于 2008-09-20 20:29:18
如果游戏是管理游戏状态和做I/O,那么游戏做的太多了。
你想让游戏紧紧地聚焦在规则、转弯和状态变化上。游戏不知道玩家是什么,它只知道它有玩家。
你想让玩家检查游戏状态,并在轮到他们的时候执行法律行动。
人类玩家和游戏作为一个整体都共享一个共同的I/O包,该包显示游戏状态并提示人类输入。
通过使I/O包成为游戏中的Observable,您可以很好地利用Java的Observer。这样,游戏状态更改将报告给I/O以供显示或记录,或两者兼备。
发布于 2009-09-14 16:32:44
我可能不会有两个HumanPlayer和ComputerPlayer类,而是一个在创建时配置的具有适当输入策略的Player类。
玩家在下一轮游戏中获得决定其移动的信息的方式是唯一不同的(至少从最初的问题描述),所以只需将其封装在一个单独的抽象中即可。
不管建立游戏的高级级别是什么,都应该创建两组玩家(一个是人,另一个是计算机模拟的),每个人都有适当的输入策略,然后简单地将这些玩家对象交给游戏对象。游戏类将只对给定的玩家列表中的每个新回合调用TakeTurn方法。
https://stackoverflow.com/questions/91137
复制相似问题