Skip to content

Latest commit

 

History

History
37 lines (31 loc) · 7.92 KB

00160.md

File metadata and controls

37 lines (31 loc) · 7.92 KB

Проект: Морской бой

Введение

Пришло время напрячься. Разработка на основе тестов, может поначалу доаставить вам дискомфорт, но чем дальше в лес, тем более естественно это будет для вас. Мы собираемся реализовать классическую игру "Морской бой". Если вы никогда не играли в эту игру или не помните правила, прочитать о ней тут. Вы можете сыграть в онлайн-версию здесь.

Поскольку мы используем TDD, важно, чтобы вы не перегружали себя. Идите шаг за шагом - напишите тест, затем напишите код, который пройдет этот тест.

Мы еще не обсуждали тестирование визуальной части веб-страницы. Для этого требуется отдельный набор инструментов и он выходит за рамки данного курса. В данном проекте сделайте все возможное, чтобы изолировать каждый кусочек функциональной логики приложения от каждого кусочка кода, манипулирующего с DOM. Вы можете использовать моки и убедиться что DOM-методы, такие как appendChild, вызываются. Но! Постарайтесь держать такие методы вне основной логики приложения.

Задание

  1. Начните разработку с создания Фабричной Функции Ship (корабль):
    • Ваши объекты кораблей будут содержать следующую информацию: длину корабля, где корабль был поражен и был ли он потоплен;
    • ЗАПОМНИТЕ вам нужно протестировать только интерфейс вашего объекта. Это те методы или свойства, которые используются за пределами вашего объекта корабля. Напишите для них юнит-тесты;
    • Корабли должны иметь функцию hit(), которая принимает число и затем помечает эту позицию отметкой "попал";
    • isSunk() - функция, которая вычисляет потоплен ли корабль на основании их длины и отметок "попал".
  2. Создайте Фабрику Gameboard (игровая доска каждого игрока):
    • Обратите внимание, что у нас еще нет пользовательского интерфейса. Вы должны понимать, что наш код работает на основе тестов. Вы не должны полагаться на метод console.log или на вывод DOM для проверки работы программы;
    • Объект Gameboard должен иметь возможность размещать корабли на определенных координатах, используя Фабричную Функцию Ship;
    • Объект Gameboard должен иметь функцию receiveAttack, которая принимает пару координат, определяет, попал ли игрок по кораблю и затем использует функцию hit на подорванный корабль. В ином случае receiveAttack сохраняет координаты промаха;
    • Объект Gameboard должен отслеживать промахи для их отображения;
    • Объект Gameboard должен иметь возможность сообщать, были ли потоплены все корабли игрока.
  3. Создайте объект Player.
    • Игроки по очереди ходят, атакуя доску противника;
    • Игра ведется против компьютера, поэтому игрок Компьютер может делать произвольные ходы. ИИ не обязательно должен быть умным, но он должен понимать, является ли данный ход возможным (то есть он не должен атаковать одну и ту же координату дважды).
  4. Создайте основной игровой цикл и модуль для взаимодействия с DOM.
    • В этот момент можно приступить к созданию вашего пользовательского интерфейса;
    • На старте игры создаются игроки (Players) и игровые поля (Gameboard). Но для начала заполните каждую доску (Gameboard) заранее заданными координатами. Позже вы можете внедрить систему, позволяющую игрокам размещать свои корабли;
    • Визуальная часть на HTML остается на вас, но вы должны отобразить обе доски игрока и отобразить их, используя информацию из Gameboard;
    • Вам нужны методы для рендеринга Gameboard и получения пользовательского ввода для атаки. Пусть пользователь нажимает на координату игровой доски противника, чтобы атаковать его;
    • Игровой цикл должен шаг за шагом выполнять ходы игры, используя только методы из других объектов. Если в какой-то момент вы захотите написать новую функцию в игровом цикле, остановитель и выясните, к какому классу или модулю должна принадлежать эта функция;
    • Задайте такие условия, чтобы игра заканчивалась после того, как все корабли одного игрока были потоплены. Эта функция подходит для модуля игры - Game.
  5. В конце.
    • Есть несколько вариантов, как пользователи могут размещать свои корабли. Вы можете позволить им вводить координаты каждого корабля или изучить технологию drag and drop;
    • Вы можете оттачить интеллект компьютерного игрока, заставив его пробовать смежные слоты после "попадания";
    • По желанию, создайте вариант игры для 2 игроков, которая позволяет пользователям по очереди ходить с одного девайса. Если вы собираетесь сделать это, убедитесь, что игра доступна для мобильных устройств. Добавьте экран с кнопкой "Передать ход", чтобы игроки не видели доски друг друга!