为迷宫创建平铺地图n * n

时间:2014-10-24 01:44:19

标签: java swing graphics mouselistener maze

我需要创建一个平铺的地图nxn列/行。首先,程序询问用户他想要多少个瓷砖,然后创建一个平铺的地图。之后,用户点击一个图块,图块会改变颜色。然后他点击其他瓷砖,颜色也会变化。之后,程序将找到从所选磁贴到另一个磁贴的解决方案。

现在,我使用Graphics2D组件创建了平铺地图,但是当我点击平铺时,它会改变颜色的整个图形,而不仅仅是一个平铺... 你能告诉我出了什么问题吗?绘制平铺地图的最佳方式是什么?谢谢 ! 迷宫应该是这样的:

enter image description here

我仍然需要输入墙壁的代码并找到解决方案。 这是我的JPanel的代码,我创建了地图。

public LabyrintheInteractif (){
    addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {
            click=true;
            repaint();
            xClick=e.getX();
            yClick=e.getY();
        }
    });

    tiles=Integer.parseInt(JOptionPane.showInputDialog("How many tiles ?"));
    Quadrilage", JOptionPane.YES_NO_OPTION);

    setPreferredSize(new Dimension(734, 567));
    setVisible(true);
}

@Override
public void paintComponent(Graphics g) {

    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.white);

    rect = new Rectangle2D.Double(0, 0,getWidth(), getWidth());
    g2d.fill(rect);
    g2d.setColor(Color.black);

    for (row = 0; row <tuiles; row++) {
        for (column = 0; column < tuiles; column++) {
            g2d.setStroke(new BasicStroke(3));
            g2d.draw( square=new Rectangle2D.Double(column*100 , row*100,100,100));
        }
        if(click){
            g2d.setColor(Color.green);
            g2d.fill(square);
            repaint();
    }
}

1 个答案:

答案 0 :(得分:2)

这里的问题是您没有检查用户点击了哪个磁贴。相反,您只是检查用户是否完全点击了。

您需要做的是找到图块的widthheight。 然后你需要检查用户在嵌套for循环中点击了哪个区块,如此。

for (row = 0; row <tuiles; row++) {
   for (column= 0; column<tuiles; column++) {
      if(clicked){

         //check if the click x position is within the bounds of this tile
         if(column * tileWidth + tileWidth > xClick && column * tileWidth < xClick){

            //check if the click y position is within the bounds of this tile
            if(row * tileHeight + tileHeight > yClick && row * tileHeight < yClick){
               //mark this tile as being clicked on.
               clicked = false;
            }
         }
      }
   }
}

然后,您需要存储布尔值,该值将说明是否已单击特定图块。这样,当您绘制瓷砖时,您可以使用以下内容:

if(thisTileHasBeenClicked){

   //if the tile has been clicked on
   g2d.setColor(Color.green);
   g2d.fill(square);
}else{

   //if the tile has not been clicked on
   g2d.setColor(Color.gray);
   g2d.fill(square);
}