Ну, один из способов улучшить это - выбрать направление движения корабля V или H, а затем использовать только ту часть доски, в которую он будет вписываться, так что если у корабля 4 длины и в вертикуле используются только ряды 1-7 (из 10-рядной доски) для начальной точки вертикали. Тогда вам не нужно проверять, подходит ли он вообще.
Глядя на код, я не вижу, где баллы присваиваются в
points[j].x = x;
points[j].y = (y + j);
очищается, если корабль недействителен. Насколько я вижу, массив точек может заполняться неверными точками.