提问者:小点点

OOP设计,Java摇摆,象棋游戏,instanceof


好的,我正在制作一个简单的java摇摆棋游戏。这个问题更多的是关于OOP设计Java摇摆。

我有以下几点:

  • 我有一个实现JPanel的Panel类。
  • 然后我有一个从我的Panel类扩展的抽象类Piece
  • 然后我有不同的棋子类:典当,国王,主教等,从我的棋子类延伸而来

在我的主要棋类:

  • 我正在使用面板数组来存储我的板的布局
  • 所以数组将存储Panel对象,用于上面没有碎片的板位置。
  • 它将存储子类,如Pawn、Queen、Bishop等(带有棋子的棋盘位置)

因此,左上角的正方形(0,0)映射到myArray[0][0]

我的问题是,要检查这个地方是否是空的,或者里面有棋子,我必须使用:

        if(panels[x][y] instanceof Piece){
            ((Piece)panels[x][y]).makeMove();
        }

我要问的是这个糟糕的设计吗?我知道我应该尽量远离instanceof。什么是更好的方法?

谢谢。


共3个答案

匿名用户

您不应该将模型代码(Piece)与视图代码(JPanels)结合起来。如果您想更改板的显示方式,您必须更改块的存储方式!

更好的设计可能是将Piece与JPanels分开。然后您可以使用单个JPanel来显示Pieces矩阵:Pieces[8][8]

我的问题是,要检查这个地方是否是空的,或者里面有棋子,我必须使用:

如果您使用矩阵,您可以只拥有一个空单元格或使用Null ObjectPattern来拥有一个“空”部分。

编辑

块矩阵中的每个单元格都是板中的一个正方形,因此块[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时,您不需要查看它是否为空。