【问题标题】:Making a player move on 2D array game grid让玩家在 2D 阵列游戏网格上移动
【发布时间】:2012-03-01 03:29:31
【问题描述】:

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

【问题讨论】:

    标签: java multidimensional-array move


    【解决方案1】:

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

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

    1. 您可以通过多种方式定义空格(而不仅仅是 1 个字符)。例如,Space[i][j].hasTreasure() 可以返回一个布尔值,让您知道您是否找到了宝藏。
    2. 如果您想稍后添加功能,只需将属性添加到您的 Space 类即可。同样,您在这里不仅限于一个角色。

    对于您的运动问题,我还建议您做一些事情。类似于 redneckjedi 对 CheckIfMoveIsValid() 方法的建议,我会将网格和移动方向作为参数传递并返回一个布尔值。为确保您不会遇到 ArrayIndexOutOfBounds 问题,我还建议在每一侧添加一行/列墙壁。我会将网格扩大到 12x12,并在外面放一条障碍物类型的块。这将确保您无法走出网格,因为在有效移动中撞墙将始终返回“false”。

    【讨论】:

      【解决方案2】:

      从您的电路板打印方式来看,您似乎正在使用行优先排序。基于此,您需要执行以下操作:

      1. 首先,您需要将玩家的位置存储在某个地方。现在它被硬编码为 0,0。
      2. 其次,你需要读入玩家的动作。这必须在一个循环中发生,在此循环中,您移动、检查是否允许移动、执行移动并显示结果。
      3. 第三,您需要能够根据移动计算新位置。向上表示row -= 1。正确的意思是column += 1。等等。
      4. 给定新坐标,您需要确保移动有效。至少,你必须阻止他们走出棋盘,但你也可以阻止他们进入有障碍物的广场等。
      5. 一旦您知道移动是有效的,您就必须更新存储当前坐标的变量。
      6. 在循环结束时,您需要重新绘制电路板。

      这就是它的基本要点。现在你在 main() 中做所有事情,这没关系,但如果是我,我会开始将事情拆分成单独的方法,例如 InitializeBoard()GetNextMove()CheckIfMoveIsValid(int r, int c) 等等。这样一来,main() 就成为了游戏循环的高级视图,并且不同操作的内容被划分并且更容易处理。这将需要将游戏板等内容存储到类变量而不是局部变量中,这实际上应该使障碍检测等事情比现在更容易。

      【讨论】:

        【解决方案3】:

        您应该跟踪玩家的当前位置并更新这些变量。 如您所说,初始值将是 (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...
        

        【讨论】:

        • 是的,我的错,我没有意识到他使用棋盘来存储他们的位置,尽管我宁愿将它们与棋盘分开存储。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多