【问题标题】:More Efficient Way of making multiple objects制作多个对象的更有效方法
【发布时间】:2014-01-20 17:05:47
【问题描述】:

我正在尝试用 Java 制作一个记忆游戏。游戏基本上将是目前仅用于测试目的的 4x4 网格中的一些正方形。我创建了我的 Square 类,并编写了我希望他们在该类中执行的操作,然后在另一个处理游戏“正常模式”的类中创建了一个方形对象。现在,由于我有一个 4x4 的正方形网格,我需要制作 16 个不同的正方形(或者至少这是我目前的想法)。我还需要在相应的位置绘制正方形。

我的问题:在创建 16 个 Square 对象的同时仍然能够单独操作它们的最有效方法是什么? (有点像每个都有自己的名字;Square、Square1、Square2 等)。

我也在使用 Slick2D 库。

【问题讨论】:

    标签: java export lwjgl slick2d


    【解决方案1】:

    你可以试试Square[][] grid = new Square[4][4]

    【讨论】:

      【解决方案2】:

      我会使用 Square[][] 数组,例如Square[][] squares = new Square[4][4],然后用两个嵌套循环中的所有 16 个 Square 对其进行初始化:

      for (int x = 0; x < squares.length) x++)
          for (int y = 0; y < squares[x].length; y++)
              squares[x][y] = new Square(x, y);
      

      【讨论】:

      • 这将创建 16 个不同名称的不同方块?对不起,我读过这些二维数组,但从未完全理解它们。
      • 另外,你是从哪里得到 .length 的?更进一步为什么这会显示“i
      • @MrPork 它将创建 16 个不同的对象,但这些对象不会有任何“名称”(我猜您的意思是引用对象的变量),而是仅在数组中引用。您可以定义引用同一个正方形的尽可能多的变量,例如square = squares[0][0]; square2 = square;,但这既不会创建新的 Squares,也不会复制任何东西。
      • @MrPork 这是一个错字:P
      • 使用 for 循环初始化方形数组有什么意义?难道不能像这样“squares[4][4] = new Square(x, y) 吗?”为什么 Square[][] 变成 Square(x, y)?我很抱歉我的所有问题,我真的是编程新手,想要我能得到的所有信息。
      【解决方案3】:

      如上所述,Square[][] squareGrid = new Square[4][4] 是解决此问题的好方法; 然后您可以使用以下方法初始化所有 16 个:

       for (int i = 0; i < squareGrid.length; i++)
              for(int j = 0; j < squareGrid[i].length; j++)
                  squareGrid[i][j] = new Square();
      

      现在每个方格都会自动拥有自己唯一的(行、列)ID。 例如,

      squareGrid[1][2].callSomeFunctionInSquareClass();
      

      可用于操作第 2 行第 3 列的正方形。 通过这种方式,您将避免扫描所有方格以获取网格上特定单元格的方格,从而提高效率。

      编码愉快 :)

      【讨论】:

      • 非常感谢!不过,我只有大约 2 个问题。为什么使用for循环来初始化,你是如何在循环中定义i和j的。第一个 for 循环执行行,第二个执行列,反之亦然?
      • 1) 您可以将数组视为仅包含对实际对象的引用的容器,直到您将这些引用设置为某个对象,它才会为空。因此,通过执行 squareGrid[i][j] = new Square(),您实际上是在创建一个新的 Square 对象并将其设置为索引 [i][j] 处的引用。如果你不这样做,它会在 [i][j] 处为​​ null,并在你尝试访问任何 Square 对象方法以及不使用的方法时抛出臭名昭著的 NullPointerException,例如 squareGrid[1][3].callSomeFunc ()。
      • 2) 您可以将其视为对您更有意义的那个。对我来说,例如在符号数组 [i] [j] 中,我将第一个数组或“i”视为行,将其中的数组或“j”视为列。您可以反过来考虑它们,但要确保它与程序的其余部分一致,以避免任何潜在的混淆。
      • 再次感谢,这个解释帮助很大。
      猜你喜欢
      • 2013-02-19
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      相关资源
      最近更新 更多