我正在编写一个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 :(得分:0)
我认为你在这里缺少的是静态修饰符。
静态成员属于该类,它们存在一种全局存在(尽管它们不一定全局可访问)。您可以通过引用该类来访问它们,例如out
是类System
的静态成员,因此System.out
。
使用new
创建新对象时,它是一个唯一的实例,并且包含实例成员。 out
实际上是PrintStream
的对象实例,所以当您说out.println
时,println
是实例方法。
其他一些语言允许您在某种全局命名空间中声明函数和事物,但Java没有这些,所有内容都必须在类中。所以我们有静态成员。
此处,X
和O
是静态成员,例如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
。同样,使用X
和O
等类的名称访问TTTPlayer.X
和TTTPlayer.O
。
如果你不熟悉实例和静态之间的区别(有些人不是),可以考虑将这两者分成不同的类。一个只用于令牌,另一个用于静态成员进行移动。
答案 1 :(得分:0)
首先,我同意@Radiodef X
和O
应该static
。这将解决您的一些访问问题。
另外,在我看来,你有两个用于同一目的的变量:
private char symbol;
这包含X
或O
来表示播放器。
private boolean playerTurn;
评论明确指出,这也代表X
或O
。
我认为symbol
变量更有用,因为它保留了转弯时使用的确切字母。如果您使用此变量,则可以大大简化playOn()
方法,请记住,您将拥有两个TTTPlayer
个对象,每个对象都存储自己的symbol
值。
最后,您还需要检查玩家是否尝试移动已经占用的方格。
答案 2 :(得分:0)
拥有单身人士。您可以将构造函数设置为私有,并在私有静态字段中使用它:
private static MySingleton = new MySingleton();
然后提供一个访问者getMySingleton()
如果可以的话,还可以让玩家private
代替public
;)