我正在学校开展一个项目。我发现了很多循环枚举值的方法,但是在我的所有搜索中,我都没有找到一种方法来循环一组包含枚举值的变量。
某些背景:该项目是TicTacToe游戏。我们获得了枚举和一组我们需要创建的方法来完成项目。我们不允许更改方法签名,并且必须使其在提供的构造中工作。我们也限于目前为止我们在课堂上学到的东西,这意味着列表地图和数组不是一个选项。枚举包含3个值 - X,O和EMPTY。然后我们有9个变量代表游戏板上的9个位置。
public enum Marker
{
EMPTY,
X,
O
};
private static Marker position1 = Marker.EMPTY;
private static Marker position2 = Marker.EMPTY;
private static Marker position3 = Marker.EMPTY;
private static Marker position4 = Marker.EMPTY;
private static Marker position5 = Marker.EMPTY;
private static Marker position6 = Marker.EMPTY;
private static Marker position7 = Marker.EMPTY;
private static Marker position8 = Marker.EMPTY;
private static Marker position9 = Marker.EMPTY;
private static Marker turn = Marker.X;
我正在研究一种检查是否存在平局的方法。所以,我需要遍历位置变量并测试每个变量!= Marker.EMPTY。我准备写一个巨大的条件声明,虽然我确信它会起作用,但必须有一个更好的方法。经过大约半小时的搜索 - 我在这里。任何帮助将不胜感激。
答案 0 :(得分:0)
如果你真的不能使用任何类型的集合,你可能想要使用一些布尔运算符。即,类似以下内容。如果没有任何职位是Marker.EMPTY
,则董事会已满,因此您只需返回position1 != Marker.EMPTY && position2 != Marker.EMPTY && ...;
即可。它并不是那么漂亮,但它仍然比大if/else if/.../else
块更简洁。
private static boolean isBoardFull() {
return position1 != Marker.EMPTY &&
position2 != Marker.EMPTY &&
position3 != Marker.EMPTY &&
position4 != Marker.EMPTY &&
position5 != Marker.EMPTY &&
position6 != Marker.EMPTY &&
position7 != Marker.EMPTY &&
position8 != Marker.EMPTY &&
position9 != Marker.EMPTY ;
}
你也可以把它写成“如果不是某个位置是空的,那么董事会已经满了”:
private static boolean isBoardFull() {
return !( position1 == Marker.EMPTY ||
position2 == Marker.EMPTY ||
position3 == Marker.EMPTY ||
position4 == Marker.EMPTY ||
position5 == Marker.EMPTY ||
position6 == Marker.EMPTY ||
position7 == Marker.EMPTY ||
position8 == Marker.EMPTY ||
position9 == Marker.EMPTY );
}
如果有其他可用的东西,有一些选项会更合适。例如,您可以在包含位置的数组上使用for
循环? (你实际上可以使用一个数组,或任何实现Iterable的东西。)例如,如果你仍然需要九个变量:
private static Marker position1 = Marker.EMPTY;
private static Marker position2 = Marker.EMPTY;
private static Marker position3 = Marker.EMPTY;
private static Marker position4 = Marker.EMPTY;
private static Marker position5 = Marker.EMPTY;
private static Marker position6 = Marker.EMPTY;
private static Marker position7 = Marker.EMPTY;
private static Marker position8 = Marker.EMPTY;
private static Marker position9 = Marker.EMPTY;
private static Marker positions[] = new Marker[] { position1, position2, position3,
position4, position5, position6,
position7, position8, position9 };
private static boolean isBoardFull() {
for ( Marker position : positions ) {
if ( position == Marker.EMPTY ) {
return false;
}
}
return true;
}
理想情况下,你不会有九个变量,并且你想要的东西不需要事先知道位置的数量,你只需要使用数组(或其他Iterable,可能是ordered Collection):
private static Marker positions[9];
static {
for ( int i=0; i < positions.length; i++ ) {
positions[i] = Marker.EMPTY;
}
}
更好的是,如果你可以使用像List这样的Collection,你甚至不需要编写迭代,你只需要使用Collection.contains:
private static List<Marker> positions = /* ... */;
private static boolean isBoardFull() {
return !positions.contains( Marker.EMPTY );
}
答案 1 :(得分:0)
如果你有一个包含9个Marker对象的数组,或者甚至是3 x 3 Marker对象的2维数组,你就可以遍历它们。
否则你可以使用反射来查找Marker类型的所有变量,但这可能超出了你的范围。
答案 2 :(得分:0)
没有9个单独的位置变量。有一个大小为9的数组。
private Marker positions = new Marker[9];
...
然后才使用它们 -
Arrays.fill(positions,Marker.EMPTY);
...
以后
for (Marker position : positions) {
...
}