Поэтому я искал, но просто не знаю, как сформулировать свою проблему.

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

Я собираюсь создать 2D-карту на основе знаков PLUS (+) и ONE (C), C - это текущее местоположение персонажей.

Это будет выглядеть так

C+++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++

При печати. Замечание C основано на целых числах, а именно currentX и currentY (1 и 1).

Это мой текущий код в bp_Map.class

public class bp_Map {
// Map
public static String mapP = "+";
public static String mapC = "C";
public static int sizeY = 19;
public static int sizeX = 19;


public static void drawMap(int currX, int currY) {
    int currentY = 0;

        while (currentY <= sizeY) {
            drawX();
            System.out.print("\n");
            currentY ++;
        }
}

public static void drawX() {
    int currentX = 0;

    while (currentX <= sizeX) {
        System.out.print(mapP);
        currentX++;
    }
}

Я мог бы использовать массив вместо mapP и mapC и просто сделать

public static final String mapChar[] = {"+", "C"}

Но я не чувствую необходимости заниматься этим банкоматом.

Моя текущая проблема заключается в том, что я не хочу, чтобы 20 операторов if (или 1 операторов if и 19 if else) проверяли местоположение X, а затем выводили соответственно Y.

Я новичок в java и все еще учусь, я использовал while, но должен ли я использовать для? Я немного растерялся, надеюсь, вы мне поможете. Это текстовая ролевая игра, и я работаю над ней параллельно с учебой.

0
GodLess 17 Сен 2018 в 12:15

2 ответа

Лучший ответ

Вам не нужны случаи if-else - это прекрасный пример использования циклов .

Прежде всего, определите вещи, которые никогда не будут меняться как final поля в вашем классе:

private static final String EMPTY = "+";
private static final String CHARACTER = "C";

private static final int SIZE_X = 20;
private static final int SIZE_Y = 5;

В этом примере я также буду использовать поля для текущих координат X и Y, но вы можете изменить это, поскольку я предполагаю, что они берутся откуда-то из вашей программы:

private static int currentX = 7;
private static int currentY = 3;

А теперь представьте, как телевизор рисует пиксели на экране: сверху вниз и слева направо, пиксель за пикселем, не менее 30 раз в секунду. Попробуем сделать то же самое, рисуя по одной строке за раз:

public static void main(String[] args) {
    if(currentX > SIZE_X - 1 || currentY > SIZE_Y - 1) {
        throw new IllegalStateException("Out of bounds");
    }
    for (int y = 0; y < SIZE_Y; y++) {
        drawRow(y);
    }
}

Как бы выглядела функция drawRow()? Одна из возможных реализаций представлена ниже:

private static void drawRow(int i) {
    // Use a StringBuilder, ~30 times faster than String concatenation!
    StringBuilder row = new StringBuilder();
    if(i == currentY) {
        // Create this row differently, as it contains the character.
        for (int x = 0; x < SIZE_X; x++) {
            if(x == currentX) {
                row.append(CHARACTER);
            } else {
                row.append(EMPTY);
            }
        }
    } else {
        // Create an empty row.
        for (int x = 0; x < SIZE_X; x++) {
            row.append(EMPTY);
        }
    }
    // "Draw" the row by printing it to the console.
    System.out.println(row.toString());
}

Это производит:

++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++
+++++++C++++++++++++
++++++++++++++++++++

Попробуйте поиграть с координатами и снова запустите main. Это всего лишь одно из многих возможных решений - отличительная черта приведенного выше кода заключается в том, что не требуется ни Map, ни даже массив, но может оказаться, что они вам в конечном итоге понадобятся, и код придется изменить, чтобы учесть это (например, сохранить битовую матрицу, сделать над ней вложенный цикл for и нарисовать установленный бит как символ ). Дайте нам знать, если вам нужен пример этого.

0
Paul Benn 17 Сен 2018 в 10:05

Подход, который я бы использовал в этом случае, заключается в следующем в псевдокоде:

  1. Создайте матрицу символов с размерами sizeX на sizeY
  2. Используйте встроенную функцию java.util.Arrays.fill, чтобы заполнить всю матрицу символом '+'
  3. Замените символ в позиции {currX, currY} (с индексом 1) символом 'C'
  4. Довольно распечатать матрицу

Вот возможная реализация того, что я описал выше:

/*
 * Prints a block of sizeX by sizeY of the filler character,
 * where the character at position {posX, posY} (1-indexed) is replaced with the replacement character
 * 
 * TODO: Validation checks. Currently assumes posX and posY are always within range of the matrix
 */
public void drawMap(int sizeX, int sizeY, char fillerChar, char replacementChar, int posX, int posY){
  // Create a char-matrix of dimensions sizeX by sizeY
  char[][] matrix = new char[sizeX][sizeY];

  // Fill this matrix initially with the filler-character
  for(char[] row : matrix)
    java.util.Arrays.fill(row, fillerChar);

  // Replace the character at position {currX, currY} (1-indexed) with the replacement-character
  matrix[posX-1][posY-1] = replacementChar;

  // Print the matrix
  prettyPrintMatrix(matrix);
}

private void prettyPrintMatrix(char[][] matrix){
  for(char[] row : matrix){
    for(char ch : row)
      System.out.print(ch);
    System.out.println();
  }
}

Затем это можно было бы вызвать с помощью:

drawMap(10, 10, '+', 'C', 4, 2);

Который будет выводить:

++++++++++
++++++++++
++++++++++
+C++++++++
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++

Попробуйте онлайн.

Некоторые вещи, на которые стоит обратить внимание:

  1. Я добавил размер и символы в качестве параметра метода. В моей TIO-ссылке выше вы можете увидеть, что вызовы с разными размерами или символами также работают (например, m.drawMap(5, 5, 'a', 'B', 5, 5);).
  2. Я добавил TODO для проверок. Если заданные posX или poxY больше, чем sizeX или sizeY соответственно, это, конечно, выдаст исключение ArrayOutOfBoundsException. Так что, возможно, проверка в верхней части метода, чтобы увидеть, являются ли заданные параметры pos действительными, в порядке, в зависимости от того, как вы хотите его использовать.
0
Kevin Cruijssen 17 Сен 2018 в 09:58