用Java打印出2D阵列无线电

时间:2014-02-19 12:13:56

标签: java methods printing ascii multidimensional-array

我正在创建一个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....");
    }
}

我确信有更好的方法可以做到这一点,但我无法弄清楚。除非玩家靠墙,否则此方法也有效。有没有更好的方法来做到这一点,我怎么能在我的'?'地图周围创建一个缓冲区?对于不在地图中的图块。

3 个答案:

答案 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将使用更大量的数据来缩短执行时间