Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Titulnye_listy (Восстановлен) (Восстановлен).docx
Скачиваний:
2
Добавлен:
26.09.2019
Размер:
325.79 Кб
Скачать

4 Реализация проекта

Многофайловый проект получается в результате подключения в заголовочном файле hanoy.cpp пользовательских функций, вынесенных в отдельные файлы drawing.h и records.h, с помощью директивы препроцессора #include. В данном проекте для подключения файлов в двойных кавычках указывается относительный путь к файлам. Например, #include «drawing.h».

Проект реализован в графическом режиме, создан дружественный интерфейс. Для этого было разработано графическое меню с набором кнопок, каждая из которых выполняет определённую задачу исходя из ограничений к проекту. Поскольку стандартные функции ввода-вывода текста на экран в графическом режиме не работают, то для вывода текста используется функция outtextxy() из стандартной библиотеки graphics.h. Скриншоты программы представлены ниже на рисунках 4.1-4.5.

В функции main() с помощью функций initgraph(), setbkcolor(), setrgbpalette(), информация о которых хранится в библиотеке graphics.h, осуществляется переход в графический режим, изменяется цвет фона, задаются новые цвета для палитры.

Графическое меню реализовано в функции menu(). В ней задаются настройки стиля, выравнивания и цвета текста при помощи функций settextjustify(), settextstyle(), setcolor() из стандартной библиотеки graphics.h. Для рисования пунктов меню используется цикл for, в теле которого вызывается функция pm() из библиотеки drawing.h. Перемещения между пунктами меню производятся при помощи клавиатуры. В цикле в переменную key записывается значение нажатой клавиши. Затем вызывается функция pm(), которая рисует активный пункт меню в виде неактивного. Далее вызывается оператор выбора, в качестве ключа используется значение переменной key:

  • если была нажата клавиша «стрелка вверх», то происходит проверка, является ли номер активного пункта меню меньше номера самого нижнего пункта, если является, то значение переменной sel, в которой хранится значение активного пункта меню, увеличивается на единицу, иначе переменной sel присваивается значение самого верхнего пункта меню;

  • если была нажата «стрелка вниз», то происходит проверка – является ли номер активного пункта больше номера самого верхнего пункта, если является, то значение переменной sel уменьшается на единицу, иначе переменной sel присваивается значение самого нижнего пункта меню;

  • если была нажата клавиша «Enter», то в зависимости от значения активного пункта меню вызывается соответствующая пункту функция, затем вызывается функция pm(), с помощью которой рисуется активный пункт меню.

Работа кнопок меню описана ниже. Результат работы функции menu() представлен на рисунке 4.1.

Рисунок 4.1 – Графическое меню игры

4.1 Кнопка «Новая игра»

При нажатии на кнопку меню «Новая игра» вызывается пользовательская функция game().

Функция game() запрашивает у игрока количество дисков, до тех пор, пока введеное число не будет в промежутке от 3 до 10 включительно. Затем вызываются функции newgame() из файла hanoy.cpp и timer() из файла records.h.

Управление перемещениями дисков происходит при помощи клавиатуры. В цикле for происходит опрос буфера клавиатуры.

Если была нажата клавиша «стрелка вверх», то проверяется, есть ли на этом колышке диски, если есть, то в переменные up и from записывается единица и номер текущего колышка соответственно, на экран выводится номер переносимого диска и значение переменной from.

Если была нажата клавиша «стрелка вниз», то происходит проверка можно ли положить ранее взятый диск на текущий колышек:

  • ранее был взят диск, т.е. значение переменной up не равно нулю;

  • диск переносится с одного колышка на другой, т.е. значения переменных from и st не равны;

  • больший диск нельзя класть на меньший, кроме случая когда мы кладем диск на пустой колышек, так как в программе отсуствие диска на данной позиции обозначается значением ноль.

Все условия должны выполняться одновременно. Если диск перенести можно, то на экран выводится значение текущего колышка и вызывается функция perenos().

Если была нажата клавиша «стрелка влево» или «стрелка вправо», то над текущим колышком при помощи пользовательской функции strelka() со вторым параметром 0 стрелка закрашивается, изменяется значение текущего колышка, и над активным колышком рисуется стрелка, так же при помощи пользовательской функции strelka(), но уже со вторым параметром 2.

Цикл повторяется до тех пор, пока игра не завершится, то есть функция win() вернет единицу или пользователь не нажмет клавишу «escape». Результат работы функции представлен на рисунке 4.2.

Рисунок 4.2 – Момент игры

Функция newgame() вычисляет высоту дисков в зависимости от их количества и записывает результат в глобальную переменную h. Затем, c помощью функции setmem() из стандартной библиотеки mem.h, обнуляется содержимое массивов mas и disk_kol. Нулевому элементу массива disk_kol присваивается значение переменной m, вызывается функция прорисовки фона back() из библиотеки drawing.h, с помощью цикла for и функции disk_add() происходит прорисовка m дисков на начальном колышке, а также заполнение элементов массива mas.

Функция perenos() вызывается при переносе диска с одного колышка на другой. Вносит изменения в массив mas в соотвествии с новым местоположением дисков, а также изменяет значения количества дисков на колышках в массиве disk_kol. Вызывает функции disk_add() и disk_del() из файла drawing.h, которые рисуют диск на новом месте и стирают на старом. Увеличивает значение переменной count, в которой хранится количество перекладываний дисков, на единицу и вызывает функцию out_count() из библиотеки graphics.h.

Функция win() вызывается функцией game(), чтобы определить была закончена игра или головоломка еще не решена. Функция проверяет все ли диски были переложены на один из конечных колышков, а именно, на любой кроме начального. Если были переложены все диски, то вызывает функцию timer(), описанную в файле records.h, с параметром 1, при помощи функции outtextxy() из стандартной библиотеки graphics.h выводит сообщение о победе, вызывает функцию records() из файла records.h и возвращает в вызываемую функцию единицу. Если были переложены не все диски, то возвращает ноль.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]