使用 toString() 打印包含多个对象的地图

Printing a map with multiple objects using toString()

我正在 java 中制作一个没有界面的 pacman 模拟器,仅使用控制台打印,我在打印时遇到了问题。 所以,我有一个对象 pacman,它的坐标为 x 和 y,我有一个带有墙壁和 fruti 的网格,它是矩阵 tile[][]。 虽然我只打印了 pacman 和网格,但一切正常。 这是我使用的 toString():

public String toString() {
        String s = "";
        for(int i=0;i<WIDTH;i++) {
            for(int j=0;j<HEIGHT;j++) {
                if(pacman.getX() == i && pacman.getY() == j) {
                    s = s + pacman;
                } 
                else {  
                    s = s+tile[i][j];   
                }


            }
            s=s+"\n";
        }
        return s;
    }

这是输出:

####################
#<~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
####################

现在,我创建了一个幽灵数组列表,当我想打印幽灵、pacman 和网格时,我遇到了一些问题。 我希望代表鬼魂的角色位于网格角色之上,就像我对吃豆人所做的那样。 我只是想不出在瓷砖上方打印鬼魂的最佳方法。 我正在使用这样的 foreach 循环:

for(Ghost g : ghosts) {
  if(g.getX() == i && g.getY() == j) {
        s = s + g;
  }
}

通常我在控制台中打印是这样的:

####################
#<~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~3~~~~~2~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~1~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
#~~~~~~~~~~~~~~~~~~#
####################

我该如何解决这个问题?

事实证明这比我想象的要复杂一些,但我认为您可以有条件地 continue 行处理(内部 j 循环)并且它会成功。不过,您确实必须将幽灵放在 else 块中。未测试:

        ROW: 
        for(int j=0;j<HEIGHT;j++) {                 
            if(pacman.getX() == i && pacman.getY() == j) {
                s = s + pacman;
            } 
            else { 
                for(Ghost g : ghosts) {
                  if(g.getX() == i && g.getY() == j) {
                    s = s + g;
                    continue ROW;
                  } 
                 s = s+tile[i][j];   
               }
            }

您需要以某种方式摆脱“~”。您可以通过使用二维字符数组而不是字符串来执行此操作,如下所示:

char[][] map = new char[width][height];

然后您可以像这样编辑每个 'pixel':

map[y][x] = g;

编辑:然后您将通过遍历所有字符来绘制屏幕,​​将它们写入字符串并在每行之后放置一个 \n。