【问题标题】:How to describe a state with three items如何用三项来描述一个状态
【发布时间】:2018-11-27 11:31:30
【问题描述】:

我正在用 Java 创建棋盘游戏井字游戏。

一个单元格将具有三种状态:空、X 或 O。

用 Java 表示这一点的最佳做法是什么?我应该创建自己的 Cell 类还是只使用整数 (0/1/2) 来表示三种状态?如果它有两个状态,那么我可以使用例如 boolean 来表示这两个状态,对于具有三个状态的东西是否有类似的已定义类?

【问题讨论】:

  • 请注意,您所说的单元格实际上只是单元格的可能内容值。一个单元格是板上的一个位置,对于 TTT,您有 9 个单元格。命名很重要,尤其是出于代码可读性目的。
  • Bool of course ;-)

标签: java


【解决方案1】:

我会为此使用枚举:

enum CellState {
    EMPTY,
    X,
    O
}

然后在你的代码中:

public static void main(String[] args) {
    CellState[][] cellStates = new CellState[3][3];
    cellStates[0][0] = CellState.X;

    // Do other stuff

}

我刚刚将板结构定义为CellState[][] 作为示例,但这可以是任意的。

【讨论】:

    【解决方案2】:

    使用 OO 语言时最重要的一点是对象对行为进行建模,并在可能的情况下包含实现行为所需的数据。行为是对象所做的,而不是对它们所做的。

    因此,除非有理由在您未说明的要求中说明,否则单元格本身没有任何行为,它只是玩家标记的地方。

    所以你可以有一个简单的标记数组,两个玩家都更新,一个包含三个值的枚举,或者你可以让每个玩家更新他们自己的标记数据,在这种情况下,每个玩家都会有一个布尔数组或一个简短的位掩码来指示他们的去向。在后一种情况下,每个玩家只改变他们自己的“goes”状态并且可以针对他们的获胜条件执行测试而不是共享状态 - 唯一的共享是他们必须询问其他玩家选择的单元格是否有效.这取决于您希望您的设计有多严格的面向对象,这是否是“最佳实践”——对于这样一个简单的问题,您可以用 COBOL 编写,用户也会很高兴。

    【讨论】:

    • 正如你所说,在一个设计合理的类中,类如何存储每个单元格的状态应该无关紧要,也不应该对类外的任何东西可见。
    【解决方案3】:

    我会使用枚举:

    public enum CellState {
        EMPTY,
        X,
        O;
    }
    

    还有一个具有CellState 类型字段的 Cell 类

    【讨论】:

      【解决方案4】:

      您可以使用包含三个值的枚举,例如:

      public enum CellState {
          EMPTY,
          X,
          O
      }
      

      并像这样使用它:

      board.setCell(cellposition, CellState.X);
      

      【讨论】:

        【解决方案5】:

        有多种方法,但在这种情况下,我更喜欢使用枚举来表示您的状态。

        public enum State {
            EMPTY,
            X,
            O
        }
        

        然后您的单元格类将如下所示。

        public class Cell {
            private State state;
        
            public Cell(State state) {
                this.state = state;
            }
        
            public State getState {
                return state;
            }
        
            public void setState(State state) {
                this.state = state;
            }
        
        }
        

        【讨论】:

          【解决方案6】:

          另一种方法就是使用Boolean 对象并使用null 作为第三状态。

          Boolean state = null; // => empty state
          state = Boolean.TRUE // => X state
          state = Boolean.FALSE // => O state
          

          【讨论】:

          • 在失败案例以外的任何情况下使用空值是bad idea
          • 另外Boolean state; 是错误的,它不是“空”而是未初始化
          • 这取决于编程世界中的所有内容。如果他想要一些快速的东西,而不必添加额外的类、枚举等,这将带来额外的逻辑来处理它们和测试,他可以在他的游戏中使用这种方法。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-31
          • 1970-01-01
          • 1970-01-01
          • 2022-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多