Java 无法计算如何比较不同大小的二维数组

Java 无法计算如何比较不同大小的二维数组,java,javafx,tetris,Java,Javafx,Tetris,所以我正在建立一个项目,以建立一个俄罗斯方块风格的游戏,我想能够测试的形状是否能够添加到一个5 x 5网格。形状由二维数组建模,其中1被视为形状的单个块(形状由几个块组成)。这些形状使用3 x 3网格进行建模。我必须做的事情是检查网格的形状是否适合它的顶部。例如,在网格的顶部正方形放置一个线条形状,该线条将超出边界并且不应工作,或者另一个示例是网格可能已经有一个形状,因此该线条不应放置在其顶部 这是我到目前为止得到的代码,它不起作用,我只是很难概念化该做什么。先谢谢你 请注意,cols是网格中的

所以我正在建立一个项目,以建立一个俄罗斯方块风格的游戏,我想能够测试的形状是否能够添加到一个5 x 5网格。形状由二维数组建模,其中1被视为形状的单个块(形状由几个块组成)。这些形状使用3 x 3网格进行建模。我必须做的事情是检查网格的形状是否适合它的顶部。例如,在网格的顶部正方形放置一个线条形状,该线条将超出边界并且不应工作,或者另一个示例是网格可能已经有一个形状,因此该线条不应放置在其顶部

这是我到目前为止得到的代码,它不起作用,我只是很难概念化该做什么。先谢谢你

请注意,cols是网格中的列数(5),行数相同(5)。游戏块是形状,坐标是用户单击5x5网格的位置

也:形状的锚点是3x3网格的1,1,所以锚点正好在网格的中间。get(intx,inty)方法是获取存储在5x5网格中的值

很抱歉,如果在开始时没有明确说明这一点,但我正在尝试基本上查看3x3网格(由块组成)中存储的形状是否可以放置在5x5网格的顶部。包含块的3x3栅格有一个中心锚点,因此它将是1,1(因为数组从0开始)。如果5x5网格的其他块与正在添加的新形状的坐标相同,则我希望它返回false,或者如果将形状放置在5x5网格上时超出边界,但如果可以成功添加,则它将返回true

public boolean canPlayPiece (GamePiece piece, int x, int y) {

        logger.info("canPlayPiece - Block clicked coordinates: "  + x + "," + y);
        // Piece co-ordinates are 3 x 3, each element that is 1 means there is a block there
        int[][] pieceCoordinates = piece.getBlocks();

        // For loop to iterate through the grid
        // first looping through x values
        for (int i = x - 1; i < cols; i++) {

            System.out.println("i= " + i);

            // nested for loop to find the y values stored inside the x
            for (int j = y - 1; j < rows; j++) {

                System.out.println("j: " + j);


                if (pieceCoordinates[x][y] == 1 && get(i,j) != 0) {


                    logger.info("canPlayPiece: FALSE");
                    return false;


                }

            }

        }
        logger.info("canPlayPiece: TRUE");
        return true;
    }
public boolean游戏件(游戏件,整数x,整数y){
logger.info(“canPlayPiece-块点击坐标:“+x+”,“+y”);
//工件坐标为3 x 3,每个元素为1表示有一个块
int[][]工件坐标=工件.getBlocks();
//循环在网格中迭代
//首先通过x值循环
对于(int i=x-1;i
好的,我为您做了以下内容:

public boolean canPlayPiece(GamePiece piece, int x, int y) {
    int[][] pc = piece.getBlocks();
    
    final int w = 3, h = 3, e = w - 1;
    final int offX = -1, offY = -1; // The offset of the left top corner from 'x' and 'y'
    int i, si, ei, ax, ay, rx, ry;
    for (ei = w * h - 1; ei >= 0 && pc[ei / w][ei % w] == 0; ei--);
    for (si = 0; si <= ei && pc[si / w][si % w] == 0; si++);
    for (i = si + 1, ax = si % w; ax > 0 && i <= ei; i++) if (pc[i / w][rx = i % w] != 0) { si += Math.min(rx - ax, 0); ax = rx; }
    for (i = ei - 1, ax = ei % w; ax < e && i >= si; i--) if (pc[i / w][rx = i % w] != 0) { ei += Math.max(rx - ax, 0); ax = rx; }
    if (si > ei) return true; // There is no block in the piece's grid
    int sx = si % w, sy = si / w, ex = ei % w, ey = ei / w; // The bounds of the shape inside of pc
    int asx = x + offX + sx, asy = y + offY + sy, aex = asx + ex - sx, aey = asy + ey - sy;
    if ((asx | asy | aex | aey | cols - 1 - aex | rows - 1 - aey) < 0) return false; // Would be out of bounds
    for (rx = sx, ax = asx; rx <= ex; rx++, ax++) {
        for (ry = sy, ay = asy; ry <= ey; ry++, ay++) {
            // if (grid[ay][ax] != 0 && pc[ry][rx] != 0) return false; // Block overlaps another block
            if (get(ax, ay) != 0 && pc[ry][rx] != 0) return false; // Block overlaps another block
        }
    }
    return true;
}
public boolean游戏件(游戏件,整数x,整数y){
int[]pc=piece.getBlocks();
最终整数w=3,h=3,e=w-1;
final int offX=-1,offY=-1;//左上角相对于“x”和“y”的偏移量
int i,si,ei,ax,ay,rx,ry;
对于(ei=w*h-1;ei>=0和&pc[ei/w][ei%w]==0;ei--);
对于(si=0;si=0&&i=si;i--)如果(pc[i/w][rx=i%w]!=0){ei+=Math.max(rx-ax,0);ax=rx;}
如果(si>ei)返回true;//工件的网格中没有块
int sx=si%w,sy=si/w,ex=ei%w,ey=ei/w;//pc内部形状的边界
int asx=x+offX+sx,asy=y+offY+sy,aex=asx+ex-sx,aey=asy+ey-sy;
如果((asx | asy | aex | aey | cols-1-aex | rows-1-aey)<0)返回false;//将超出范围

(Rx=Sx,AX=asx;rx,在哪里是游戏块中的锚点)。它是中间的,所以索引[1 ] [1 ]。(我的意思是在该块中的相对点应该与给定的x和y值在并入网格时匹配)是的!它是1,1(因此它在3x3网格的中间)。。什么不完全有效?它是否位于唯一提供的代码中?请您描述一下!嘿,我刚刚添加了一些编辑,请原谅我的经验不足,这是我第一次发布问题。@iiicecream我希望我的答案(下面)对您有效。(请同时阅读下面的描述)嘿,非常感谢,伙计,我可以告诉你,在这方面付出了很多努力,像你这样的人就是互联网如此伟大的原因!这对我来说很难理解,我会尝试在我的代码中使用它,再次非常感谢。不客气。我很高兴你喜欢它!;)@我在这里贴冰淇淋的时候弄错了,应该可以用now@iiicecream您需要在最后一行中添加offX和offY。只需将“-”替换为“+”。我更新了我的答案,这样它现在就可以工作了。希望您能解决这个问题。非常感谢我的朋友:)