这是交易,我必须制作一个类似PacMan的游戏,包括地图,点,鬼等。 整个事情就像一个阵列[8] [8],它从.txt文件中读取墙壁的位置和鬼魂的初始位置,PacMan从一个固定的位置开始,水果是随机的。游戏开始时的任何空白区域都会填充一个简单的点状颗粒。 我已经完成了地图,它显示了它和一切,但我似乎无法想出一种允许玩家用键盘控制PacMan的方法......这是我到目前为止所尝试的... 。 在Player类
中BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
String mov = read.readLine();
if (mov.equals("w"))
{
PacMan.MoveU();
}
然后重复其他移动键。
PacMan类中的各个Move方法看起来像这样
public static void MoverR()
{
for (int i=0;i<Tablero.length;i++)
{
for (int j=0;j<Tablero.length;j++)
{
if (Tablero[i][j] instanceof PacMan)
Tablero[i][j]=null;
Tablero[i][j+1]=new PacMan();
}
}
}
}
这显然不起作用,所以我想知道是否有人能以更有效的方式帮助我做到这一点?我真的不介意从头开始这两个班...... 感谢。
答案 0 :(得分:1)
它总是给我一个ArrayOutOfBounds异常
ArrayOutOfBounds异常是由Tablero[i][j+1]=new PacMan();
j == 7
引起的,因为您尝试访问无效位置(Tablero[i][8]
)。
任何人都可以通过更有效的方式帮助我做到这一点吗?
你不需要检查整个数组以找出Pacman的位置,你可以将该位置存储为Pacman的私有变量,但是在这种情况下你不应该每次都创建一个新的Pacman实例需要移动它,就像你正在使用当前的实现一样。
答案 1 :(得分:0)
您获得ArrayOutOfBoundsException
的一个原因是,在您的循环中,您将PacMan
移动到位置[i][j +1]
,其中j + 1
可能大于数组长度。
当你'移动'j + 1 < Tablero.length
时,你需要检查PacMan
。
此外,您只需移动PacMan
的同一个实例,而不是创建一个新实例:
...
if (Tablero[i][j] instanceof PacMan) {
if (j + 1 < Tablero.length) {
Tablero[i][j+1] = Tablero[i][j];
Tablero[i][j] = null;
}
}