好的,我正在制作一个简单的java摇摆棋游戏。这个问题更多的是关于OOP设计Java摇摆。
我有以下几点:
在我的主要棋类:
因此,左上角的正方形(0,0)映射到myArray[0][0]
我的问题是,要检查这个地方是否是空的,或者里面有棋子,我必须使用:
if(panels[x][y] instanceof Piece){
((Piece)panels[x][y]).makeMove();
}
我要问的是这个糟糕的设计吗?我知道我应该尽量远离instanceof。什么是更好的方法?
谢谢。
您不应该将模型代码(Piece)与视图代码(JPanels)结合起来。如果您想更改板的显示方式,您必须更改块的存储方式!
更好的设计可能是将Piece与JPanels分开。然后您可以使用单个JPanel来显示Pieces矩阵:Pieces[8][8]
。
我的问题是,要检查这个地方是否是空的,或者里面有棋子,我必须使用:
如果您使用矩阵,您可以只拥有一个空单元格或使用Null Object
Pattern来拥有一个“空”部分。
编辑
块矩阵中的每个单元格都是板中的一个正方形,因此块[0][0]
将是板的顶角(A8)。
要绘制板子,您的画板组件()
方法必须遍历此矩阵并适当地绘制每个单元格。有几种方法可以实现这一点:
>
您需要执行类似的instanceof检查,以不同的方式绘制每种类型的作品
使用策略模式创建一个新的中间“绘制策略”对象。这可能需要一个策略对象矩阵,而不是块对象。您可能仍然需要执行检查实例,但可能只需要一次来创建策略对象。
在考虑了您的问题并了解了问题域之后,我实际上会提出以下建议…
在您的类Panel
中实现一个函数int hasMass()
,如下所示…
public int hasMass() {
return 0;
}
在您的类Piece
中覆盖该函数,如下所示…
public int hasMass() {
if (isWhite()) // white pieces are negative.
return -1;
return 1; // black pieces positive.
}
现在你可以检查方块是否有一块,另一块是否可以拿走它…(因为它们的极性相反)…例如,质量质量==0意味着捕获,!=0意味着面板是空的。当然,绝对值2(质量)意味着移动是非法的。
好的,我首先放弃设置null以指示该位置为空的选项(您可以使用ofc执行此操作,但使用空值
类在某种程度上“更好”)。
因此,假设您有代表您的游戏板的Panel
数组:
Panel[][] board;
现在进行说明,您的类层次结构可能看起来像:
abstract class Panel extends JPanel { ... }
class Empty extends Panel { ... }
abstract class Piece extends Panel { ... }
class Pawn extends Piece { ... }
...
我的面板类是我的空类,不是吗?
不确定我是否理解你,但是让我们看看扩展
到底是什么意思:在节目nmodel中,每个棋子也是一个面板,或者每个棋子也是一个棋子,所以每个棋子都可以做和棋子一样的事情(例如,4是复数,也是自然数或实数,所以在某种程度上,你可以说实数扩展了复数,因为每个实数也是复数)
因此,现在您可以在Panel
中声明一些不错的抽象getTexture()
方法,并在空
类和所有Piece
子类中实现,并且在绘制Panel
时,您不需要查看它是否为空。