搜索2D数组的算法

时间:2013-07-05 20:03:52

标签: java

我正在尝试重新制作类似俄罗斯方块的游戏。我有一个2D数组,“_tiles”存储称为“ColorShape”的对象。

private ColorShape[][] _tiles = new ColorShape[8][17];; 

我尝试制作一个quickDrop()方法,当我按下向下箭头键找到阵列中的下一个可用插槽以快速放置形状时。我很难找出算法,该算法将搜索该片所在列中当前片段下方的行。

这是我到目前为止尝试做的事情,但我认为我这样做是错误的:(片段是30x30像素,这就是为什么它们被除以30,所以数组位置对应于x和y形状的位置)

public void quickDrop(){

   // j is the column that the piece is currently in
   int j = _proxyPiece.getXLocation()/30;

    for (int i=0; i<17;i++){

        if(_tiles[j][i] == null)
          continue;



       else if (_tiles[j][i] != null){
         _tiles[j][i-2] =  _proxyPiece.getFirstPiece();  
         _tiles[j][i-1] =  _proxyPiece.getSecondPiece();
         repaint();

         _proxyPiece.setPiece(this.newPiece());
         repaint();
         break;
       }    


  }
}

public void paintComponent(Graphics g) {
    if (_pauseState == false){
    _pauseText.setVisible(false);
    super.paintComponent(g);
    // simplify the positioning of things.
    g.translate(0, 0);

    //Draws the board outline and fills it white
    g.setColor(Color.WHITE);
    g.drawRect(0, 0, 240, 480);
    g.fillRect(0, 0, 240, 480);

    //Draws a dark gray grid 
    g.setColor(Color.DARK_GRAY);

        for(int x = 0; x < COL_COUNT + 1; x++) {
            for(int y = 0; y < VISIBLE_ROW_COUNT+1; y++) {
                g.drawLine(0, y * TILE_SIZE, COL_COUNT * TILE_SIZE, y * TILE_SIZE);
                g.drawLine(x * TILE_SIZE, 0, x * TILE_SIZE, VISIBLE_ROW_COUNT *    TILE_SIZE);
            }
        }

    Graphics2D aBetterPen = (Graphics2D)g;    
    _proxyPiece.fill(aBetterPen);

    for (int i = 0; i<16; i++){
        for(int j=0; j<8;j++){
            if(_tiles[j][i] != null)
             _tiles[j][i].fill(aBetterPen);
        }
    }
}
   else if (_pauseState == true){
       _pauseText.setVisible(true);
       super.paintComponent(g);
       // simplify the positioning of things.
       g.translate(0, 0);
       g.setColor(Color.WHITE);
       g.drawRect(0, 0, 240, 480);
       g.fillRect(0, 0, 240, 480);

    }

}

1 个答案:

答案 0 :(得分:1)

解决此问题的一种算法:

  1. 取出当前的下落片并将其从当前位置向下移动到每个Y值。
  2. 如果它与先前放置的棋子发生碰撞,或超过网格底部,则您检查的最后一个Y位置是有效的解决方案。
  3. 如果您想要所有有效的解决方案而不只是一个,请对当前所选部分的所有可能旋转重复此算法。

    这是算法的一个例子。它不能用你的代码,但它会让你快速启动。

    ColorShape[][] grid = new ColorShape[width][height];
    TetrisShape shape = new TetrisShape(Shape.L_SHAPE);
    
    //position will be bottom left coordinate of bounding rectangle of dropping shape.
    Point position = new Point(shape.getPosition());
    int resultY = -1;
    for(int dy=0;dy<height;dy++){
        for(int y=0;y<height;y++){
            int shapeY = position.y+y;
            if(shapeY>=height || shape.intersectsGrid(grid)){
                resultY = shapeY -1;
                break;
            }        
        }
    }