访问公共对象变量

时间:2014-03-04 03:06:28

标签: java oop singleton public

我正在编写一个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;
   }
}

3 个答案:

答案 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

如果你不熟悉实例和静态之间的区别(有些人不是),可以考虑将这两者分成不同的类。一个只用于令牌,另一个用于静态成员进行移动。

答案 1 :(得分:0)

首先,我同意@Radiodef XO应该static。这将解决您的一些访问问题。

另外,在我看来,你有两个用于同一目的的变量:

private char symbol;

这包含XO来表示播放器。

private boolean playerTurn;

评论明确指出,这也代表XO

我认为symbol变量更有用,因为它保留了转弯时使用的确切字母。如果您使用此变量,则可以大大简化playOn()方法,请记住,您将拥有两个TTTPlayer个对象,每个对象都存储自己的symbol值。

最后,您还需要检查玩家是否尝试移动已经占用的方格。

答案 2 :(得分:0)

拥有单身人士。您可以将构造函数设置为私有,并在私有静态字段中使用它:

private static MySingleton = new MySingleton();

然后提供一个访问者getMySingleton()

如果可以的话,还可以让玩家private代替public;)