回顾我的设计:使用面向对象方法的Tic tac toe游戏

Vin*_*C M 10 java oop class-design

这是一个面试问题.

使用面向对象原则设计一个tic tac toe.采访者说他对逻辑不感兴趣,他只想要设计.我给出了如下设计,但我并不完全满意.如果有任何建议/改进,请告诉我.

面试官对两件事非常讲究

  1. 该游戏可以播放nxn方格.
  2. 游戏规则应与应用程序的其余部分分开.

我的方法:

  1. Tic tac toe是一款棋盘游戏(Game object,Board object)
  2. 板由一组正方形(方形物体)组成
  3. 正方形可以标记为X或O.
  4. 两个玩家玩游戏(人类和计算机类实现玩家界面)
  5. 放置X或O后,GameEngine(GameEngine对象)决定游戏是否结束(抽奖或玩家赢了)或者它仍在
  6. 如果游戏仍然开启,则另一位玩家轮到他了.
  7. 对于计算机播放器,GameEngine会找出下一件作品的位置.

类的粗略草图.

 interface Player {
    Player takeTurn();
  void markNextBox();
  }
Run Code Online (Sandbox Code Playgroud)

.

 public class TicTacToeGameEngine implements GameRule{
@Override
public Boolean isWinner(Game game) {
        // Check winner logic
        return false;
}

@Override
public Square locateSquareToMark(Game game) {
    List<Square> squares= game.getBoard().getFilledSquares();
    //go through the list of squares and figure out a square to mark
    return square;
    }
 }
Run Code Online (Sandbox Code Playgroud)

.

  public class Computer implements Player {
GameRule g = new TicTacToeGameEngine();
@Override
public void markNextBox() {
    g.locateSquareToMark(game);
}
@Override
public Player takeTurn() {
    // TODO Auto-generated method stub
    return null;
}
 }
Run Code Online (Sandbox Code Playgroud)

.

 public interface GameRule {
    Boolean isWinner(Game game);
    Square locateSquareToMark(Game game);
     }
Run Code Online (Sandbox Code Playgroud)

//类似于Human的实现

现在我在这个设计中遇到的困难是

  1. 玩家是否需要了解GameEngine?
  2. 如果游戏仍然开启,如何将控制传递给下一个玩家.(如何实现takeTurn())
  3. 我最初认为Game对象应该保持状态.如果你看一下Computer类,我将游戏对象传递给GameEngine.这样做好吗?我觉得可以做些更好的事情.

任何缺陷,改进设计将不胜感激.