所以我一直在寻找,但是我只是不知道如何陈述我的问题。
所以我要打破一个鸡蛋,如果您无论如何都能链接到正确的答案,那么请不要害怕,这是一个漫长的尝试,而且我知道这里存在很多地方,我只是无法找到它。
我正在考虑制作一个二维地图,基于加号(+)和一个(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,我正在与学习一起进行研究。
答案 0 :(得分:0)
在这种情况下,我将使用的一种方法是伪代码中的以下内容:
sizeX
创建尺寸为sizeY
的字符矩阵java.util.Arrays.fill
用字符'+'填充整个矩阵{currX, currY}
(1索引)处的字符以下是我上面所述的可能的实现方式:
/*
* 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++++++++
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++
一些注意事项:
m.drawMap(5, 5, 'a', 'B', 5, 5);
)。posX
或poxY
分别大于sizeX
或sizeY
,则当然会给出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循环,然后将设置的位绘制为字符)。让我们知道您是否想举个例子。