首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java纸牌游戏设计决策

Java纸牌游戏设计决策
EN

Software Engineering用户
提问于 2014-12-12 14:59:08
回答 2查看 861关注 0票数 0

我正在申请一个纸牌游戏,标准的52层扑克牌.现在,我正在写一个纸牌游戏,为了学习的目的。我有一些制作平台游戏和街机游戏的经验,但没有一款是基于卡和基于转弯的游戏。

我正在尝试实现某种MVC模式,将游戏逻辑与实际GUI分离开来。我打算有一个拖放接口的卡,但我不知道在哪里处理卡的位置。我有一个卡片类,包含等级和套装,以及其他与卡片相关的方法.卡片类应该处理它自己的位置吗?这不意味着我的模型没有正确地解耦吗?如果视图应该处理卡片的位置,那不是会产生过多的对象和引用吗?任何想法和论点都会受到极大的赞赏。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2014-12-12 15:12:25

添加一个包含多个Table S的Stack类。

然后,每个堆栈都是一个卡片列表,您可以在其中取下最上面的一张,并在给定一些限制的情况下将一张卡片放在上面。

然后移动一张卡片(destinationsourceStacks):

代码语言:javascript
运行
复制
if(destination.canPut(source.top())){
    destination.put(source.take());
}

视图将知道在哪里以及如何渲染每个堆栈,以及卡片的外观等等。

那么最终的结果就是Card只是一个包含在堆栈中的不可变的哑对象。

使用多态性,每个堆栈可以有不同的约束,例如,大麻不能接受任何卡,结果只能接受相同的牌,更高的牌等等。

票数 3
EN

Software Engineering用户

发布于 2014-12-12 15:30:53

类应该处理它自己的位置吗?

不是的。正如您所说,卡的定义完全是由其级别和套间决定的。黑桃的10仍然是黑桃的10,不管它在哪里。事实上,我会争辩说,除了获得等级和西装之外,卡片没有其他相关的方法。(将equalshashCode定义为方法是很方便的,但是如果您能够访问级别和适合,您可以比较卡片而不访问它们的私有字段。在排序时,不需要通过Comparators或诸如此类的东西就更简单了。如果你制作卡片,你可以免费得到这个。)

顺便提一下,这里有两个独立的立场概念。有与游戏逻辑相关的抽象逻辑位置(例如,黑桃的10位于左侧第4堆栈的顶部),然后是表示位置(例如左侧的第4堆栈是在屏幕坐标58、160处绘制的)。堆栈的抽象位置属于模型,表示位置在视图中。

,这不意味着我的模型没有正确地解耦吗?

是的,如果在Card类中引入屏幕位置,就会引入从模型到视图的耦合。(从视图到模型,另一个方向的耦合是正常的。)例如,如果您想通过让3D卡在3D表周围移动来使游戏看起来更时尚,那么您必须更改Card类以包含3D点,而不是2D点。您不仅希望这样做,还可以通过将一个类替换为另一个类来更改视图实现--您还希望将模型与受视图设计更改影响的模型隔离开来。

如果视图应该处理卡的位置,那不是会产生过多的对象和引用吗?

我看不出卡的位置是如何从程序的一个层移动到另一个层,从而改变你必须跟踪的数据量。即使是这样,它也可能不会改变程序的渐近时间或空间使用。即使是这样,如果您没有明确定义的性能目标和可以对其进行基准测试的实现,那么担心优化还为时尚早。如果你做了非常非常错误的事情,一个拥有如此少的数据来追踪的游戏会有性能问题,这是值得怀疑的。

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

https://softwareengineering.stackexchange.com/questions/266276

复制
相关文章

相似问题

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