2014-03-04 178 views
0

我正在寫一個Tic-Tac-Toe程序,我試圖在驅動程序中使用該類中的「playOn」方法,我不確定我是如何使用公共變量(X和O)我已經定義使用該方法。這是假設在「單身」的設計。任何幫助表示讚賞。訪問公共對象變量

public class TTTPlayer { 
    public TTTPlayer X = new TTTPlayer('X'); 
    public TTTPlayer O = new TTTPlayer('O'); 
    private char symbol; 
    private Random gen; 
    private boolean playerTurn; // true for 'X', false for 'O' 

    private TTTPlayer(char ch) { 
     this.symbol = ch; 
    } 
    public void playOn(TTTBoard board) { 
     int row = gen.nextInt(2); 
     int col = gen.nextInt(2); 
    if (playerTurn) { 
     board.place(X, row, col); 
     playerTurn = false; 
    } else { 
     board.place(O, row, col); 
     playerTurn = true; 
    } 
} 
+0

我會假設你完全像'board.place(X,row,col);'和'board.place(O,row,col);'。爲什麼X和O完全公開? –

+0

那麼,爲了確保沒有其他的TTTPlayer實例被創建,我的老師指定構造函數爲private,並創建兩個實例X和O來公開,我不明白爲什麼,因爲它使它更難爲我使用它的方法。我不能在我的驅動程序中聲明TTTPlayer實例,因爲它是私有的,但我可以將其聲明爲如下的變量:「TTTPlayer player;」但我不能使用任何方法.. – user3377319

+0

好吧......如果他們要成爲「公共」,那麼我會冒險猜測他們將被用在定義他們的類外的**之外。 –

回答

0

我想你在這裏失蹤的只是靜態修飾符。

靜態成員屬於這個類,他們生活在一種全球存在(儘管他們不一定全球都可以訪問)。您可以通過參考該類訪問它們,如out是類System的靜態成員,因此System.out

當您使用new創建一個新對象時,它是一個唯一的實例並擁有實例成員。 out實際上是PrintStream的一個對象實例,所以當你說out.println,println是一個實例方法。

其他一些語言讓你可以在某種全局命名空間中聲明函數和事物,但Java沒有,所有的東西都必須放在類中。所以我們有靜態成員。

這裏,XO是靜態成員,如System.out但它們也是封閉類的實例。

public class TTTPlayer { 
    private char symbol; 

    private TTTPlayer(char ch) { 
     this.symbol = ch; 
    } 

    public static TTTPlayer X = new TTTPlayer('X'); 
    public static TTTPlayer O = new TTTPlayer('O'); 
    private static Random gen; 
    private static boolean playerTurn; // true for 'X', false for 'O' 

    public static void playOn(TTTBoard board) { 
     int row = gen.nextInt(2); 
     int col = gen.nextInt(2); 
     if (playerTurn) { 
      board.place(X, row, col); 
      playerTurn = false; 
     } else { 
      board.place(O, row, col); 
      playerTurn = true; 
     } 
    } 
} 

要玩轉,請致電TTTPlayer.playOn。同樣,XO可以使用類名稱(如TTTPlayer.XTTTPlayer.O)進行訪問。

如果你對實例和靜態(有些人不是)有區別,你可以考慮將這兩者分隔到不同的類中。一個只用於令牌,另一個用靜態成員進行動作。

+0

我同意'X'和'O'應該是'static'。製作'playOn()'靜態似乎有問題。 –

+0

@ Code-Guru是的,它可以被重構,我認爲你的意思是讓每個玩家都有自己的動作,但我並不想太多推薦。它的方式並沒有被打破,所以在我的書中沒有問題。 – Radiodef

+0

啊,謝謝你,我認爲它與靜態修飾符有關,但正如你所說,我有點模糊與它的區別。 – user3377319

0

首先,我同意@Radiodef認爲XO應該是static。這將解決您的一些訪問問題。

而且,在我看來,你有兩個變量達到同樣的目的:

private char symbol; 

這モXO指示球員。

private boolean playerTurn; 

的評論明確指出,這也代表了兩種XO

我認爲symbol變量更有用,因爲它在轉彎時擁有準確的字母。如果你使用這個變量,你可以簡化playOn()方法,因爲要記住你將有兩個TTTPlayer對象,每個對象存儲着它們自己的symbol值。

最後,您還需要檢查玩家是否嘗試在已採取的方塊中移動。

+0

是的..我確實看到冗餘。我嘗試用「this.symbol =='X'」替換布爾值,但eclipse表示它不能在靜態上下文中工作。 – user3377319

0

有一個單身人士。你可以做的構造函數(S)私人和私有靜態字段使用它:

private static MySingleton = new MySingleton(); 

然後提供一個訪問getMySingleton()

也使玩家的private代替public如果可以的話;)