Это задавали как вопрос для интервью.
Разработайте 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. Хорошо ли это делать здесь? Я чувствую, что над этим можно что-то сделать.
Любые недостатки, улучшения дизайна будут оценены.