Java 国际象棋中的滑鼠者

Java 国际象棋中的滑鼠者,java,swing,awt,mouselistener,chess,Java,Swing,Awt,Mouselistener,Chess,我正在创建一个国际象棋游戏,现在我已经用所有棋子填充了我的图形棋盘,现在我需要使用MouseSistner来移动棋子。在实现图形版本之前,我创建了一个2D控制台版本,它采用了“玩家移动”,所以我有所有这些方法,但我现在需要使用Mouselistener,我阅读了这些方法,但是,我需要在每个类中实现Mouselistener吗 我有1个抽象工件类和7个子类(包括Dummy工件),还有一个ChessBoard类,它填充了所有工件,并提供了移动方法(从控制台版本…),那么我应该把mouselisten

我正在创建一个国际象棋游戏,现在我已经用所有棋子填充了我的图形棋盘,现在我需要使用MouseSistner来移动棋子。在实现图形版本之前,我创建了一个2D控制台版本,它采用了“玩家移动”,所以我有所有这些方法,但我现在需要使用Mouselistener,我阅读了这些方法,但是,我需要在每个类中实现Mouselistener吗


我有1个抽象工件类和7个子类(包括Dummy工件),还有一个ChessBoard类,它填充了所有工件,并提供了移动方法(从控制台版本…),那么我应该把mouselistener放在哪里呢?在Jcomponent扩展中,包含填充棋盘和移动方法的JFrame或ChessBoard类?

很抱歉给出这样一个简单的答案,但您只需将MouseStener添加到ChessBoard类中即可。从这里,我假设您可以访问已实例化的Piece子类对象,并对其调用方法(即mouseclick,pieck.pickUp())。如果您的代码以这样的方式安排,您需要在许多类中实现鼠标侦听器,请考虑以下内容:

addMouseListener( new MouseAdapter() {
    @Override
    public void mouseClicked( MouseEvent e ) {
          // Do something
    }
} );


此外,如果是我,我会将用于将片段移动到片段类的方法转移到片段类,最好是在更高的级别,这样您就不必重写相同的代码两次。然后在游戏中,每当调用
mousererelease
时,调用一些方法,如Attemptomove(BoardPoint p),该方法将检查您的棋子的当前位置和新位置p是否在棋子的移动范围内。BoardPoint可以是您用x,y坐标为自己的电路板设置的8 x 8样式的东西,如二维整数数组。

这在某种程度上取决于您如何实现您的各个部分。如果它们本身是GUI对象,比如按钮或面板,那么在它们上面放置鼠标侦听器将允许Swing框架确定单击了哪个对象。如果所有的片段都扩展了一个片段类,那么您可以在其中放置一个处理程序,只要它需要执行的逻辑(比如移动一个片段)对于所有片段都是相同的


另一方面,如果您在代码中在电路板上绘制图形图像,因此Swing没有GUI组件来检测单击,那么在电路板上实现mouseListener更有意义。在这种情况下,您的代码将必须确定单击了哪个方块,以及上面是否有一块;之后,处理将与前一个案例非常相似。

有哪些部分?它们是组件还是您自己渲染它们?逻辑位置是将鼠标侦听器放在板上,因为它变得更加独立…MouseListener是一个接口,因此您可以在任何地方实现它。可能是你最喜欢的课外活动。任何对象都可以看到所有组件,并且可以访问您将在事件中执行的所有操作。可能您不应该做的是将侦听器放在组件内部,这可能会变得混乱。在什么地方放置侦听器实际上取决于在您的上下文中最有意义的内容。我会将它们存储并显示在一个文件中。另请参见此和。我正在板上绘制图形图像。我用pressed和release方法实现了MouseStener。压力机将获得一个sourceR=event.getX()和一个sourceC=event.getY(),然后发布的将执行相同的操作,但我将这些变量称为destinationRow和destinationCol,即实例变量。我实现了一个move(),它执行下面的片段[destinationRow][destinationCol]=片段[sourceR][sourceCol];然后,piece[sourceR][sourceCol]=new Dummy();如果没有代码,很难准确地说出你在做什么,这是一件棘手的事情。当然,这还不足以将碎片放入数组中——你必须把它画到那个正方形上。假设您有在paint()方法中绘制片段的代码,我认为您要做的是对组件(在您的例子中,可能是框架)调用repaint,以告诉组件重新绘制自己。无论您是以这种方式还是以另一种方式进行,您都需要在您的作品位于其新位置后重新绘制框架。