Java - 如何让实例的实例在主实例中获取变量?

Java - How to make instance of a instance pick up variables in the main instance?

这是我第一次来到 Whosebug,之前可能有人问过这个问题,但我很容易找到那些帖子。我目前正在开发 Tic Tac Toe Android 游戏,这是我制作应用程序的第一个项目。

情况是我正在开发我的 PlayState-class 游戏的主要部分将在这里发生。 PlayState 是当您在菜单中选择它时出现的一个实例。这就是我在 PlayState:

中的做法

因为我有 PlayState 作为实例,不想有任何静态方法。我还制作了一个 EndMechanism-class,它是在 PlayState 中创建的一个实例。 class 检查 Wins/Lose/Draw。我想要这样做的方法是让每个 Tile (3x3) 得到一个由循环中的变量标记的字符 (X 或 O)。

boardTileMark[row][col] = 'x';

因为我已经设法通过使用 Character class:

boardTiles = new BoardTile[3][3]; // To make the Tiles 3 by 3
boardTileMark = new Character[boardTiles.length][boardTiles[0].length];

我使用了真正的 BoardTile 的大小来制作标记的大小数字。所以到目前为止一切正常。

然后是 EndMechanism-class 作为实例:

endMech = new EndMechanism();

不用过多赘述到目前为止一切正常,当我按下一个正方形时,它会得到一个 X 或 O(图形)boardTile 以及一个字符 'x' 或 'o' 在 boardTileMark.

上平行给出

现在的问题是:

因为我想检查它在 EndMechanism 上是赢、平还是输,我真的不确定如何在不复制值的情况下将这些标记提取到 EndMechanism 中,并且然后在 EndMechanism.

中编写相同的代码

这就是我将 boardTileMark 设置为 x 或 o 的方式。

public void markBoardTiles(){
        for(int row = 0;row < boardTiles.length;row++){
            for(int col = 0;col < boardTiles[0].length;col++){
                if(boardTiles[row][col].selected() && boardTiles[row][col].cross()){
                    boardTileMark[row][col] = 'x';
                }
                else if(boardTiles[row][col].selected() && boardTiles[row][col].circle()){
                    boardTileMark[row][col] = 'o';
                }
            }
        }
    }

如果有什么地方令人困惑,请告诉我,我会更好地描述它。感谢您的宝贵时间:)

PS:我正在努力让这个游戏尽可能地可靠,这样我就可以将它用于另一个项目。所以保持游戏本身和胜利检查相同 class 不是我打算做的。

我认为您的描述过于宽泛,因此问题有点不清楚,并且包含很多对您的问题不重要的信息,因此减少了获得答案的机会。

据我理解,您的整个描述可以缩短为:"I have a class PlayState and this class contains two dimensional array of marks and an instance of a class EndMechanism. The instance of a class EndMechanism needs to access two dimensional array of marks from PlayState1 class."

如果它是正确的那么你真正的问题是如何访问外部 class 的变量。这个问题在 Java 中很流行,并且在其他问题中已经有了答案,例如这里:

access variables of outer class in Java

所以我将这个问题标记为重复,但我仍然会提供答案。

但在你的情况下,我不会创建一个新的 class (EndMechanism) 仅用于检查结束条件,但我会将检查结束条件的函数放在 PlayState class。检查结束条件与 markBoardTiles 函数的功能相似,因此它应该在相同的 class 中。如果它在同一个 class 中,您就不必处理所描述的问题。通常,如果某些 class,假设 X 仅使用来自 class Y 和 class X 的变量,其功能与 Y 那么来自 X 的函数应该在 class Y.

但是如果您想继续使用当前的方法,您应该在 EndMechanism class 中调用 PlayState.this.markBoardTiles 并且您将可以访问 markBoardTiles 变量。