2015-11-21 105 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