如果相邻值相同,则Java 2D数组放置值

时间:2018-11-29 20:13:43

标签: java arrays 2d cell

有一些类似的线程,我已经尝试了一些解决方案,但是没有一个可以解决我的预期结果。 我有一个2D阵列(这是一个游戏板)。 如果我想将玩家ID移到板上的某个位置,我想检查该位置是否有一个等于玩家ID的相邻单元格。否则它将无法放置。

例如,如果我有一个董事会:

[0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 2, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

如果我尝试将1放在[0][0]的位置,则应该拒绝它,但是如果我尝试将其放置在[0][7], [0][9], [1][6], [1][7],[1][8](包括对角线)中。

我猜我当前的代码是一个开始尝试?但是我不确定如何进行clientID检查:

public void move(int client, int x, int y) {
        int startPosX = (x - 1 < MIN_X) ? x : x-1;
        int startPosY = (y - 1 < MIN_Y) ? y : y-1;
        int endPosX =   (x + 1 > MAX_X) ? x : x+1;
        int endPosY =   (y + 1 > MAX_Y) ? y : y+1;

        for (int rowNum=startPosX; rowNum<=endPosX; rowNum++) {
            for (int colNum=startPosY; colNum<=endPosY; colNum++) {
                if (storeArray[x][y] == EMPTY && client <= 5 && client >= 1) {
                    storeArray[x][y] = client;
                    int count = totals.containsKey(client) ? totals.get(client) : 1;
                    totals.put(client, count + 1);
                }
            }
        }

因此它遍历行和列,并且如果在周围的任何单元格中,都应该放置它。但是我仍然可以将其放置在任何地方。 我的代码是否甚至可以完成应做的事情?

我缺少符合我的标准的哪些东西,可以修改此代码以使其正常工作吗?

2 个答案:

答案 0 :(得分:2)

如果无法存储客户端的坐标,则可以将if语句修改为以下内容。如果您可以存储坐标,那么我肯定会使用Leo Leontev的答案。

/*I removed check for client to be between 1-5, can be re-added.

I would add the checks for the desired spot being empty and the client 
being within 1-5 to the top of the method.

For loop iterates over the possible spaces where the client would be in range
check if client is in a space*/

if (storeArray[rowNum][colNum]==client) {
    //storeArray[rowNum][colNum]=0;
    storeArray[x][y] = client;
    //unchanged
    int count = totals.containsKey(client) ? totals.get(client) : 1;
    totals.put(client, count + 1);
}

您还可以使用Math.minMath.max来简化startX,Y,endX,Y,以避免尝试将客户端移出开发板而导致的indexOutOfBounds错误。

int startPosX = Math.max(x-1,0);
int startPosY = Math.max(y-1,0;
int endPosX = Math.min(x+1,storeArray.length-1);
int endPosY = Math.min(y+1,storeArray[0].length-1);

如果在totals.put(client,count+1);调用之后没有执行任何操作,则可以添加return;语句以退出该方法。如果仍然需要做更多工作,可以在外部for循环中添加标签,然后脱离标签。两种方法都会阻止您的计数每次移动不止一次。

outerloop:
for(int rowNum=startPosX;rowNum<=endPosX;rowNum++){
    for(int colNum=startPosY;colNum<=endPosY;colNum++){
        if(...){
          //code
          totals.put(client, count+1);
          break outerloop;
        }
    }
}

这是我编辑器中的方法

public static move(int client, int x, int y){
    if(storeArray[x][y]==client)
        return;
    int startPosX = Math.max(x-1,0), startPosY=Math.max(y-1,0);
    int endPosX = Math.min(x+1,storeArray.length-1), endPosY = Math.min(y+1,storeArray[0].length-1);
    outerloop:
    for(int rowNum=startPosX;rowNum<=endPosX;rowNum++)
    {
        for(int colNum=startPosY;colNum<=endPosY;colNum++){
            if(storeArray[rowNum][colNum]==client)
            {
                storeArray[x][y]=client;
                System.out.println("Successful move");
                int count = totals.getOrDefault(client, 1);
                totals.put(client, count + 1);
                break outerloop;
                //could set colNum=endPosY+1 and rowNum=endPosX+1 if you don't want to use label/break
            }
        }
    }
}

答案 1 :(得分:0)

您可以使用数组存储客户的坐标:

ArrayList<int[]> clientCoords = new ArrayList<>;

因此 move 方法如下所示:

public void move(int client, int x, int y) {
    int[] coords = clientCoords.get(client);
    int old_x = coords[0], old_y = coords[1];  // previous coordinates of the client
    // check that the new cell is adjacent
    if(Math.abs(x - old_x) <= 1 && Math.abs(y - old_y) <= 1){  
        clientCoords.set(client, new int[2]{x, y});
        // your code
        int count = totals.containsKey(client) ? totals.get(client) : 1;
        totals.put(client, count + 1);
    }
}