使用String的JAVA 2D地图?即“ +”和“ C”

时间:2018-09-17 09:15:17

标签: java string

所以我一直在寻找,但是我只是不知道如何陈述我的问题。

所以我要打破一个鸡蛋,如果您无论如何都能链接到正确的答案,那么请不要害怕,这是一个漫长的尝试,而且我知道这里存在很多地方,我只是无法找到它。

我正在考虑制作一个二维地图,基于加号(+)和一个(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的新手,仍然在学习,我曾经使用过一段时间,但是我应该用于吗?我有点迷茫,希望你们能帮助我。这是基于文本的rpg,我正在与学习一起进行研究。

2 个答案:

答案 0 :(得分:0)

在这种情况下,我将使用的一种方法是伪代码中的以下内容:

  1. 通过sizeX创建尺寸为sizeY的字符矩阵
  2. 使用内置的java.util.Arrays.fill用字符'+'填充整个矩阵
  3. 用字符“ C”替换位置{currX, currY}(1索引)处的字符
  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++++++++
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++

Try it online.

一些注意事项:

  1. 我已经将大小和字符添加为方法的参数。在上面的我的TIO链接中,您可以看到大小不同或字符不同的呼叫(例如m.drawMap(5, 5, 'a', 'B', 5, 5);)。
  2. 我添加了一个待办事项以进行验证检查。如果给定的posXpoxY分别大于sizeXsizeY,则当然会给出ArrayOutOfBoundsException。因此,也许在方法顶部检查一下给定的pos参数是否有效,这取决于您要如何使用它。

答案 1 :(得分:0)

您不需要if-else情况-这是循环的完美用法示例。

首先,定义永远不会更改的内容,作为班级的最终字段:

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循环,然后将设置的位绘制为字符)。让我们知道您是否想举个例子。