Java 摆动落块

Java 摆动落块,java,swing,grid,jpanel,Java,Swing,Grid,Jpanel,我正在制作一个简单的游戏,用户点击彩色块,相同颜色的所有相邻块一起消失。当一个块消失时,它上面的所有块都应该落下并填满空白。我将如何实施此类行动?我可以检查网格中的所有块,但这是一个巨大的浪费。我还可以跟踪给定列中有多少空格,但我认为应该有更好的方法来实现它。下面是一些代码,显示了我是如何制作网格和每个单元格的: public class GridPanel extends JPanel{ private GridCell[][] grid; private static fi

我正在制作一个简单的游戏,用户点击彩色块,相同颜色的所有相邻块一起消失。当一个块消失时,它上面的所有块都应该落下并填满空白。我将如何实施此类行动?我可以检查网格中的所有块,但这是一个巨大的浪费。我还可以跟踪给定列中有多少空格,但我认为应该有更好的方法来实现它。下面是一些代码,显示了我是如何制作网格和每个单元格的:

public class GridPanel extends JPanel{

    private GridCell[][] grid;
    private static final int DEFAULT_SIZE = 25;
    private static final Color[] COLORS = {Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW};
    private Random random;


    public GridPanel(int x, int y){
        random = new Random();
        grid = new GridCell[x][y];
        GridBagConstraints gbc = new GridBagConstraints();
        setLayout(new GridBagLayout());
        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[i].length; j++){
                GridCell gc = new GridCell(i, j, DEFAULT_SIZE);
                Border border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
                gc.setBorder(border);
                gc.setBackground(COLORS[random.nextInt(COLORS.length)]);
                gbc.gridx = i;
                gbc.gridy = j;
                add(gc, gbc);
                grid[i][j] = gc;
            }
        }
    }
}

public class GridCell extends JPanel{

private int x;
private int y;
private int size;

public GridCell(int x, int y, int size){
    this.x = x;
    this.y = y;
    this.size = size;
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(size, size);
}

public GridCoordinate getCoordinates(){
    return new GridCoordinate(x, y);
}

public int getCellSize(){
    return this.size;
}

}
公共类GridPanel扩展了JPanel{
私有网格单元[][]网格;
私有静态最终int默认值_SIZE=25;
私有静态最终颜色[]颜色={Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW};
私有随机;
公共网格面板(整数x,整数y){
随机=新随机();
网格=新网格单元[x][y];
GridBagConstraints gbc=新的GridBagConstraints();
setLayout(新的GridBagLayout());
对于(int i=0;i
您将面临的最大障碍是处理“空”块。大多数布局不会“保留”屏幕未使用部分的空间

GridBagLayout
提供了获取用于布置原始组件的
GridBagConstraints
的方法

GridBagLayout gbl = new GridBagLayout();
//...
GridBagConstarints gbc = gbl.getConstraints(comp);
这为您提供了调整组件约束的方法,只是别忘了重新应用它们

gbl.setConstraints(comp, gbc);
我要做的是创建一个“空白”网格单元的概念。这是一个无法单击的单元格,并以中性颜色绘制(或根据需要透明)。当您“删除”一个活动的
GridCell
时,您会将其替换为一个“空白”单元格

你需要计算空白单元格的位置并调整它们周围的所有单元的位置。< /P> 这最好通过使用“虚拟”模型来实现。您只需在这个模型中维护游戏的状态(例如

int
数组),当更新时,只需更新实际视图以匹配模型

这将使确定单个单元需要布置在何处变得更加简单

但那只是我

已更新

您也可以考虑使用<代码> GridLayout < />代码,并检查组件的Z顺序,例如…


    • 你将面临的最大障碍是处理“空”块。大多数布局不会“保留”屏幕未使用部分的空间

      GridBagLayout
      提供了获取用于布置原始组件的
      GridBagConstraints
      的方法

      GridBagLayout gbl = new GridBagLayout();
      //...
      GridBagConstarints gbc = gbl.getConstraints(comp);
      
      这为您提供了调整组件约束的方法,只是别忘了重新应用它们

      gbl.setConstraints(comp, gbc);
      
      我要做的是创建一个“空白”网格单元的概念。这是一个无法单击的单元格,并以中性颜色绘制(或根据需要透明)。当您“删除”一个活动的
      GridCell
      时,您会将其替换为一个“空白”单元格

      你需要计算空白单元格的位置并调整它们周围的所有单元的位置。< /P> 这最好通过使用“虚拟”模型来实现。您只需在这个模型中维护游戏的状态(例如

      int
      数组),当更新时,只需更新实际视图以匹配模型

      这将使确定单个单元需要布置在何处变得更加简单

      但那只是我

      已更新

      您也可以考虑使用<代码> GridLayout < />代码,并检查组件的Z顺序,例如…


        • 你将面临的最大障碍是处理“空”块。大多数布局不会“保留”屏幕未使用部分的空间

          GridBagLayout
          提供了获取用于布置原始组件的
          GridBagConstraints
          的方法

          GridBagLayout gbl = new GridBagLayout();
          //...
          GridBagConstarints gbc = gbl.getConstraints(comp);
          
          这为您提供了调整组件约束的方法,只是别忘了重新应用它们

          gbl.setConstraints(comp, gbc);
          
          我要做的是创建一个“空白”网格单元的概念。这是一个无法单击的单元格,并以中性颜色绘制(或根据需要透明)。当您“删除”一个活动的
          GridCell
          时,您会将其替换为一个“空白”单元格

          你需要计算空白单元格的位置并调整它们周围的所有单元的位置。< /P> 这最好通过使用“虚拟”模型来实现。您只需在这个模型中维护游戏的状态(例如

          int
          数组),当更新时,只需更新实际视图以匹配模型

          这将使确定单个单元需要布置在何处变得更加简单

          但那只是我

          已更新

          您也可以考虑使用<代码> GridLayout < />代码,并检查组件的z顺序,例如