Задание
Реализовать компьютерную игру “Ход конем” со следующими правилами. Имеется шахматная доска с конем b1. Игроку предлагается “обскакать” все клетки доски, стремясь минимизировать количество повторных попаданий в одну и ту же клетку. Игра окончена, когда конь посетил все клетки хотя бы по одному разу. Приложение должно вести счет ходов в текущей партии, а также хранить лучший (наименьший) счет текущего пользователя. Завершив игру, пользователь должен иметь возможность сохранить путь коня в файл.
Функционал программы
- Непосредственно игра «Ход конём»
- Подсчет ходов в текущей партии
- Сохранение параметров (рекорды, настройки) при перезапуске игры для каждого пользователя
- Запись пути коня в файл
- Справочное окно
Содержание отчета к программе
В отчете 30 страниц.
- Введение
- Задание на курсовую работу
- Постановка задачи
- Теоретическая часть
- Общие сведения
- Функциональное назначение
- Структура решения
- Описание программного интерфейса
- Описание внетреннего взаимодействия
- Проектная часть
- Заключение
- Список использованных источников
- Приложение 1. Chessboard.cs
- Приложение 2. MainForm.cs
- Приложение 3. GameControl.cs
- Приложение 4. ChessboardControl.cs
Фрагмент программного кода
/// <summary> /// Данный элемент управления выполняет следующие задачи /// <list type="number"> /// <item>Визуализация состояния игровой модели пользователю</item> /// <item>Получение команд на перемещение коня и передача их игровой модели</item> /// </list> /// </summary> public partial class ChessboardControl : UserControl { private readonly Coordinate occupiedCoordinate = new Coordinate("b1"); // координата клетки, где сейчас конь private SquareControl occupiedSquare; // сама клетка, где сейчас конь private List<SquareControl> destinationSquares = new List<SquareControl>(); // клетки, в которые конь может пойти public ChessboardControl() { InitializeComponent(); destinationSquares.AddRange(new[] // в начале игры, конь - в b1 { a3SquareControl, c3SquareControl, d2SquareControl }); } // свойство для возврата координаты клетки, в которой находится конь из переменной; используется для оптимизации private SquareControl OccupiedSquare => occupiedSquare ?? (occupiedSquare = Controls.OfType<SquareControl>().Single(sc => sc.Coordinate == occupiedCoordinate)); // получает и возвращает координату клетки, в которой находится конь; при установке координаты: конь снимается со своей клетки и помещается в новую + увеличивается счет public Coordinate OccupiedCoordinate { get => occupiedCoordinate; set { occupiedCoordinate.Assign(value); OccupiedSquare.Mode = SquareMode.Clean; occupiedSquare = Controls.OfType<SquareControl>().Single(sc => sc.Coordinate == value); occupiedSquare.Mode = SquareMode.Occupied; occupiedSquare.Score++; } } // свойство для доступа к переменной, хранящей список клеток, в которые может пойти конь; особенно интересна установка: очищает все клетки, в которые конь мог пойти из предыдущей клетки и устанавливает новые // согласно текущей клетке, в которой сейчас (после совершения хода) находится конь public IEnumerable<Coordinate> DestinationCoordinates { get => destinationSquares.Select(ds => new Coordinate(ds.Coordinate)); set { foreach (var square in destinationSquares.Where(ds => ds.Mode != SquareMode.Occupied)) { square.Mode = SquareMode.Clean; } destinationSquares = value.Select(d => Controls.OfType<SquareControl>().Single(c => c.Coordinate == d)).ToList(); destinationSquares.ForEach(ds => ds.Mode = SquareMode.Destination); } } // событие, которое происходит при ходе конем; используется в родительских контролах [Browsable(true), Category(Constant.Miscellaneous.Name)] public event MoveKnightEventHandler MoveKnight; // генерация события MoveKnight (вызов обработчиков) protected virtual void OnMoveKnight(MoveKnightEventArgs e) { if (MoveKnight != null) { MoveKnight(this, e); } } // обработчик щелчка пользователя по клетке шахматной доски private void SquareControl_Click(object sender, System.EventArgs e) { var destination = (SquareControl)sender; // щелкнутая клетка if (destination.Mode != SquareMode.Destination) { return; // если в эту клетку нельзя пойти, то ничего не произойдет } OnMoveKnight(new MoveKnightEventArgs { DestinationCoordinate = destination.Coordinate }); // генерируем событие хода; оно обработается в родительском контроле => изменяется данные => обновится доска } // сброс игры в начальное состояние, используется для обработки команды меню Игра→Заново public void Reset() { foreach (var control in Controls.OfType<SquareControl>()) { control.Mode = SquareMode.Clean; control.Score = 0; } } }
Скриншот архива с проектом
Пояснения по запуску программы
Прежде всего, распакуйте полученный архив. Я разрабатывал в Visual Studio Community 2022 под .NET Framework 4.7.2. Определенная совместимость вперед-назад по среде разработке и платформе, естественно, имеется, но проще использовать то же самое (разве что Visual Studio можно взять не Community, а Professional, если есть :p).
Загрузите решение KinightMove.sln (из директории KnightMove-main) в Visual Studio. Для работы с файлами используются NuGet-пакеты, их надо скачать. Для этого в Solution Explorer (Ctrl-Alt-L) щелкните правой кнопкой по решению и, далее, Restore NuGet Packages.
Запускать нужно проект WinApp: в Solution Explorer его название должно иметь полужирное начертание. В принципе это так и есть, но вдруг... Тогда нужно сделать щелчок правой кнопкой мыши по WinApp и выбрать Set as Startup Project.
Запускается стандартно, кнопкой Start (F5).
Правила игры – F1. Вкратце: нужно щелкать по клеткам доски для перемещения коня, чтобы во всех клетках появилась зеленая галочка.
lecadier