【问题标题】:Java storing objects in a multidimensional arrayJava将对象存储在多维数组中
【发布时间】:2015-05-27 08:59:51
【问题描述】:

我正在尝试将对象存储在多维数组中,以尝试将每个位置保存在游戏板“状态”中,但是在应该将每个实例设置为其自己的参数的循环之后,它们最终都相同变量。我没有链接正确的数组或设置错误吗? 还有很多“square.something应该以静态方式访问”。

square.var 或 World[x][y].var 是引用对象变量的正确方法吗?

public static void generateMap() {
    MapSquare[][] World = new MapSquare[10][10]; //2D array init.

    //Choose a square for the home position.
    Random homeRandom = new Random();
    int HomeX = homeRandom.nextInt(10);
    int HomeY = homeRandom.nextInt(10);

    //Chooses a key room.
    int KeyX = homeRandom.nextInt(10);
    int KeyY = homeRandom.nextInt(10);

    //Loop through the objects and set each's parameters.
    for (int i = 0; i < 10; i++)
        {
        for (int j = 0; j < 10; j++)
            {
            MapSquare square = new MapSquare();
            //World[i][j] = square;

            //Calculate the level of the square from the distance to home.
            int distX = HomeX - i;
            int distY = HomeY - j;

            int CalcX = Math.abs(distX); //Convert to positive if negative.
            int CalcY = Math.abs(distY); //Convert to positive if negative.

            //Generate contents of the square.
            int newRandom = random.nextInt(5) + 1;

            switch(newRandom) {
            case 1: // Spawn a monster only.
                {
                square.monster = true;
                square.treasure = false;
                square.trap = false;
                square.home = false;
                square.peekable = false;
                square.key = false;
                square.mapLevel = CalcX + CalcY;

                //Generate the monsters stats.
                Monster monster = new Monster();
                monster.setLevel(square.mapLevel);
                monster.setMaxHealth(monster.getLevel() * 5);
                monster.setHealth(monster.getMaxHealth());
                monster.setDamage(monster.getLevel() * 2);
                break;
                }
            }
            }
        }

    //Generate home square.
    World[HomeX][HomeY].monster = false;
    World[HomeX][HomeY].treasure = false;
    World[HomeX][HomeY].trap = false;
    World[HomeX][HomeY].home = true;
    World[HomeX][HomeY].peekable = true;
    World[HomeX][HomeY].key = false;
    World[HomeX][HomeY].mapLevel = 0;
    World[HomeX][HomeY].visited = true;
    }

【问题讨论】:

  • 当你说 random.nextInt(5) + 1 时:你的意思是 homeRandom.nextInt(5) +1 对吗?除此之外,我认为您需要使您的 MapSquare 类定义更加标准。直接修改成员绝不是一个好主意。为此创建设置器。
  • 啊,是的,谢谢,我知道我现在也定义了另一个名为 random 的东西,这是多余的。
  • 这行//World[i][j] = square;应该被注释掉吗?
  • 是的,那条线是新的,我不确定并评论了它,看看是否有任何改变,但它没有改变。 MapSquare 现在基本上只有 Getter 和 Setter,而不是 init。如果我将它们交换为 Get 和 Set,则表明它们应该以静态方式访问。
  • 不要告诉我你在MapSquare 类中创造了static 的一切?如果是这样,那就是你的问题。从该类的每个方法和每个字段中删除static,然后放回您注释掉的那一行。然后,继续阅读 static 的含义。

标签: java arrays object multidimensional-array


【解决方案1】:

static关键字基本上意味着一个方法可以独立于它所在的类的特定实例来使用。比如你正在使用的Math.abs(int i)函数,你不必创建一个实例Math 类使用它。

如果您打算使用类来存储数据,那么包含静态方法通常不是一个好主意,因为它们将无法访问该数据。

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 2011-06-10
    • 2019-08-08
    • 2018-02-19
    • 2015-12-08
    • 2013-09-04
    • 2014-01-04
    • 2018-02-21
    相关资源
    最近更新 更多