我正在使用10x10 2D阵列创建游戏。玩家从左上角开始显示为“P”,目标是让玩家避开障碍物到达位于右下角的“T”宝藏。
如何使用向上/向下/向左/向右命令让玩家在网格上移动?
我是否会使用for循环来计算数组中的元素以指定移动?
这是我到目前为止所做的:
import java.util.Scanner;
import java.util.Random;
public class Adventure {
public static void main(String[] args) {
char grid[][]= new char[10][10];
Scanner move = new Scanner(System.in);
System.out.println("Here is the current game board:");
System.out.println("-------------------------------");
for(int i=0; i<grid.length; i++) {
for(int j=0; j<grid.length; j++) {
double random = Math.random();
if(random <=.05) {
grid[i][j]='*';
}
else if(random > .06 && random <= .15) {
grid[i][j]='X';
}
else {
grid[i][j]='.';
}
grid[0][0]='P';
grid[9][9]='T';
System.out.print(grid[i][j]);
}
System.out.println("");
}
System.out.print("Enter your move (U/D/L/R)>");
}
}
答案 0 :(得分:2)
您应该跟踪播放器的当前位置,并更新这些变量。 如你所说,初始值将是(0,0)。
int px = 0;
int py = 0;
进行移动时,相应地更新变量:
grid[px][py] = <empty cell>;
switch (move) {
case 'u': py += 1; break;
case 'r': px += 1; break;
...
}
grid[px][py] = 'P';
当然你不应该只是“盲目地”更新这些值,你应该插入一些验证逻辑来遵循游戏规则:
if (grid[px][py] != <obstacle> )
// update player coordinates...
答案 1 :(得分:2)
看起来你正在使用行主要排序,从你的主板打印方式来判断。基于此,以下是您需要做的事情:
row -= 1
。正确表示column += 1
。等这是它的基本要点。现在你正在main()
做所有事情,这没关系,但如果是我,我会开始将事情拆分成单独的方法,如InitializeBoard()
,GetNextMove()
,{{1} }, 等等。这样,CheckIfMoveIsValid(int r, int c)
成为游戏循环的高级视图,不同操作的内容被划分,更容易处理。这需要将诸如游戏板之类的东西存储到类变量而不是局部变量中,这实际上应该使障碍物检测变得比现在更容易。
答案 2 :(得分:0)
以上所有答案都很棒。以下是我要提出的一些建议:
而不是 char 二维数组,我会创建一个自定义对象,例如 Space ,并定义一个二维空间数组(例如,Space [] [])。这有几个原因:
更多关于运动的问题,我还会推荐一些东西。类似于redneckjedi建议的CheckIfMoveIsValid()方法,我会传递网格并将方向作为参数移动并返回一个布尔值。为了确保您不会遇到ArrayIndexOutOfBounds问题,我还建议在每一侧添加一行/一列墙。我将网格扩展到12x12并在外面放置一条障碍型块。这将确保您无法走出网格,因为在有效的移动中,击中墙将始终返回'false'。