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

Java 让玩家在2D阵列游戏网格上移动,java,multidimensional-array,move,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) {

我正在创建一个使用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)>");
}
}
import java.util.Scanner;
导入java.util.Random;
公共课冒险{
公共静态void main(字符串[]args){
字符网格[][]=新字符[10][10];
扫描仪移动=新扫描仪(System.in);
System.out.println(“这是当前的游戏板:”);
System.out.println(“------------------------------------”;

对于(inti=0;i,您应该跟踪玩家的当前位置,只需更新这些变量即可。 如你所说,初始值是(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';
grid[px][py]=;
开关(移动){
案例“u”:py+=1;中断;
案例“r”:px+=1;中断;
...
}
网格[px][py]=“P”;
当然,您不应该“盲目”地更新值,您应该插入一些验证逻辑以遵循游戏规则:

if (grid[px][py] != <obstacle> )
   // update player coordinates...
if(网格[px][py]!=)
//更新玩家坐标。。。

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

  • 首先,你需要将玩家的位置存储在某个地方。现在它被硬编码为0,0
  • 第二,你需要阅读玩家的移动。这必须在一个循环中发生,在那里你得到移动,检查移动是否被允许,执行移动,并显示结果
  • 第三,您需要能够基于移动计算新位置。向上表示
    行-=1
    。向右表示
    列+=1
    。等等
  • 给定新坐标,你需要确保移动有效。至少,你必须阻止他们离开板,但你也可能阻止他们进入一个有障碍的广场等
  • 一旦知道移动有效,就必须更新存储当前坐标的变量
  • 在循环结束时,您需要重新绘制电路板

  • 这是它的基本要点。现在你在
    main()
    中做所有事情,这没关系,但是如果是我,我会开始将事情分成不同的方法,比如
    InitializeBoard()
    GetNextMove()
    CheckIfMoveIsValid(intr,intc)
    ,等等。这样,
    main()
    成为游戏循环的高级视图,不同操作的细节被划分,更容易处理。这需要将游戏板之类的东西存储到类变量而不是局部变量中,这实际上会使障碍物检测等事情比当前更容易

    以上所有答案都很好。以下是我的一些建议:

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

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

  • 关于你的移动问题,我还建议你做几件事。类似于雷德内克绝地提出的CheckIfMoveIsValid()方法,我将传递网格和移动方向作为参数并返回布尔值。为了确保不会出现ArrayIndexOutOfBounds问题,我还建议在每侧添加一行/列墙。我将将网格向外扩展到12x12,并在外部放置一条障碍类型的块。这将确保您无法ep在网格外撞击墙壁时,在有效移动时总是返回“false”。

    是的,我的错,我没有意识到他使用板存储他们的位置,尽管我宁愿将它们与板分开存储。