首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OO设计,开/闭原理问题

OO设计,开/闭原理问题
EN

Stack Overflow用户
提问于 2008-09-18 09:17:30
回答 9查看 928关注 0票数 7

我一直在思考这个面向对象的设计问题已经有一段时间了,但是我还没有想出一个令人满意的解决方案,所以我想我应该向这里的人们公开发表一些意见。

我有一个游戏类,代表一个基于转弯的棋盘游戏,我们可以假设它类似于垄断这个问题的目的。在我的设计中,我有一个Player类,它包含一个方法TakeTurn。

游戏遍历所有的Player_s,并调用TakeTurn方法来完成所有必要的事情。我希望能够有n个播放器,并且能够将任意数量的播放器设置为计算机播放器。所以,我的想法是有一个HumanPlayer类和一个_ComputerPlayer类,这两个类都来自Player。

游戏只知道玩家类,然后依次调用每个玩家的TakeTurn方法。我的问题在于,ComputerPlayer对象可以完全自动化,即与Monopoly示例保持一致,可以使用某种逻辑来决定购买属性。现在,对于HumanPlayer对象,它需要从实际用户那里获得一个输入,例如,它可以购买一个属性,这似乎意味着一个不同的接口,可能意味着它们不应该派生

如果不让Game类显式地了解各个Player类的实际实现,我就无法想出一个很好的解决方案。我总是可以在游戏类中假设只有人类和计算机玩家,并有效地关闭它以进行扩展,但这似乎不是很好的OO编程。

如对此有任何意见,将不胜感激。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-09-18 09:21:29

我认为你不应该让游戏类处理IO。这样,(阻塞) TakeTurn方法将隐藏在游戏板上的实现手段。它可以使用其他对象与用户通信。

所有的游戏课应该关注的是董事会的状态和转弯。玩家都应该实现一个单一的玩家界面,并隐藏所有的实现对游戏。

票数 7
EN

Stack Overflow用户

发布于 2008-09-20 20:29:18

如果游戏是管理游戏状态做I/O,那么游戏做的太多了。

你想让游戏紧紧地聚焦在规则、转弯和状态变化上。游戏不知道玩家是什么,它只知道它有玩家。

你想让玩家检查游戏状态,并在轮到他们的时候执行法律行动。

人类玩家和游戏作为一个整体都共享一个共同的I/O包,该包显示游戏状态并提示人类输入。

通过使I/O包成为游戏中的Observable,您可以很好地利用Java的Observer。这样,游戏状态更改将报告给I/O以供显示或记录,或两者兼备。

票数 2
EN

Stack Overflow用户

发布于 2009-09-14 16:32:44

我可能不会有两个HumanPlayerComputerPlayer类,而是一个在创建时配置的具有适当输入策略的Player类。

玩家在下一轮游戏中获得决定其移动的信息的方式是唯一不同的(至少从最初的问题描述),所以只需将其封装在一个单独的抽象中即可。

不管建立游戏的高级级别是什么,都应该创建两组玩家(一个是人,另一个是计算机模拟的),每个人都有适当的输入策略,然后简单地将这些玩家对象交给游戏对象。游戏类将只对给定的玩家列表中的每个新回合调用TakeTurn方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/91137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档