Задание
Реализовать компьютерную игру “Ход конем” со следующими правилами. Имеется шахматная доска с конем 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. Вкратце: нужно щелкать по клеткам доски для перемещения коня, чтобы во всех клетках появилась зеленая галочка.
Телеграм
-