/
ylust
/
Study
Обзор
Документация
Войти
/
ylust
/
Study
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
EightQueensGUI/Form1.cs
259 строк
10 KB
User
Add GUI for Eight Queens problem with improved button layout
22 май 2026, 23:38
22 май 2026, 23:38
99d86a3
Код
Авторство
О чём код?
using System; using System.Drawing; using System.Windows.Forms; namespace EightQueensGUI; /// <summary> /// Основная форма приложения для визуализации решения задачи о восьми ферзях /// </summary> public partial class Form1 : Form { /// <summary> /// Решатель задачи о восьми ферзях /// </summary> private QueenSolver queenSolver; /// <summary> /// Размер клетки на шахматной доске в пикселях /// </summary> private const int CellSize = 60; /// <summary> /// Цвет светлой клетки /// </summary> private readonly Color LightCellColor = Color.Beige; /// <summary> /// Цвет темной клетки /// </summary> private readonly Color DarkCellColor = Color.SaddleBrown; /// <summary> /// Конструктор формы /// Инициализирует компоненты и настраивает форму /// </summary> public Form1() { InitializeComponent(); InitializeForm(); queenSolver = new QueenSolver(); UpdateDisplay(); } /// <summary> /// Инициализирует настройки формы /// </summary> private void InitializeForm() { this.Text = "Задача о восьми ферзях"; this.StartPosition = FormStartPosition.CenterScreen; this.FormBorderStyle = FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.MinimizeBox = true; this.ClientSize = new Size(8 * CellSize + 20, 8 * CellSize + 100); this.Paint += Form1_Paint; // Создаем и настраиваем кнопки CreateButtons(); // Создаем и настраиваем метку для отображения номера решения CreateSolutionLabel(); } /// <summary> /// Создает кнопки управления /// </summary> private void CreateButtons() { // Кнопка "Предыдущее решение" Button previousButton = new Button { Text = "← Предыдущее", Size = new Size(120, 40), Location = new Point(20, 8 * CellSize + 20) }; previousButton.Click += PreviousButton_Click; this.Controls.Add(previousButton); // Кнопка "Следующее решение" Button nextButton = new Button { Text = "Следующее →", Size = new Size(120, 40), Location = new Point(350, 8 * CellSize + 20) }; nextButton.Click += NextButton_Click; this.Controls.Add(nextButton); // Кнопка "Первое решение" Button firstButton = new Button { Text = "Первое", Size = new Size(80, 30), Location = new Point(150, 8 * CellSize + 20) }; firstButton.Click += FirstButton_Click; this.Controls.Add(firstButton); // Кнопка "Последнее решение" Button lastButton = new Button { Text = "Последнее", Size = new Size(80, 30), Location = new Point(250, 8 * CellSize + 20) }; lastButton.Click += LastButton_Click; this.Controls.Add(lastButton); } /// <summary> /// Создает метку для отображения информации о текущем решении /// </summary> private void CreateSolutionLabel() { Label solutionLabel = new Label { Name = "lblSolutionInfo", Size = new Size(300, 20), Location = new Point(3 * CellSize - 50, 8 * CellSize + 70), TextAlign = ContentAlignment.MiddleCenter, Font = new Font("Arial", 10, FontStyle.Bold) }; this.Controls.Add(solutionLabel); } /// <summary> /// Обработчик события нажатия на кнопку "Предыдущее решение" /// </summary> /// <param name="sender">Источник события</param> /// <param name="e">Аргументы события</param> private void PreviousButton_Click(object sender, EventArgs e) { queenSolver.PreviousSolution(); UpdateDisplay(); } /// <summary> /// Обработчик события нажатия на кнопку "Следующее решение" /// </summary> /// <param name="sender">Источник события</param> /// <param name="e">Аргументы события</param> private void NextButton_Click(object sender, EventArgs e) { queenSolver.NextSolution(); UpdateDisplay(); } /// <summary> /// Обработчик события нажатия на кнопку "Первое решение" /// </summary> /// <param name="sender">Источник события</param> /// <param name="e">Аргументы события</param> private void FirstButton_Click(object sender, EventArgs e) { queenSolver.SetSolution(0); UpdateDisplay(); } /// <summary> /// Обработчик события нажатия на кнопку "Последнее решение" /// </summary> /// <param name="sender">Источник события</param> /// <param name="e">Аргументы события</param> private void LastButton_Click(object sender, EventArgs e) { queenSolver.SetSolution(queenSolver.GetSolutionsCount() - 1); UpdateDisplay(); } /// <summary> /// Обновляет отображение на форме /// </summary> private void UpdateDisplay() { // Обновляем метку с информацией о решении Label solutionLabel = (Label)this.Controls.Find("lblSolutionInfo", false)[0]; int solutionCount = queenSolver.GetSolutionsCount(); int currentSolution = queenSolver.GetSolutionsCount() > 0 ? 1 : 0; // Так как все решения хранятся в списке, нужно определить индекс текущего решения // Простое решение - использовать currentSolutionIndex из QueenSolver, но он приватный // Поэтому мы будем использовать тот факт, что решения добавляются последовательно // и просто покажем номер текущего индекса solutionLabel.Text = $"Решение {(queenSolver.GetSolutionsCount() > 0 ? queenSolver.GetCurrentSolutionIndex() + 1 : 0)} из {solutionCount}"; // Принудительно перерисовываем форму this.Invalidate(); } /// <summary> /// Обработчик события отрисовки формы /// </summary> /// <param name="sender">Источник события</param> /// <param name="e">Аргументы события с контекстом графики</param> private void Form1_Paint(object sender, PaintEventArgs e) { DrawChessboard(e.Graphics); DrawQueens(e.Graphics); } /// <summary> /// Рисует шахматную доску /// </summary> /// <param name="g">Контекст графики для рисования</param> private void DrawChessboard(Graphics g) { for (int row = 0; row < 8; row++) { for (int col = 0; col < 8; col++) { // Определяем цвет клетки (чередование) Color cellColor = (row + col) % 2 == 0 ? LightCellColor : DarkCellColor; // Рисуем клетку using (SolidBrush brush = new SolidBrush(cellColor)) { g.FillRectangle(brush, col * CellSize + 10, row * CellSize + 10, CellSize, CellSize); } // Рисуем рамку вокруг клетки using (Pen pen = new Pen(Color.Black)) { g.DrawRectangle(pen, col * CellSize + 10, row * CellSize + 10, CellSize, CellSize); } } } } /// <summary> /// Рисует ферзей на шахматной доске /// </summary> /// <param name="g">Контекст графики для рисования</param> private void DrawQueens(Graphics g) { int[] currentSolution = queenSolver.GetCurrentSolution(); if (currentSolution == null) return; using (SolidBrush queenBrush = new SolidBrush(Color.Black)) { using (Font queenFont = new Font("Arial", CellSize * 0.7f, FontStyle.Bold)) { for (int row = 0; row < 8; row++) { int col = currentSolution[row]; // Позиция для текста "Q" в центре клетки string queenText = "Q"; SizeF textSize = g.MeasureString(queenText, queenFont); float x = col * CellSize + 10 + (CellSize - textSize.Width) / 2; float y = row * CellSize + 10 + (CellSize - textSize.Height) / 2; // Рисуем текст "Q" в центре клетки g.DrawString(queenText, queenFont, queenBrush, x, y); } } } } }