0

我正在学校做一个项目。我找到了很多循环遍历枚举值的方法,但是在我的所有搜索中,我还没有找到一种循环遍历一组包含枚举值的变量的方法。

一些背景:该项目是一个井字游戏。我们获得了枚举和一组我们需要创建以完成项目的方法。我们不允许更改方法签名,并且必须使其在提供的构造中工作。我们也仅限于迄今为止在课堂上学到的东西,这意味着列表映射和数组不是一个选项。枚举包含 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。我正要写一个巨大的条件语句,虽然我确信它会起作用,但必须有更好的方法。经过大约半小时的搜索 - 我在这里。任何帮助,将不胜感激。

4

3 回答 3

0

没有 9 个单独的位置变量。有一个大小为 9 的数组。

private Marker positions = new Marker[9]; 

...

然后在你使用它们之前 -

Arrays.fill(positions,Marker.EMPTY);

...

然后

for (Marker position : positions) {
   ...
}
于 2013-11-06T03:13:27.210 回答
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,可能是有序集合) :

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 );
}
于 2013-11-06T03:09:06.040 回答
0

如果您有一个由 9 个 Marker 对象组成的数组,或者甚至是一个由 3 x 3 Marker 对象组成的二维数组,您将能够遍历它们。

否则,您可以使用反射来查找 Marker 类型的所有变量,但这可能超出了您的类的范围。

于 2013-11-06T03:10:24.350 回答