Третий проект из трёх по программированию на 3 семестре.
Класс | Описание |
---|---|
GameEngine.cs | Определяет все строки, константы, цвета и пути проекта |
GameField.cs | Реализует движок игры, полностью отделенный от графической части |
ISolver.cs | Интерфейс для всех типов искусственного интеллекта игры |
AIPureRandom.cs | Реализует легкий режим игры (Тупой интеллект) |
AIIntellectual.cs | Реализует сложный режим игры (Очень умный интеллект) |
Окно | Описание |
---|---|
GameWindow | Главное окно игры, в него подгружается заранее сгенерированное поле игрока и противника |
InitWindow | Главное меню игры с выбором сложности |
ManualPlaceShipsWindow | Окно редактора игрового поля |
PlayerWonWindow | Окно результата игры (выигрыш, проигрыш) |
Tutorial | Туториал к игре |
Главной целью было сделать так, чтобы движок игры и графика были как можно больше отделены друг от друга. Движок выделен в отдельный класс, общение к окном происходит через вызовы таких методов как GameField.RemoveShip
, GameField.PlaceShip
и т.д.
Вся реализация работы ИИ строится на интерфейсе ISolver
.
В зависимости от сложности игры, фабрика AIFactory
возвращает одну из реализаций ISolver
. Далее, в зависимости от хода игрока или противника вызывается или ISolver.MakeStep()
, или GameEngine.PerformAttack(Point p)
. Оба метода возвращают кортеж из int
и List<Point>
, где первое значение отражает результат атаки, а второе - точки поля, которые эта атака затронула. Таким образом отрисовщику нужно будет опрашивать только затронутые клетки поля (и их соседей), а не всё поле. Экономия ресурсов.
После каждого хода отрисовщик вызывается вручную. Можно было в экземпляре поля вызывать событие его изменения, а в классе окна подписывать на него отрисовщик. Тогда больше не пришлось бы вообще больше думать о правильной отрисовке поля после каждого действия.