Skip to content

КФУ 2 курс. Семестровая работа - Игра Морской бой с ПК

Notifications You must be signed in to change notification settings

Cregennan/Sea-Battle

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Морской Бой

Описание

Третий проект из трёх по программированию на 3 семестре.

Структура проекта

Класс Описание
GameEngine.cs Определяет все строки, константы, цвета и пути проекта
GameField.cs Реализует движок игры, полностью отделенный от графической части
ISolver.cs Интерфейс для всех типов искусственного интеллекта игры
AIPureRandom.cs Реализует легкий режим игры (Тупой интеллект)
AIIntellectual.cs Реализует сложный режим игры (Очень умный интеллект)
Окно Описание
GameWindow Главное окно игры, в него подгружается заранее сгенерированное поле игрока и противника
InitWindow Главное меню игры с выбором сложности
ManualPlaceShipsWindow Окно редактора игрового поля
PlayerWonWindow Окно результата игры (выигрыш, проигрыш)
Tutorial Туториал к игре

Описание

Главной целью было сделать так, чтобы движок игры и графика были как можно больше отделены друг от друга. Движок выделен в отдельный класс, общение к окном происходит через вызовы таких методов как GameField.RemoveShip, GameField.PlaceShip и т.д.

После обновления игрового поля, окно может (а может и нет) запросить у поля его состояние и уже само определить то, как оно будет отрисовано. Благодаря такому разделению, экземпляр движка игры создается в окне редактора и передается как параметр в окно игры. В свою очередь, окно игры рисует в одном поле состояние поля игрока, в другом поле - состояние поля компьютера (далее Противника). Поле противника это такой-же экземпляр класса GameField, но со случайной генерацией кораблей.

Искусственный - да, интеллект - нет

Вся реализация работы ИИ строится на интерфейсе ISolver. В зависимости от сложности игры, фабрика AIFactory возвращает одну из реализаций ISolver. Далее, в зависимости от хода игрока или противника вызывается или ISolver.MakeStep(), или GameEngine.PerformAttack(Point p). Оба метода возвращают кортеж из int и List<Point>, где первое значение отражает результат атаки, а второе - точки поля, которые эта атака затронула. Таким образом отрисовщику нужно будет опрашивать только затронутые клетки поля (и их соседей), а не всё поле. Экономия ресурсов.

Что можно было сделать лучше

После каждого хода отрисовщик вызывается вручную. Можно было в экземпляре поля вызывать событие его изменения, а в классе окна подписывать на него отрисовщик. Тогда больше не пришлось бы вообще больше думать о правильной отрисовке поля после каждого действия.

About

КФУ 2 курс. Семестровая работа - Игра Морской бой с ПК

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages