java - 程序无法识别字符在数组中的位置
问题描述
我正在尝试编写一个程序,其中角色在二维数组中移动,并且在与之交互的方式上存在某些障碍。迷宫看起来像这样(尽管每次运行时障碍物的位置都会改变):
x | \
/ / \
\
/ / \
\ \ | |
x 代表玩家,每秒钟向右移动一个空格。如果它与“/”接触,则向右移动一格,向下移动一格。如果它接触到一个“\”,它会向右移动一个空格,然后向上移动一个空格。如果它与“|”接触,它会自动死亡。但是,当玩家的路径中有障碍物时,该程序似乎无法识别。它一直在直线移动,最后看起来像这样:
x x x x x x x x
/ / \
\
/ / \
\ \ | |
这是我的代码,应该检查是否有障碍物:
if (maze[l][f].equals("/")) {
if ((l-1) < 0) {
System.out.println("You died on column " + (f + 1));
System.exit(0);
y+=1;
} else {
l-=1;
f+=1;
maze[l][f] = "x";
y+=1;
}
} else if (maze[l][f].equals("\\")) {
if ((l+1) >= rows){
System.out.println("You died on column " + (f + 1));
System.exit(0);
y+=1;
} else {
l+=1;
f+=1;
maze[l][f] = "x";
y+=1;
}
} else if (maze[l][f].equals("|")) {
System.out.println("You died on column" + (f+1));
System.exit(0);
y+=1;
} else {
f+=1;
maze[l][f] = "x";
y+=1;
}
这是创建迷宫的代码:
private static int rows;
private static int columns;
public static String[][] maze = new String[5][8];
public String[][] grid() {
Random rand = new Random();
int prob;
String obstacle = "";
boolean enabled = true;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
if (enabled == true) {
prob = rand.nextInt(9) + 1;
if (prob == 1) {obstacle = "|"; enabled = false;}
else if (prob == 2 || prob == 3) {obstacle = "/"; enabled = false;}
else if (prob == 4 || prob == 5) {obstacle = "\\"; enabled = false;}
else {obstacle = ""; enabled = true;}
}
else {enabled = true; obstacle = "";}
maze[r][c] = obstacle;
}
}
return maze;
}
我看不出它有什么问题。如果您有任何想法,请告诉我。
谢谢
解决方案
假设您当前位于位置 [0,0],使用您在问题中编写的网格:您得到了l=0; f=0
该位置是一个空格字符,代码已执行并到达最后else
一部分。
现在,会发生什么?f
递增,这意味着您向右移动,现在站在 [0,1] 上。x
然后你通过在这个新位置上写一个来标记你的位置。
在下一次执行时,该字符不是您期望的空格字符,而是一个x
. 您再次到达 else 块并再次向右移动到 [0,2]。再一次,你用 标记你的新位置x
,覆盖|
站在那里的那个。等等...
您应该做什么:仅当字符不是特殊字符且在移动到下一个位置之前标记您的位置
if (maze[l][f].equals("/")) {
if ((l+1) >= rows) {
System.out.println("You died on column " + (f + 1));
System.exit(0);
y+=1;
} else {
//maze[l][f] = "x"; // only if you want to replace the '/' char
l+=1; // to go down, add one (first line has index 0)
f+=1;
y+=1;
}
} else if (maze[l][f].equals("\\")) {
if ((l-1) < 0){
System.out.println("You died on column " + (f + 1));
System.exit(0);
y+=1;
} else {
maze[l][f] = "x"; // only if you want to replace the '\' char
l-=1; // to go up, substractone (first line has index 0)
f+=1;
y+=1;
}
} else if (maze[l][f].equals("|")) {
System.out.println("You died on column" + (f+1));
System.exit(0);
y+=1;
} else {
maze[l][f] = "x"; // mark the current position before moving to the next one
f+=1;
y+=1;
}
推荐阅读
- javascript - 如何让 Javascript 或 Jquery 识别我动态添加的链接?
- java - Opencsv写入嵌套bean列表
- android - 我的 Android 应用程序中的 Facebook 登录在尝试登录时返回操作已取消
- r - 如何解释这些引导置信度结果
- c# - 如何抑制多次按钮点击?
- recursion - 一个关于使用海龟和递归用python制作分形的问题
- angular - Angular cdkDrag 边界父组件
- sql - SQL“不正确”的列计算
- autodesk-forge - 有没有办法使用设计自动化处理用户本地(非 BIM360)文件,并且仍然可以获得用户选择之类的东西?
- gradle - 在 PluginManager 中使用基本 Spock 规范和 JenkinsRule 时遇到问题