как преобразовать строку в 2d массив (java) (GameBoard) - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть текст String, который представляет уровень в игре Sokoban. У меня есть несколько разных персонажей, каждый из которых имеет различное значение.

  • '#' = стена
  • '$' = игрок

  • '@' = багаж для перевозки

  • '.' = цель, которую багаж должен опустить до

Я использую двумерный массив (10x10)

это уровень, например:

String level = "##########" + "#       .#" + "#      ###" + "#  @  ####"  
             + "#   $ ####" + "#     ####"
             + "##########" + "##########" + "##########" + "##########";

теперь мне интересно, как я могу преобразовать эту строку в массив 2d, чтобы первый # был в [0] [0] и так далее ...

Я пробовал это до сих пор, но к сожалению, я не думаю, что я даже близок к решению.

    int SPACE = 10;
    for (int i = 0; i < level.length(); i++) {
            char s = level.charAt(i);
            for (int rij = 0; rij < SPACE; rij++) {
                for (int kolom = 0; kolom < SPACE; kolom++) {
                    switch (s) {
                    case '#':
                        spelbord[rij][kolom] = "#";
                        break;
                    case '@':
                        spelbord[rij][kolom] = "@";
                        break;
                    case '$':
                        spelbord[rij][kolom] = "$";
                        break;
                    case '.':
                        spelbord[rij][kolom] = ".";
                        break;
                    }

                }
            }
        }

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Если я правильно понимаю, ваш уровень String - это просто строка из 100 символов с символами "#", "@", "", "$" и ".". Каждый символ отображается на отдельный элемент на доске, представляющий собой матрицу char [] [].

В настоящее время ваш код перебирает строку. На каждой итерации вы проходите по доске (ошибочно). В этом нет необходимости, так как вы уже должны знать, куда поместить символ в доску.

Чтобы исправить это, сохраните отдельный счетчик для строки и проведите по доске один раз. Каждый раз, когда вы помещаете символ в доску, вы увеличиваете счетчик.

int counter = 0;
for (int rij = 0; rij < SPACE; rij++) {
    for (int kolom = 0; kolom < SPACE; kolom ++) { //you are supposed to increment kolom here, not rij
        spelbord[rij][kolom] = level.charAt(counter++); //increment counter after assignment
    }
}

0 голосов
/ 25 февраля 2020

Сначала объявите spelbord как массив символов (char[][]). Это намного эффективнее и проще в обращении. Судя по всему, вам не нужно, чтобы он содержал строки.

Затем просто напишите:

for (int i = 0; i < level.length(); i++) {
    spelbord[i / SPACE][i % SPACE] = level.charAt(i);
}

Если вы получили исключение нулевого указателя, вы, вероятно, забыли инициализировать spelbord , Убедитесь, что вы выделили для него массив.

...