Какие недочеты вы скажете по коду?
Высокая цикломатическая сложность подобного кода. Бизнес-логика смешивается с DOM. Практически весь код дублируется.
Такой код сложно поддерживать. Сложно читать. Сложно тестировать. Это действительно слабо. Всё же мы пишем для людей, а не для компьютера. Написать сложный код, очень просто. Написать простой код, очень сложно.
Меня смущает этоlet ships = {
    'OneShip': 4,
    'TwoShip': 3,
    'ThreeShip': 2,
    'FourShip': 1
};
Я бы декомпозировал метод function init(startgame) { на мелкие т.к не понятно что происходит в таких конструкциях  computer.getBattlegroundArray().forEach(element => {
из нейминга мелких методов стало бы очевиднее .
вообщем над неймингом работать и не писать всё в кучу.
возможно вам ЧСВ ревьювер попался и всё.