我正在创建一个Java Dungeon游戏,到目前为止它将ASCII地图导入到2d数组中。然后添加一个播放器,可以使用CLI在地牢中漫游。在退出并赢得比赛之前,玩家必须拿起所有的金币。
我遇到的问题是你现在可以看到整个地牢。例如..
###################
#.................#
#......G........E.#
#...........G.....#
#..E..............#
#..........G......#
#.............P...#
#.................#
###################
我想要它,这样您就可以使用LOOK
命令并在播放器周围看到2个瓷砖无线电。例如..
X...X
.....
..P..
.....
X###X
到目前为止,我已经想出了这个。
public void look(){
try{
System.out.print("X");
System.out.print(myWorld[posX-2][posY-1]);
System.out.print(myWorld[posX-2][posY]);
System.out.print(myWorld[posX-2][posY+1]);
System.out.print("X");
System.out.print("\n");
System.out.print(myWorld[posX-1][posY-2]);
System.out.print(myWorld[posX-1][posY-1]);
System.out.print(myWorld[posX-1][posY]);
System.out.print(myWorld[posX-1][posY+1]);
System.out.print(myWorld[posX-1][posY+2]);
System.out.print("\n");
System.out.print(myWorld[posX][posY-2]);
System.out.print(myWorld[posX][posY-1]);
System.out.print(myWorld[posX][posY]);
System.out.print(myWorld[posX][posY+1]);
System.out.print(myWorld[posX][posY+2]);
System.out.print("\n");
System.out.print(myWorld[posX+1][posY-2]);
System.out.print(myWorld[posX+1][posY-1]);
System.out.print(myWorld[posX+1][posY]);
System.out.print(myWorld[posX+1][posY+1]);
System.out.print(myWorld[posX+1][posY+2]);
System.out.print("\n");
System.out.print("X");
System.out.print(myWorld[posX+2][posY-1]);
System.out.print(myWorld[posX+2][posY]);
System.out.print(myWorld[posX+2][posY+1]);
System.out.println("X");
}catch(IndexOutOfBoundsException e){
System.out.println("AGAINST WALL....");
}
}
我确信有更好的方法可以做到这一点,但我无法弄清楚。除非玩家靠墙,否则此方法也有效。有没有更好的方法来做到这一点,我怎么能在我的'?'地图周围创建一个缓冲区?对于不在地图中的图块。
答案 0 :(得分:1)
我建议添加2个变量,其中包含数组大小(例如sizeX和sizeY)并使用两个循环:
for (i = posX-2; i<posX+2; i++){
for (j = posY-2; j<posY+2; j++){
if (i>=0 && i<sizeX && j>=0 && j<sizeY){
System.out.print(myWorld[i][j]);
}
System.out.print("\n");
}
我希望这会有所帮助。
答案 1 :(得分:1)
void getSurrounding(myWorld, posX, poxY, width, height, radius)
{
for(i=-(radius-1);i==(radius-1);i++)
{
if(i==0 || i==radius)
{
System.out.print('X');
}
if(posX+i>width)
{
break;
}
for(j=-(radius-1);j==(radius-1);j++)
{
if(posY+j>height)
{
break;
}
System.out.print(myWorld[posX+i][posY+j]);
}
System.out.println('\n');
}
}
//Call in your look function
void look()
{
getSurroundings(myWorld,posX,posY,width,height,2);
}`
答案 2 :(得分:1)
正如其他人建议你应该使用2 for循环。我添加了所需的逻辑,得到了你正在寻找的结果
public void look()
{
StringBuffer sb = new StringBuffer(25);
for(int y= posY-2; y <= posY+2; y++){
for(int x = posX-2; x <= posX+2; x++){
try
{
if(x<0 || y<0 || x > myWorld.length || y > myWorld[x].length)
sb.append("#");//Wall or outside map
else
if(Math.abs(posX-x)+Math.abs(posY-y) < 4)
sb.append(myWorld[x][y]); //Valid part of map
else
sb.append("X"); //Unreachable corner
}
catch(IndexOutOfBoundsException e){} //This shouldn't happen :)
}
sb.append("\n");
}
System.out.println(sb);
}
使用StringBuffer将使用更大量的数据来缩短执行时间