Просмотрите мой дизайн: игра Tic Tac Toe с использованием методологии OO

Это задавали как вопрос для интервью.

Разработайте tic tac toe с использованием объектно-ориентированных принципов. Интервьюер сказал, что его не интересует логика, и он хочет только дизайн. Я дал дизайн, как показано ниже, но я не был полностью удовлетворен. Пожалуйста, дайте мне знать, если есть какие-либо предложения/улучшения.

Интервьюер очень подробно рассказал о двух вещах

  • Игра может быть сыграна для n x n квадратов.
  • Правила игры должны быть отделены от остальной части приложения.

Мой подход:

  • Tic tac toe - настольная игра (игровой объект, объект Board).
  • Совет состоит из массива квадратов (квадратный объект)
  • Квадраты могут быть помечены как X или O.
  • Два игрока играют в игру (классы "Человек" и "Компьютер" реализуют интерфейс проигрывателя).
  • Когда X или O помещается, GameEngine (объект GameEngine) решает, является ли игра (ничья или выигранный игрок) или все еще на
  • Если игра по-прежнему включена, другому игроку дают свой ход.
  • Для проигрывателя компьютеров GameEngine определяет, где найти следующий фрагмент.

Грубый эскиз классов.

 interface Player {
    Player takeTurn();
  void markNextBox();
  }

.

 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;
    }
 }

.

  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;
}
 }

.

 public interface GameRule {
    Boolean isWinner(Game game);
    Square locateSquareToMark(Game game);
     }

//Подобная реализация для Human

Теперь трудности, которые я нашел в этом проекте,

  • Должен ли игрок знать об GameEngine?
  • Как передать управление следующему игроку, если игра еще включена. (Как реализовать takeTurn())
  • Сначала я решил, что объект Game должен содержать состояние. Если вы посмотрите на класс Computer, я передаю игровой объект GameEngine. Хорошо ли это делать здесь? Я чувствую, что над этим можно что-то сделать.

Любые недостатки, улучшения дизайна будут оценены.