-
Notifications
You must be signed in to change notification settings - Fork 0
Глава 3. Реализация программного решения
В данной главе будет описана работа системы, приведены рисунки программы и кода с пояснениями. Так же будут рассмотрены использованные библиотеки и модули.
При входе в приложение пользователя встречает меню (рисунок 5), где игрок сможет выбрать уровень сложности для решения судоку, изучить свои статистические данные и начать игру.
Рисунок 5. Меню приложения. Когда приложение загрузиться, устанавливаются стандартные и неизменяемые настройки для формы – это заголовок, задний фон, иконка приложения, возможность свертывания программы. Так же сразу после загрузки приложения, включается анимация, которая реализована с помощью делегата EventHandler[11] и класса Timer[12]. Благодаря анимации окно меню появляется и исчезает плавно. Код, который реализовывает выше перечисленное, можно наблюдать на Листинге 1. public Form1() { InitializeComponent(); //Анимация появления формы: Opacity = 0; Timer timer = new Timer(); timer.Tick += new EventHandler((sender, e) => { if ((Opacity += 0.05d) == 1) timer.Stop(); }); timer.Interval = 20; timer.Start();
//Стандартные и неизменяемые настройки для формы
//(расширение формы, заголовок, задний фон, иконка):
MaximizeBox = false;
this.Text = "Судоку - головоломка с числами.";
Icon icon = new Icon(@"pic/icon.ico");
this.Icon = icon;
var rand = new Random();
this.BackgroundImage = Image.FromFile(@"pic/background_001.jpg");
}
Листинг 1. - Загрузочный метод главного меню.
При нажатии пользователем кнопки «Играть» запускается анимация исчезновения формы, запоминается выбранный уровень сложности и реализуется переход на окно решения головоломки – Листинг 2. private void pictureBox5_Click(object sender, EventArgs e) { //Установка уровня сложности, взависимости от выбора игрока //(легкий уровень сложности, нормальный уровень сложности, трудный уровень сложности): if (radioButton_easy.Checked) level = 1; if (radioButton_normal.Checked) level = 2; if (radioButton_hard.Checked) level = 3;
//Анимация исчезновения формы, и переход на форму игры:
for (int i = 0; i < 10; i++)
{
Thread.Sleep(20);
this.Opacity = this.Opacity - 0.1;
}
this.Hide();
Form2 FormGame = new Form2(level);
FormGame.StartPosition = FormStartPosition.Manual;
FormGame.Location = Location;
FormGame.Show();
}
Листинг 2. - Метод обрабатывания нажатия кнопки «Играть».
Когда пользователь нажимает кнопку «Информация», перед ним появляется текстовое окно[13], в котором он сможет узнать, как начать игру и как выбрать уровень сложности. Для выполнения данного действия был создан метод «button_info_Click» - Листинг 3.
private void button_info_Click(object sender, EventArgs e) { MessageBox.Show("Для того, чтобы начать игру выберите уровень сложности: " + "\r\n" + " " + "\r\n" + " один кулак - легкий уровень" + "\r\n" + " два кулака - нормальный уровень" + "\r\n" + " три кулака - сложный уровень" + "\r\n" + " " + "\r\n" + "Затем нажмите кнопку \u0022Играть\u0022 и начните игру.", "Как начать игру?"); } Листинг 3. - Метод «button_info_Click».
Для того чтобы выбрать уровень сложности, пользователь должен нажать на соответствующую картинку или RadioButton[14]. Обрабатывание клика на картинку или нужный RadioButton представлено на Листинге 4. Необходимо отметить, что при запуске приложения выбранным уровнем сложности является «нормальный уровень сложности».
if (radioButton_easy.Checked) level = 1;
if (radioButton_normal.Checked) level = 2;
if (radioButton_hard.Checked) level = 3;
//Метод, в котором обрабатывается нажатие на картинку с легким уровнем сложности:
private void pictureBox1_Click(object sender, EventArgs e)
{
radioButton_easy.Checked = true;
}
//Метод, в котором обрабатывается нажатие на картинку с нормальным уровнем сложности:
private void pictureBox2_Click(object sender, EventArgs e)
{
radioButton_normal.Checked = true;
}
//Метод, в котором обрабатывается нажатие на картинку с трудным уровнем сложности:
private void pictureBox3_Click(object sender, EventArgs e)
{
radioButton_hard.Checked = true;
}
Листинг 4. – Выбор пользователем уровня сложности.
При переходе в окно статистических данных из главного меню, пользователь может увидеть всю информацию о его последних восьми играх: номер игры, сложность головоломки, время, затраченное на решение и так же дату и время, когда игра закончилась (Рисунок 6).
Рисунок 6. Окно статистических данных пользователя.
Для реализации данного раздела приложения используется класс File[15], для считывания данных из текстовых документов, и делегат EventHandler, класс Timer для анимированного появления и исчезновения окна.
Следует рассмотреть более подробно то, как считывается информация с текстовых документов и выводиться на монитор пользователя (Листинг 5): благодаря классу File, вся информация, которая хранится в документах, записывается в массив, из которого, с помощью класса Label[16], создаются ячейки, где и находится вся необходимая пользователю информация.
string path = Environment.CurrentDirectory;
//Считываем статистику о уровнях сложности:
string[] lines_level = File.ReadAllLines(
//Вывод в таблицу статистики количество ошибок:
for (int i = 0; i < lines_mistake.Length; i++)
{
if (i < 8)
{
Label lb = new Label();
lb.Text = lines_mistake[lines_mistake.Length - 1 - i];
lb.AutoSize = false;
lb.Size = new System.Drawing.Size(125, 50);
lb.Location = new Point(560, 100 + 50 * i);
lb.TextAlign = ContentAlignment.MiddleCenter;
lb.BorderStyle = BorderStyle.FixedSingle;
lb.Font = new Font("", 10F, FontStyle.Regular);
this.Controls.Add(lb);
}
}
Листинг 5. - Считывание и вывод статистических данных из текстовых документов.
Окно игры – является основной формой приложения, в которой происходит решения головоломки (Рисунок 7). При его открытии пользователя встречает сетка судоку, в которой присутствует реализация выбора нужной строки, столбца и «маленького квадрата». Выше сетки судоку находится показатель уровня сложности. В правой части экрана расположились цифры для выбора ответа, над ними таймер, который необходим для отсчета времени от начала решения головоломки. Нижнюю часть окна занимает кнопка «Проверить» и функция быстрой проверки прогресса (см. 2.2.) – Рисунок 8. Основные классы, которые используются для реализации данного раздела приложения – это Random[17], Button[18], Label.
Рисунок 7. Окно решения головоломки.
Рисунок 8. Окно решения головоломки с включенной функцией быстрой проверки прогресса. Так же программа отслеживает количество заполненных клеток: если пользователь захочет закончить игру раньше, программа выведет окно (Рисунок 8), в котором подскажет, что игрок заполнил не все клетки. Но даже если все клетки игрового поля были заполнены, программа уточнит, не хочет ли пользователь изменить что-то (Рисунок 9).
Рисунок 8. Информация о незаполненных клетках.
Рисунок 9. Информация о заполненных клетках. Данная функция реализована с помощью DialogResuly[19]. При нажатии пользователем кнопки «Проверить», вызывается метод «button_check_Click_1», который проверяет наличие пустых полей, и, в зависимости от результата, выдает нужное окно – Листинг 6. private void button_check_Click_1(object sender, EventArgs e) { //Проверяем, есть ли не заполненные поля: int isEmpty = 0; for (int i = 0; i < size * size; i++) { for (int j = 0; j < size * size; j++) { if (fields[i, j].Text == "") { isEmpty = 1; } } }
//Если есть не заполненные поля:
if (isEmpty != 0)
{
//Вывод диалогового окна, в котором сообщается о том,
//что у игрока есть не заполненные поля:
DialogResult result = MessageBox.Show(
"У вас есть не заполненные клетки. " + "\r\n" + "Вы уверены, что хотите проверить себя?",
"Проверить?",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
//Если игрок хочет все равно хочет проверить свои наработки,
//вывод метода, который проверяет все поля, если не включена "Быстрая проверка прогресса":
if (result == DialogResult.Yes)
{
CheckGame();
}
}
//Если есть не заполненных полей нет:
else
{
//Вывод диалогового окна, в котором сообщается о том,
//что у игрока есть все поля заполненны:
DialogResult result = MessageBox.Show(
"Вы заполнили все клетки. " + "\r\n" + "Вы уверены, что хотите проверить себя?",
"Проверить?",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
//Если игрок хочет все равно хочет проверить свои наработки,
//вывод метода, который проверяет все поля, если не включена "Быстрая проверка прогресса":
if (result == DialogResult.Yes)
{
CheckGame();
}
}
}
Листинг 6. – Проверка на наличие пустых клеток в игровом поле и вывод соответствующего окна с информацией. Когда пользователь решил судоку, нажал на кнопку «Проверить» и посмотрел свой результат, программа создает и записывает в файлы статистические данные. Для данной операции был создан метод «MakeFiles» - Листинг 7. public void MakeFiles() { //Создаем файл для записи уровни сложности: string fileName_level = System.IO.Path.Combine(Environment.CurrentDirectory, "statistic_level.txt"); File.AppendAllText(fileName_level, Slevel + Environment.NewLine); //Создаем файл для записи минут: string fileName_minute = System.IO.Path.Combine(Environment.CurrentDirectory, "statistic_minute.txt"); File.AppendAllText(fileName_minute, Sminute + Environment.NewLine); //Создаем файл для записи секунд: string fileName_second = System.IO.Path.Combine(Environment.CurrentDirectory, "statistic_second.txt"); File.AppendAllText(fileName_second, Ssecond + Environment.NewLine); //Создаем файл для записи количества ошибок: string fileName_mistake = System.IO.Path.Combine(Environment.CurrentDirectory, "statistic_mistake.txt"); File.AppendAllText(fileName_mistake, Smistakes + Environment.NewLine); //Создаем файл для записи даты игры: string fileName_date = System.IO.Path.Combine(Environment.CurrentDirectory, "statistic_date.txt"); File.AppendAllText(fileName_date, Sdate + Environment.NewLine); }
Листинг 7. –Метод MakeFiles, который создает статистические данные.