2015-11-21 60 views
0

这是我第一次在Stackoverflow上,这个问题可能之前已经被问过了,但我没有找到那些线程的麻烦。我目前正在开发一款井字游戏Android游戏,作为我的第一个应用程序项目。Java - 如何使实例实例在主实例中获取变量?

案件是我正在对我的PlayState-类的工作,其中游戏的主要部分将发生。 PlayState将成为您在菜单中选择它时显示的实例。这是我如何在PlayState中完成的:

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

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

正如我已经成功地做到这一点通过Character类:

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和在boardTileMark上也同时给出了字符'x'或'o'。

这就是现在的问题是:

当我要检查,如果这是一个双赢,绘制或失去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:我试图让这个游戏尽可能的坚实,所以我可以用它来做另一个项目。所以保持游戏本身和同班同学的胜利支票不是我打算做的。

回答

0

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

正如我理解正确的话你的整个描述可以缩短到:“我有一个类PlayState这个类包含标记的二维阵列和类EndMechanism实例的类的实例EndMechanism需要访问二维PlayState1类的标记数组“。

如果是对的,那么你真正的问题是如何访问外部类的变量。而这样的问题在Java的流行,已经有其他问题的答案,例如这里:

access variables of outer class in Java

所以我检举此问题的重复,但我仍然会提供一个答案。

但在你的情况下,我不会创建一个新的类(EndMechanism)只用于检查结束条件,但我会把功能,在PlayState类中检查结束条件。检查结束条件与markBoardTiles函数的功能类似,因此它应该在同一个类中。如果它在同一个班级中,你不必处理所描述的问题。通常如果某个类,比如说X只使用Y类中的变量,而X类与Y具有相同类型的功能,那么X中的函数应该在类Y中。

但是,如果您想保留目前的方法,您应该在EndMechanism类中调用PlayState.this.markBoardTiles,并且您将有权访问markBoardTiles变量。

+0

好吧,我会记住可能下一篇文章:)非常感谢你的帮助,并感谢你对新人很容易:) – Talabo

+0

@塔拉博没问题,如果解决了你的问题,你可以点击左侧的标记接受我的回答。 – ctomek