Java 2D Array Placing Value, если смежное значение одинаково - PullRequest
0 голосов
/ 29 ноября 2018

Есть несколько похожих тем, и я пробовал некоторые решения, но ни одна не работает над тем, каким должен быть мой результат.У меня есть 2d массив (который является игровой доской).Если я хочу переместить playerID в позицию на доске, я хочу проверить, есть ли у этой позиции соседняя ячейка, равная идентификатору игрока.В противном случае он не будет помещенлибо: [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 голосов
/ 29 ноября 2018

Если вы не можете сохранить координаты клиентов, вы можете изменить свой оператор if следующим образом.Если вы можете сохранить координаты, я бы определенно использовал ответ Лео Леонтьева.

/*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);
}

Вы также можете упростить ваши startX, Y, endX, Y, используя Math.min и Math.max, чтобы избежать любых ошибок 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
            }
        }
    }
}
0 голосов
/ 29 ноября 2018

Вы можете использовать массив для хранения координат клиентов:

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);
    }
}
...