Java 让玩家在2D阵列游戏网格上移动
我正在创建一个使用10x10 2D阵列的游戏。玩家从左上角显示为“P”开始,目标是让玩家避开障碍物,到达右下角显示为“T”的宝藏 如何使用上/下/左/右命令让玩家在网格上移动 我会使用for循环对数组中的元素进行计数以指定移动吗 以下是我到目前为止的情况: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) {
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”。是的,我的错,我没有意识到他使用板存储他们的位置,尽管我宁愿将它们与板分开存储。