МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»
(ФГБОУ ВО «ВГТУ», ВГТУ)
ФАКУЛЬТЕТ Экономики, менеджмента и информационных технологий
КАФЕДРА систем управления и информационных систем в строительстве
Курсовой проект
По дисциплине: «Основы программирования и алгоритмизации»
Тема: Разработка программы-игры головоломки «Алфавит»
Выполнил:
Пьяных М.Р.
Руководитель
Минакова О. В.
Воронеж 2019
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. АНАЛИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ
2. ДЕТАЛИЗАЦИЯ ВЫБРАННОГО РЕШЕНИЯ
3. ОПИСАНИЕ И ТЕСТИРОВАНИЕ РАБОТЫ ПРОГРАММЫ
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ
ВВЕДЕНИЕ
Головоломка - непростая задача, для решения которой, как правило, требуется сообразительность, а не специальные знания. Всем известно, что мозг тоже надо тренировать, стимулировать его работу. В этом и помогут головоломки, ведь они являются очень эффективным средством для развития логического и пространственного мышления, вдобавок к этому головоломки развивают эвристическое мышление - способности находить решение нетиповых задач. Так же головоломки являются прекрасным инструментом стимулирования творческих способностей - креативности. Кроме того, головоломки оказывают положительное влияние на развитие математических способностей Каждый теперь знаком с судоку, и, без сомнения, сыграл несколько головоломок. В мире есть большое разнообразие вариаций на тему судоку, которые являются более или менее верны первоначальной концепции этого вида головоломок. Так же судоку различаются на типы, но в данной работе мы рассмотрим только один из них - «Алфавит».
Целью настоящей работы является закрепление знаний, получаемых в процессе изучения дисциплины, приобретение необходимых практических навыков для применения работы со статическим и динамическими массивами, циклами и функциями. Задача курсовой работы состоит в самостоятельная разработка и тестирование приложения-игры «Алфавит», приобретение необходимых практических навыков. В ходе игры будет производиться проверка ходов пользователя, пока не будет сделан верный.
Формулировка задачи: Заполнить головоломку буквами из указанного диапазона так, чтобы в каждом ряду и колонке каждая буква встречалась лишь однажды. Некоторые клетки могут оставаться пустыми. Буквы, стоящие на границе сетки, показывают, какая буква встретится первой в данном ряду (колонке).
Для удобной работы с программой необходимо разработать удобный пользовательский интерфейс.
Для решения поставленной задачи необходимо выполнить следующие действия:
· Проанализировать поставленную задачу;
· Выбрать метод решения поставленной задачи;
· Составить алгоритм решения задачи;
· Реализовать диалог с пользователем;
· Провести отладку программы и написать сопроводительную документацию.
Программа разрабатывалась на языке С в среде Microsoft Visual Studio 2019.
1. АНАЛИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ
Существует несколько видов головоломок: устные, головоломки с предметами, механические и печатные. «Алфавит» относиться к печатным, для решения которых нужно написать (напечатать) ответ. Этот тип головоломки редко можно увидеть в печатных изданиях, а в некоторых интернет сайтах его могут быть отнесены к Греко-латинскому судоку, потому что в математике греко-латинский квадрат (или квадрат Эйлера/ортогональным латинским квадратом) является описанием расположения букв, как видно из этого типа головоломки.
Правило решения головоломки - пользователю предлагается таблица, в которую нужно заполнить буквами так, чтобы в каждом ряду и колонке каждая буква встречалась лишь однажды. Причем некоторые клетки могут оставаться пустыми.
Поэтому при написании программы необходимо выполнить следующие условия:
В каждой ячейке сетки стоит только одна буква;
В каждой строке и каждом столбце каждая буква встречается только один раз.
Программа - это последовательность команд, которую выполняет компьютер в процессе выполнения данных.
Данный программный продукт реализуется для игры одного человека с компьютером. В реализуемой игре программа выводит на экран игровое поле, контур которого заполнен буквами по правилу, приведенному выше, при этом некоторые места в ячейках игровой таблицы остаются незаполненными. Задача пользователя указать координаты выбранной им ячейки (пример ввода показан в самой программе) и указать предполагаемую букву.
Так как пользователь вводит координаты куда он хочет поместить значение ячейки, то:
1) вычисления начинаются с проверки на корректность введенного значения
2) затем идет проверка этих координат на наличие их в диапазоне.
В случае если пользователь выберет не существующий вариант, тогда выйдет уведомление о некорректном вводе, и программа предложит ввести значения еще раз.
Результатом программы является вывод определенных букв (выбранные пользователем), расположенных в заданном диапазоне.
Игра может завершиться в двух случаях: по желанию пользователя (при вводе комбинации 0:0=Е) или же после достижения лимита количества возможных ходов (выигрыша или проигрыша).
Работа программы состоит из четырех этапов:
1) Вывод в консоль игрового поля;
2) Осуществить ввод координат буквы и саму букву;
3) Проверить правильность введенных значений;
4) По окончанию игры вывести результаты игры.
Для правильного выполнения своей задачи, программа должна выполнять следующие функции:
· вывести на экран и предложить выбор пункта меню;
Контрольными пример для этой функции: будет вывод на экран «Хотите ознакомится с правилами игры?» и позже «Хотите начать игру?»
· предложить пользователю ввести букву;
Контрольными пример для этой функции: будет вывод на экран «Введите позицию и букву в формате…»
· получить результат;
· выполнить проверку, вводимых пользователем данных, при решении головоломки;
Контрольный пример: в случае не корректно введенных значений на экран выведется «Введите корректное значение».
· осуществить вывод результата на экран;
Контрольными пример для этой функции: на экран выведется таблица с заполненными значениями, который ввел пользователь.
· осуществить выход из программы, если вся таблица заполнена.
Особенностью выбранного подхода к решению является использование двумерного массива, в качестве общей структуры данных для хранения ключевой информации. Поскольку число ходов неизвестно заранее (задается размером поля) использовался динамический массив.
Массив - это конечная последовательность однотипных данных. Каждый член этой последовательности называется элементом массива. Доступ к элементам массива производится по их номеру в последовательности, который называется размерностью массива. Причем важно заметить, что если размерность массива равна n, то индекс этого массива изменяется от 0 до n-1.
Доступ к элементам массива выполняется при помощи оператора индексирования [ ], результатом выполнения которого является значение элемента массива с заданным индексом.
Динамическое выделение памяти необходимо для эффективного использования памяти компьютера. Выделяемая память после её использования должна высвобождаться, поэтому используется операция free. Даже если не высвобождать память явно, то она освободится ресурсами ОС по завершению работы программы.
Ниже приведены определения средств, которыми необходимо воспользоваться для решения поставленной задачи:
· Библиотека, библиотека не является частью языка, однако заложенный в ней набор функций, а также определений типов и макросов составляет системную среду, поддерживающую стандарт С
· Функция - это самодостаточная единица кода программы, спроектированная для выполнения определенной задачи.
· типы и размеры данных:
int - целое, обычно отображающее естественное представление целых в машине;
float - число с плавающей точкой одинарной точности
double - число с плавающей точкой двойной точности
Также вместе с базовыми типами можно использовать следующие типы данных для расширения диапазона:
· простая модель ввода-вывода поддерживается стандартной библиотекой
· порядок, в котором выполняются вычисления, определяется инструкциями управления
2. ДЕТАЛИЗАЦИЯ ВЫБРАННОГО РЕШЕНИЯ
Программа считывает вводимые пользователем символы посредствам объекта «Y» программа выводит «Правила игры», если введена буква «N» программа предлагает начать игру.
Программа снова считывает вводимые пользователем символы посредством объекта scanf, а вводимый символ так же пропускается через цикл. Если пользователь вводит «Y», то игра начинается.
Игра заключена в тело цикла, в котором сначала считывается вводимое пользователем координаты и сама буква, а затем проверяется его правильность.
Поскольку выбор пункта в меню осуществляется через оператор if пользователь должен ввести букву Y или N (обозначения букв находиться находится возле пункта меню). Конструкция оператора if.
if (выражение)
{
printf : инструкции
}
Так как пользователь вводит координаты куда он хочет поместить букву, то вычисления начинаются с проверки на корректность введенного значения, затем идет проверка этих координат на наличие их в диапазоне. В случае если пользователь выберет не существующий вариант, тогда выйдет уведомление о некорректном вводе, и программа предложит ввести значения еще раз.
Результатом программы являются вывод определенных букв (выбранные пользователем), расположенные в заданном диапазоне.
для реализации предсталенных алгоритнов требуется использование библиотечных функций.
Для работы программы требуются переменные, предоставленные в таблице.
Таблица 1 - Переменные программы и их назначение
|
Переменная |
Тип |
Значение |
|
|
answer |
char |
переменная символьного типа, с помощью которой производится проверка, показывать ли правила игры |
|
|
coll |
int |
переменная целочисленного типа, используемая в функциях для итерации по столбцам |
|
|
correctness_of_colls |
int* |
динамический массив целочисленного типа, хранящий значения о правильности решений столбцов головоломки |
|
|
correctness_of_rows |
int* |
динамический массив целочисленного типа, хранящий значения о правильности решений строк головоломки |
|
|
i |
int |
переменная целочисленного типа, используемая для итерации |
|
|
index |
int |
переменная целочисленного типа, служащая для хранения вычисленного индекса массива встреч |
|
|
later |
char |
переменная символьного типа, используемая при вводе пользователем нового символа и при передаче этого символа в массив данных (игровое поле) |
|
|
meetings |
int* |
динамический массив целочисленного типа, служащий для считывания всех введенных пользователем значений в столбце или строке и подсчета их повторений |
|
|
row |
int |
переменная целочисленного типа , использующийся в функциях для итерации по строкам |
|
|
start |
char |
переменная символьного типа, с необходимая для выбора действия, начать игру или выйти из нее |
|
|
tab |
char** |
динамический двумерный массив символьного типа (параметр в функциях, в которые необходимо передавать игровое поле) |
|
|
tab_coll |
int |
переменная целочисленного типа, служащая для итерации по столбцам среди данных введенным в игровое поле пользователем |
|
|
tab_row |
int |
переменная целочисленного типа, служащая для итерации по строкам среди данных введенным в игровое поле пользователем |
|
|
tablica |
char** |
динамический двумерный массив символьного типа, служащий для хранения дефолтных значений (подсказок к головоломке) и данных, вводимых потзователем (игровое поле). |
Важной частью программы является- диалог с пользователем ввод- вывод данных в языке С осуществляется с помощью функций ввода-вывода. Описание объектов для управления ввода-вывода содержится в файле stdio.h, при подключении этого файла с помощью дерективы #includе< stdio.h >.
Программа содержит следующие функции:
1) void print_line();
Функция, содержащий цикл, который печатает черточки, чтобы визуально отделить линию головоломки.
2) void print_first_line();
Функция, содержащий цикл, который печатает первую отделяющую строку с номерами столбцов.
3) void printer(char** tab);
Функция, которая предназначена для вывода поля игры в консоль, там же печатается индексы строк.
4) void full_elements(char** tab);
Функция, которая предназначена для заполнения полей условия головоломки.
5) void step(char** tab);
Функция, которая считывает введенные пользователем позицию и букву, проверяет их на корректность. Заполняет поля условия головоломки. Также содержит кнопку выхода из игры.
6) int row_check(int row, char** tab)
Функция предназначена для проверки на верность решения строк, путем создания целочисленного массива, каждый элемент которого соответствует количеству встреч в строке определенной буквы. Строка считается правильной, если каждая буква встретилась ровно 1 раз, в этом случае функция возвращает значение 1, в противном - 0. Блок-схема представлена на рисунке 1.
а) - Часть блок- схемы функции для проверки на верность решения сток;
б) - вторая часть блок-схемы функции для проверки на верность решения сток.
Рисунок 1 - блок-схема функции для проверки на верность решения сток.
7) int coll_check(int coll, char** tab);
Функция предназначена для проверки на верность решения столбцов, путем создания целочисленного массива, каждый элемент которого соответствует количеству встреч в столбце определенной буквы. Столбец считается правильной, если каждая буква встретилась ровно 1 раз, в этом случае функция возвращает значение 1, в противном - 0.
8) int is_correct_decision(char** tab)
Функция предназначена для проверки размещенного на поле (которое передается в качестве параметра) решения предложенного игроком на правильность, путем отдельной проверки каждой строки и каждого столбца. Функция возвращает 1, если все столбцы и строки решены верно, и 0, если хоть в одном случае решение некорректно. Блок-схема представлена на рисунке 2. компьютер динамический память символ
Рисунок 2 - блок-схема функции проверки размещенного на поле решений
Программа на С начинает работу с функции main(), по необходимости из main() вызываются другие функции программы, по завершении работы функции программа возвращается в main(), в то место, откуда функция была вызвана. Функции могут вызываться не только из main(), но и из других функций.