Реферат: Игра "Пятнашки"

Игра "Пятнашки"

Содержание


Введение 3

Назначение и область применения 4

Цели и задачи 4

Используемые методы 5

Описание алгоритма программы 8

Описание входных и выводных данных 24

Программное и аппаратное обеспечение программы 24

Руководство пользователя 25

Заключение 30

Список литературы 31

Приложение 1 Листинг программы 32

Приложение 2 Результаты работы. 46

Введение

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

После изучение предложенных тем выбрана очень популярная и всем известная игра в «пятнашки».

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

Суть самой игры заключается в следующем:

Игрок на экране видит табло, которое разбито на 16 клеток. В пятнадцати из них расположены неповторяющиеся цифры, в случайном порядке от 1 до 15 и одна пустая.

В общем виде данное табло можно представить в виде таблицы 1:

Таблица 1 – Образец табло.


5 7 3 8
15 1 13 2
14 10 6 4

9 11 12

Игрок должен перемещать по одной клетки с цифрой на пустое место.

Так происходит до тех пор, пока пользователь не выстроит последовательную комбинацию цифр (Таблица 2), и лишь после этого игрок считается победителем.

Таблица 2 – Правильное заполнение табло.


1 2 3 4
5 6 7 8
9 10 11 12
13 14 15

Назначение и область применения

Данная программа является, компьютерной версии знаменитой игры «пятнашки». Это логически не сложная и достаточно простая в управлении и использовании программа. Применения данной программы возможны везде, ведь в любой работе нужен отдых, а данная простенькая игра поможет расслабиться и отвлечься от повседневных дел.


Цели и задачи.

Целью данной курсовой работы является углубление знаний и расширение навыков по разработке алгоритмов и их реализации на персональном компьютере. Курсовая работа выполнена в среде Турбо Паскаль с использованием графических возможностей языка.

В курсовой работе используются основные возможности языка в работе со структурами, файлами, графикой.

В данной игре предполагалось создание:

интуитивно понятного интерфейса;

скромного, но графически точного табло, где осуществляется перемещение цифр;

удобного для пользователя управления;

доступного для понимания руководства пользователя;

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

Возможность в любой момент покинуть игру.

В данной программе использовались следующие разделы Турбо Паскаль:

Управляющие структуры (условие, циклы);

Массивы (одномерные, двумерные);

Символы и строки;

Процедуры;

Работа с файлами;

Работа с графическими возможностями.

В итоги получилась программа – игра, в которой использовались основные возможности среды Турбо Паскаль.

Используемые методы

Программа выполнена в среде программирования Турбо Паскаль. Сама программа - приложение Windows. Для вывода графических объектов используются модуль Graph. Программой обрабатываются события от нажатия клавиш на клавиатуре, выбора соответствующих пунктов меню, а также считывание количества ходов для ведение статистики лучших игроков.

Для того чтобы не усложнять листинг программы, вся программа разбита на процедуры, каждая из которых отвечает за определенное действие. Всю программу можно разделить на два основных раздела:

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

Вспомогательные процедуры. Это те процедуры, которые дополняют данное приложение дополнительными и очень полезными функциями;

Основная программа.

К основным процедурам относятся:

Tablo;

Vivod;

Napravlenie;

Poisk;

Zamena;

Proverka;

Mesto;

Game15

К вспомогательным процедурам относится:

ReadFile;

WriteFile;

Bonus.

Алгоритм всей программы описан в пункте 5, а в данном разделе опишем основные приемы используемых процедур.


4.1 Основные процедуры.


4.1.1 procedure Tablo;

Данная процедура формирует табло, заполненное случайными, неповторяющимися цифрами от 1 до 15 и одной пустой клеткой. Процедура реализована с использованием двух массивов: одномерный и двумерный.

Одномерный массив с 16 целыми числами заполняется случайным образом, причем, учитывается, чтобы цифры в данном массиве не повторялись.

Каждой цифре из одномерного массива присваивается, аналогичный ей строковый элемент и вводится в двумерный массив. К примеру, цифре 5, присваивается строковый элемент ‘5 ‘. Исключение составляет цифра 16, ей присваивается пробел.


4.1.2 procedure Vivod;

Процедура вывода на экран табло с цифрами сформированное на момент отображения. Если программа только запущенна, тогда на экран выводится таблица заполненное случайным образом. Если игра уже идет то данная процедура выводит на экран ту комбинацию цифр, которая определена пользователем во время игры.


4.1.3 procedure Napravlenie;

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

4.1.4 Procedure Poisk;

В этой процедуре осуществляется поиск пустого элемента. Это необходимо для того, чтоб в дальнейшем пользователь смог относительно пустого элемента сделать свой ход. Процедура считывает каждый элемент двумерного массива и сравнивает его с пустым. После того как пустой найден процедура запоминает координаты пустого элемента, а именно строку и столбец.


4.1.5 procedure Zamena;

Программа в зависимости от выбора направления осуществляет перестановку элементов в двумерном массиве.

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


4.1.6 procedure proverka;

После совершения перестановки цифр, а иными словами после очередного хода, программа сравнивает расстановку цифр в двумерной матрицы. Если текущая комбинация является правильной, тогда игрок считается победителем.


4.1.7 procedure Mesto;

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

4.1.8 procedure Game15;

Эта процедура является основной. В ней подключается графический модуль и происходит основной процесс игры.

Игра будет продолжаться до тех пор, пока не будет разложен правильный расклад или до тех пор пока пользователь не прервет игру при помощи клавиши ESC.


4.2 Вспомогательные процедуры.


4.2.2 procedure readFile;

После ввода имени пользователя (пункт 4.1.7), информация добавляется в файл res.txt


4.2.3 procedure writeFile;

Данная процедура считывает информацию с файла res.txt и выводит на экран полученные данные, а именно игроков, которые за наименьшее количество ходов разложили требуемую комбинацию.


4.2.4 procedure bonus;

Маленькая хитрость данной программы. Она предназначена для разработчика программы и для преподавателя проверяющего правильность написания игры. Чтобы, при проверке, преподавателю не требовалась проходить всю игру, достаточно нажать клавишу End на клавиатуре и расклад почти разолжется. Также эта процедура была бы очень полезна разработчику, для отладки и тестирования программы.

4.3 Основная программа.


В основной программе на экране выводится Главное меню и в зависимости от выбранных пользователем действий происходит взаимодействие с процедурами.

В действительности некоторые процедуры можно было объединить, т.к. основная цель использования процедур это исключение повторяющихся действий, а в данной программе некоторые процедуры используются один раз и их можно было записать в другие процедуры или основную программу, но, на мой взгляд, так гораздо удобнее, как при программировании, так и при проверки.

Описание алгоритма программы

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

Основной алгоритм программы разбит на четыре раздела (схема 1):

Описание;

Управление;

Игра;

Результаты.










Схема 1 - Основной алгоритм программы


5.1 Раздел Описание.


Данный раздел предназначен для ознакомления пользователем, с возможностями, программы.

Раздел реализован при помощи процедуры Avtor. Данная процедура считывает информацию из файла fhelp1.txt и выводит считанную информацию на экран, для ознакомления пользователю.

Общий алгоритм данного раздела заключается в следующем (Схема 2):

Чтение информации из файла fhelp1.txt;

Вывод информации из файла на экран;

Закрытие файла.








Схема 2 Алгоритм - Описание


5.1.1 Чтение файла.

При помощи процедуры assign(f,'fhelp1.txt'), связываем файловую переменную f с файлом fhelp1.txt, к которому происходит обращение. В данном варианте не описывается полный путь к файлу, подразумевая, что данный файл находится в корне каталога с программой. Это необходимо в тех случаях, когда пользователь захочет перенести файлы программы в любое удобное для него место, если бы был прописан полный путь, тогда пользователь не мог бы перемещать файлы программы, а в случае перемещения, информация из раздела Описание, не выводилась бы на экран. В этом случае, необходимо было бы точно устанавливать файлы программы, в то место, где было бы прописано. Далее при помощи процедуры reset(f) открываем файл для чтения.


5.1.2 Вывод информации на экран осуществляется при помощи инструкций readln(f,g1); writeln(g1). В данной инструкции, переменной g1, сначала при помощи readln присваивается строка из файла fhelp1.txt, а затем при помощи writeln выводится на экран содержимое переменной g1.


5.1.3 Закрытие файла, осуществляется при помощи процедуры close (f);


5.2 Раздел Управление.


В данном разделе, пользователю предлагается ознакомиться с клавишами управления.

Раздел реализован при помощи процедуры help. Данная процедура считывает информацию из файла fhelp.txt и выводит считанную информацию на экран для ознакомления пользователю.

Реализована данная процедура, точно таким же способом, как и в разделе 5.1 Описание, за исключением того, что обращение происходит к файлу fhelp.txt, по этому подробно останавливаться на данном разделе не имеет смысла.


5.3 Раздел Игра.


Данный раздел является основным. Именно в этом разделе происходят основные события. Реализован данный алгоритм при помощи процедуры Game15.

Алгоритм данного раздела заключается в следующем:

Инициализация графического режима;

Заполнение в памяти компьютера табло случайными цифрами;

Вывод табло на экран;

Ввод направления перехода;

Поиск пустого элемента;

Перемещение элементов табло;

Проверка;

Итог;

Ввод личных данных.

Схематично, данный алгоритм, показан на схеме 3.















Нет

Нет


Да


Да


Нет


Схема 3 – Раздел Игра.


5.3.1 Инициализация графического режима осуществляется в этой же процедуре Game15, при переходе из Главного меню программы в раздел ИГРА. Переход к графическому режиму осуществляется, при помощи процедуры InitGraph (grDriver, grMode, grPath), где grDriver – это используемы программой драйвер видеоадаптера (VGA), grMode – режим работы видеосистемы (VGAHi), grPath – это место нахождения файла EGAVGA.BGI на диске (как и в случае с файлами, пишем только имя и расширение файла, а не полный путь, для того чтоб в будущем можно было перемещать файлы программы).


Заполнение табло случайными цифрами.

В памяти компьютера создается табло, в котором, в дальнейшем будут производиться перестановки. Табло состоит из шестнадцати клеток (четыре строки и четыре столбца), которое заполняется пятнадцатью, неповторяющимися цифрами от 1 до 15 и одной пустой клеткой.

Данный раздел реализован при помощи процедуры Tablo. Фактически табло, которое описывается ранее это двумерный массив с цифрами от 1 до 15 и ноль. Но отображение цифр на экране и ноля, вместо пустого элемента, делает табло не красивым. Отсюда следует, что двумерный массив, должен содержать строковые или символьные элементы.

Следующем моментом реализации данной процедуры, является заполнение табло случайными цифрами. Для заполнения табло случайными цифрами используется функция random, которая является генератором случайных цифр, но работает соответственно только с цифрами, а у нас строковый двумерный массив.

Проанализировав выше сказанное, приходим к тому, что необходимо создать два массива. Один одномерный из шестнадцати элементов типа integer, второй двумерный, четыре на четыре, типа string. Сначала одномерный массив, в случайном порядке, заполняется целыми неповторяющимися цифрами от 1 до 16, а затем в зависимости от расположения цифр, заполняется двумерный строковый массив. К примеру, если первый элемент одномерного массива равен цифре 11 тогда первому элементу двумерного массива будет присвоено строка «11».

Общий алгоритм данного раздела заключается в следующем (Схема 4):

Выбор случайного числа;

Проверка на наличие совпадений в массиве;

Занесение информации в массив;

Проверка заполнен ли массив;

Заполнение двумерного массива.






Да



Нет




Нет



Да





Схема 4 – Раздел Табло


Выбор случайного числа.

Некоторой переменной b присваивается случайное число, при помощи функции random. При чем функция random ограничена интервалом от 1 до 16.


Проверка на наличие совпадений в массиве

Переменная b сравнивается с каждым элементом массива bs[i], при помощи инструкций For и if. Если такой элемент уже присутствует в одномерном массиве, тогда переменной b, вновь присваивается случайное число. Так происходит до тех пор, пока переменной b не будет присвоена цифра, которой еще нет в массиве.

Занесение информации в массив.

Значение переменной b, которое было найдено ранее, вносится в массив bs[i], за последним элементом внесенный в массив


Проверка заполнен ли массив.

Программа проверяет заполнен ли массив полностью, если нет, то алгоритм начинается с пункта 5.3.2.1.

В итоге мы имеем одномерный массив заполненный, в случайном порядке неповторяющемся цифрами от 1 до 16.


Заполнение двумерного массива.

Заполнение двумерного массива, при помощи инструкции For и переменных i и j, которые обозначают столбец и строку.

Алгоритм заполнения двумерного массива заключается в следующем:

Первоначально переменной z присваивается единица. Данная переменная нам необходима как счетчик.

Каждому элементу j строки и i столбца присваивается строковый элемент, в зависимости от цифры стоящей под номером z в одномерном массиве, если текущей элемент одномерного массива содержит цифру 8, то текущему элементу двумерного массива присваивается строковый элемент «8 ». Исключением составляет цифра 16. В этом случае в двумерный массив вводится пробел. Выбор строкового элемента осуществляется при помощи инструкции case.

Так происходит до тех пор, пока двумерный массив не будет полностью заполнен.


Вывод табло.

В данном разделе на экране появляется табло с текущей комбинацией цифр. Первоначально, табло заполняется случайным образом п. 5.3.2, а в дальнейшем на экране будет отражено текущее состояния цифр на табло, в зависимости от сделанных пользователем ходов.

Данный раздел реализован в процедуре Vivod.

Общий алгоритм данного раздела заключается в следующем (Схема 5):

Прорисовка клеток;

Прорисовка рамки;

Вывод элементов массива по верх клеток табло.










Схема 5 - Раздел Вывод


Прорисовка клеток.

Рисование клеток осуществляется в следующем порядке:

Определения размера будущих клеток, при помощи двух переменных (h1, w1, координаты верхней левой и правой нижней точек);

При помощи процедуры SetFillStyle, задаем нужный цвет и стиль заполнения. Цвет выберем синий, а стиль заполнения возьмем SolidFill – сплошная заливка текущем цветом, т.е. синим.

При помощи процедуры Bar вычерчиваем на экране квадрат.

Чтобы данные действия не повторять 16 раз, используем инструкцию For.

Прорисовка рамки.

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


Вывод элементов массива по верх клеток табло.

В итоге на экране появляется табло с шестнадцатью клетками, остается лишь в центр этих клеток поместить цифры из двумерного массива.

Так как мы находимся в графическом режиме, то для вывода элементов двумерного массива используем процедуру OutTextXY.

В итоге на экране появится достаточно аккуратное и не плохо оформленное табло с клетками, в центре каждой из которых, находится цифра.

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


Поиск пустого элемента.

В данном разделе осуществляется поиск пустого элемента, чтобы в дальнейшем относительно него можно было бы осуществлять передвижение

Данный раздел реализован в процедуре Poisk. Программа при помощи инструкции For и переменных i и j сравнивает каждый элемент двумерного массива AS, с пустым элементом, при помощи инструкции IF и когда находит, присваивает значения переменных i и j переменным strok и stolb. Таким образом, переменные strok и stolb как бы являются координатами пустого элемента.

Общий алгоритм данного раздела заключается в следующем (Схема 6):

Выбор элемента массива;

Проверка, является ли данный элемент пробелом;

Присвоение координат строки и столбца переменным.






Нет Нет


Да





Схема 6 - Раздел Поиск


Выбор элемента массива.

При помощи инструкции For поочередно будем выбирать каждый элемент массива.


Проверка, является ли данный элемент пробелом.

При помощи инструкции If, сравниваем каждый элемент массива с пробелом.


Запоминание координат пробела.

Переменным strok и Stolb присваиваем координаты пустого элемента.

Ввод направления перехода.

В данном разделе пользователю предлагается выбрать направление перехода клеток с цифрами, относительно пустой клетки. Выбор осуществляется при помощи курсора, на клавиатуре.

Данный раздел алгоритма реализован в процедуре Napravlenie.

Фактически некоторой переменной ch (типа char) присваивается код нажатой клавиши.

Алгоритм процедуры заключается в следующем:

Пользователю предлагается, при помощи курсора, ввести направления перехода.

После того как пользователь, нажал кнопку на клавиатуре, код клавиши присваивается переменной ch, при помощи функции readkey.

К примеру, если пользователь ввел направление курсора вверх, это означает, что пользователь нажал служебную клавишу под кодом 72.


Перемещение элементов табло.

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

Стрелка влево – перемещает влево цифру, стоящую справа от пустой клетки;

Стрелка вправо – перемещает вправо цифру стоящую слева от пустой клетки;

Стрелка вниз – перемещает вниз цифру стоящую сверху от пустой клетки;

Стрелка вверх – перемещает вверх цифру стоящую снизу от пустой клетки.

Данный алгоритм реализован в процедуре Zamena.

Общий алгоритм данного раздела заключается в следующем (Схема 7):

Выбор направления перестановки;

Перемещение клеток;

Запись об очередном сделанном ходе.












Схема 7 - Раздел Замена.


Выбор направления перестановки.

Ранее пользователь сделал ход, а это значит, что мы имеем нажатую служебную клавишу, под каким либо номером. При помощи инструкции IF и функции ord, выбирается направления перестановки элементов.


Перемещение клеток.

В зависимости от значений переменных Strok, Stolb, которым было присвоено координаты пустого элемента в массиве (5.3.4) и выбранного направления, осуществляется перемещение.

Например, пользователь ввел направление курсора вверх, это означает, что пользователь нажал служебную клавишу под кодом 72, тогда, при помощи инструкции if и функции ord (if ord(ch)=72 then), осуществляется перемещение.

Перемещение осуществляется по следующему принципу: пустой клетки, а именно элементу массива с координатами as[strok,stolb], присваивается содержимое элемента стоящего под пустой клеткой (as[strok,stolb]:= as[strok+1,stolb];), а соответственно элементу, стоящему под пустой клеткой присваивается пробел (as[strok+1,stolb]:=' ';).


Запись об очередном сделанном ходе.

При запуске раздела Игра, некоторой переменной hod присваивается 0. Это означает, что пользователь приступил к игре. После каждого сделанного хода, значение переменной hod увеличивается на единицу. В дальнейшем эта информация будет использована, при определении лучших результатов.


Проверка.

В данном разделе программа сравнивает текущую комбинацию цифр, с правильной комбинацией. Если расклады совпадают, то алгоритм выполнен и осуществляется переход к следующему пункту, в противном случае, алгоритм вновь повторяется, начиная с пункта 5.3.3.

Данный раздел реализован в процедуре proverka.

По умолчанию логическая переменная prov равна false (ложь). Программа проверяет если элемент первой строки и первого столбца равен 1, второй равен двум и т.д. и элемент последней строки и последнего столбца равен пустому элементу, то расклад считается, выполнен и переменной prov присваивается значение true (истина).


Итог.

В данном разделе, программа считывает, за какое количество ходов игрок, выполнил требуемый расклад и сравнивает с результатами прошлых игр. Если игрок разложил табло за большее количество ходов, чем это сделали игроки ранее, тогда программа завершает свою работу и переходит в Главное меню, в противном случае пользователю предлагается ввести свое имя. В дальнейшем его имя будет, отображается в списке лучших игроков.

Данный раздел реализован в процедуре Mesto.

Общий алгоритм данного раздела заключается в следующем (Схема 8):

Количество ходов;

Считывание результатов из файла;

Проверка, входит ли данный результат в список лучших;

Ввод имени;

Перестановки в файле результатов;

Сохранения результатов в файл.