用Java创建一个简单棋盘游戏的图形界面

3
我用Java创建了一个棋盘游戏,与跳棋原理相同。它在控制台中运行良好,但现在我正在尝试创建图形界面。我有一个Piece类,一个Tile类检查它是否为空或由白色或黑色的跳棋子占据,一个Grid类在矩阵中跟踪Tiles,以及一个Game类。
目前,游戏可以在Grid类中玩;当我们运行Grid类时,用户在控制台中指定棋盘大小,然后通过提供用户所选择的Tile的x和y坐标来玩游戏。我想要改变的是在Game类中运行游戏,它是JPanel的扩展并实现MouseListener(代码如下)。游戏板将是固定大小(我将从5x5开始),我已经画了一个网格的图片应该在游戏的背景中。将有一个实例变量(Grid g = new Grid(5,5))。我还画了不同的“跳棋”棋子的图片,它们应该分布在特定的Tile上。我希望发生的是,当用户单击Tile时,跳棋子会移动。理想情况下,我会这样做,使程序看到鼠标点击的位置的坐标(假设JPanel是500x500像素,用户单击具有坐标(0,500)的像素,然后我们检查(0,500)是否属于某个Tile,如果它不属于任何Tile,则什么也不会发生,如果它属于Grid g上的一个Tile,那么g.play(something,something))。
            import java.awt.Color;
            import java.awt.FlowLayout;
            import java.awt.Graphics;
            import java.awt.event.MouseEvent;
            import java.awt.event.MouseListener;
            import javax.swing.JFrame;
            import javax.swing.JLabel;
            import java.util.*;
            import java.awt.*;
            import java.awt.event.*;
            import java.awt.FlowLayout;
            import java.awt.event.MouseEvent;
            import java.awt.event.MouseListener;
            import javax.swing.*;

            public class Game extends JPanel implements MouseListener {

                private Grid g = new Grid(5,5);

                public Game() {
                    JFrame frame = new JFrame("Boardgame");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new FlowLayout());

                    frame.setLayout(new FlowLayout());
                    frame.setPreferredSize(new Dimension(500,500));
                    frame.pack();
                    frame.setVisible(true);
                    frame.addMouseListener(this);

                }
                public void mouseClicked(MouseEvent e) {
                        //here we check if the user clicked on a tile, 
    if that happens then we get the x and y-coordinates of the tile and then g.play(x,y)
                }

                public void mouseEntered(MouseEvent e) {
// we are not really interested in this method or the following 
mouse methods but they are necessary for the mouselistener

                }

                public void mouseExited(MouseEvent e) {

            }

            public void mousePressed(MouseEvent e) {

            }

            public void mouseReleased(MouseEvent e) {

            }

            public static void main(String args[]) {
                new Game();
            }
        }

因此,我的主要目的是:

i)拥有一个背景图片(这很容易实现,对吧?)[更新:我通过使用JLabel已经实现了这一点,如果有更好的方法,请告诉我]。

ii)修复MouseListener,使得当点击一个图块时,棋子可以移动。我需要的唯一输入是要移动哪个图块,我们不需要知道哪个棋子应该放在那里。

非常感谢你的帮助,如果我有什么需要澄清的,请问我。这不是为学校或其他任何事情,只是一个私人项目。

1个回答

5
你可以使用 Shape 并附加侦听器以捕获用户在形状上的操作。

为了使用户能够与你展示的图形进行交互,你需要确定当用户点击它们中的一个时。Graphics2D类的hit方法提供了一种轻松确定鼠标单击是否发生在特定Shape对象上的方法。或者,你可以获取鼠标单击的位置,并调用Shape的contains方法来确定单击是否在Shape的边界内。

阅读更多:http://docs.oracle.com/javase/tutorial/2d/advanced/user.html

这看起来像是我需要的开始。我会将其实现到我的代码中,然后看看是否可以通过此解决我的其他问题。 - Sid
@Sid如果你有问题,请不要犹豫,尽管问吧:)。我会尽力在这里提供帮助。 - Developer Marius Žilėnas
非常感谢!我已经将我的背景图像(只是一个典型的5x5棋盘)作为JPanel上的JLabel上传了。我发现通过使用e.getX()和e.getY(),我可以知道鼠标光标的位置,所以我不需要Shapes(我想)。这样我就可以知道用户是否点击了一个方块。现在,我想知道的是:i)如何在我的棋盘上显示“跳棋”棋子?我把棋子设置为JLabels并放在背景图片上吗?ii)当用户点击一个方块时,如何使棋子的位置更新到棋盘上?(理想情况下,您会看到它们移动。) - Sid
我猜你可以按照自己的想法使用标签来实现这个功能:我曾经在C#中使用标签举例说明了这个概念,我想在Swing中也应该是可能的(个人没有尝试过),这需要一些关于标签设置的工作。然而,我会使用Graphics2D,在BufferedImage上绘制整个棋盘和棋子,并在新的JLabel(new ImageIcon(resultingImage))上显示结果。 :) - Developer Marius Žilėnas
你好!既然你这么乐意帮忙,我能在聊天或其他地方问你另一个简单的问题吗?我需要粘贴一些代码,但是这里的评论框太小了。 - Sid
@Sid 我觉得我们可以在Java聊天室聊天:). 你可以将你的代码粘贴到 http://pastie.org/ 或者 http://pastiebin.com/ 上。 - Developer Marius Žilėnas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接