0

我正在尝试重新创建类似俄罗斯方块的游戏。我有一个二维数组“_tiles”,它存储名为“ColorShape”的对象。

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

我正在尝试创建一个 quickDrop() 方法,以便当我按下向下箭头键以查找数组中的下一个可用插槽以快速放置形状时。我很难弄清楚将在该片段所在的列中搜索当前片段下方的行的算法。

这是我到目前为止尝试做的事情,但我认为我做错了:(碎片是 30x30 像素,这就是为什么它们被 30 划分,因此数组位置对应于 x 和 y 位置形状)

公共无效 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);

    }

}
4

1 回答 1

1

解决此问题的一种算法:

  1. 取出当前掉落的块并将其从当前位置向下移动到每个 Y 值上。
  2. 如果它与之前放置的棋子相撞,或超出网格的底部,则您检查的最后一个 Y 位置是有效的解决方案。

如果您想要所有有效的解决方案而不仅仅是一个,请对当前所选部分的所有可能旋转重复此算法。

这是算法的一个例子。它不能按原样处理您的代码,但可以让您快速入门。

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;
        }        
    }
}
于 2013-07-05T20:14:04.430 回答