让玩家在2D阵列游戏网格上移动

时间:2012-02-08 16:44:53

标签: java multidimensional-array move

我正在使用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)>");
}
}

3 个答案:

答案 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)

看起来你正在使用行主要排序,从你的主板打印方式来判断。基于此,以下是您需要做的事情:

  1. 首先,您需要将玩家的位置存储在某处。现在它被硬编码为0,0。
  2. 其次,你需要阅读玩家的举动。这将不得不在一个循环中发生,你可以在那里进行移动,检查是否允许移动,执行移动并显示结果。
  3. 第三,您需要能够根据移动计算新位置。向上意味着row -= 1。正确表示column += 1。等
  4. 给定新坐标,您需要确保移动有效。至少,你必须阻止他们离开棋盘,但你也可能阻止他们进入有障碍物的广场等。
  5. 一旦您知道移动有效,您必须更新存储当前坐标的变量。
  6. 在循环结束时,您需要重新绘制电路板。
  7. 这是它的基本要点。现在你正在main()做所有事情,这没关系,但如果是我,我会开始将事情拆分成单独的方法,如InitializeBoard()GetNextMove(),{{1} }, 等等。这样,CheckIfMoveIsValid(int r, int c)成为游戏循环的高级视图,不同操作的内容被划分,更容易处理。这需要将诸如游戏板之类的东西存储到类变量而不是局部变量中,这实际上应该使障碍物检测变得比现在更容易。

答案 2 :(得分:0)

以上所有答案都很棒。以下是我要提出的一些建议:

而不是 char 二维数组,我会创建一个自定义对象,例如 Space ,并定义一个二维空间数组(例如,Space [] [])。这有几个原因:

  1. 您可以通过多种方式定义空间(而不仅仅是1个字符)。例如,Space [i] [j] .hasTreasure()可以返回一个布尔值,让你知道你是否找到了宝藏。
  2. 如果您想稍后添加功能,就像向Space类添加属性一样简单。同样,你不仅限于一个角色。
  3. 更多关于运动的问题,我还会推荐一些东西。类似于redneckjedi建议的CheckIfMoveIsValid()方法,我会传递网格并将方向作为参数移动并返回一个布尔值。为了确保您不会遇到ArrayIndexOutOfBounds问题,我还建议在每一侧添加一行/一列墙。我将网格扩展到12x12并在外面放置一条障碍型块。这将确保您无法走出网格,因为在有效的移动中,击中墙将始终返回'false'。