As you read through the ships model and controller, I'm sure you can find areas for improvement. For example, the way I've written the switches for understanding whether the ship was in our fleet or the enemy fleet is a bit rigid: it wouldn't be able to accommodate three separate fleets in one battle. Every programmer creates technical debt, or small errors or inefficiencies in code. This then necessitates refactoring, the practice of altering code to make it better. Don't be fooled into thinking you've ever written The Perfect Program—such a thing does not exist. Improvement and continual iteration are part of the programming process.
There is a major caveat to refactoring, however, and that's something often called a contract. When designing a backend designed to be used by the frontend, and when different parties are writing different parts of a system, it's important to be in sync with each other and the premise and needs...