Содержание
1. Введение 3
2. Назначение и областьприменения 4
3. Цели и задачи 4
4. Используемыеметоды 5
5. Описаниеалгоритма программы 8
6. Описание входныхи выводных данных 24
7. Программное иаппаратное обеспечение программы 24
8. Руководствопользователя 25
9. Заключение 30
10. Списоклитературы 31
Приложение 1 Листингпрограммы 32
Приложение 2 Результатыработы. 46
1. Введение
После изучения предметаОсновы алгоритмизации и программирования, необходимо выполнить курсовой проект.
После изучениепредложенных тем выбрана очень популярная и всем известная игра в «пятнашки».
При изучении предметнойобласти, выяснилось, что «пятнашки» на первый взгляд простая игра, но для еереализации необходимо обратится практически ко всем разделам программирования всреде Турбо Паскаль.
Суть самой игрызаключается в следующем:
- Игрок на экраневидит табло, которое разбито на 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
2. Назначениеи область применения
Данная программаявляется, компьютерной версии знаменитой игры «пятнашки». Это логически несложная и достаточно простая в управлении и использовании программа. Примененияданной программы возможны везде, ведь в любой работе нужен отдых, а даннаяпростенькая игра поможет расслабиться и отвлечься от повседневных дел.
3. Цели и задачи.
Целью данной курсовойработы является углубление знаний и расширение навыков по разработке алгоритмови их реализации на персональном компьютере. Курсовая работа выполнена в средеТурбо Паскаль с использованием графических возможностей языка.
В курсовой работеиспользуются основные возможности языка в работе со структурами, файлами,графикой.
В данной игрепредполагалось создание:
a. интуитивнопонятного интерфейса;
b. скромного, нографически точного табло, где осуществляется перемещение цифр;
c. удобного дляпользователя управления;
d. доступного дляпонимания руководства пользователя;
e. списка лучших игроков,т.е. тех игроков, которые за наименьшее количество ходов собрали требуемуюкомбинацию цифр.
f. Возможность влюбой момент покинуть игру.
В данной программеиспользовались следующие разделы Турбо Паскаль:
- Управляющиеструктуры (условие, циклы);
- Массивы(одномерные, двумерные);
- Символы и строки;
- Процедуры;
- Работа с файлами;
- Работа сграфическими возможностями.
В итоги получиласьпрограмма – игра, в которой использовались основные возможности среды ТурбоПаскаль.
4. Используемыеметоды
Программа выполнена всреде программирования Турбо Паскаль. Сама программа — приложение Windows. Для вывода графических объектов используютсямодуль Graph. Программой обрабатываются событияот нажатия клавиш на клавиатуре, выбора соответствующих пунктов меню, а такжесчитывание количества ходов для ведение статистики лучших игроков.
Для того чтобы неусложнять листинг программы, вся программа разбита на процедуры, каждая изкоторых отвечает за определенное действие. Всю программу можно разделить надва основных раздела:
- Основныепроцедуры, т.е. те процедуры, которые отвечают за саму игру и взаимодействие спользователем во время игры;
- Вспомогательныепроцедуры. Это те процедуры, которые дополняют данное приложениедополнительными и очень полезными функциями;
- Основная программа.
К основным процедурамотносятся:
- Tablo;
- Vivod;
- Napravlenie;
- Poisk;
- Zamena;
- Proverka;
- Mesto;
- Game15
К вспомогательнымпроцедурам относится:
- ReadFile;
- WriteFile;
- Bonus.
Алгоритм всей программыописан в пункте 5, а в данном разделе опишем основные приемы используемыхпроцедур.
4.1Основные процедуры.
4.1.1 procedureTablo;
Данная процедураформирует табло, заполненное случайными, неповторяющимися цифрами от 1 до 15 иодной пустой клеткой. Процедура реализована с использованием двух массивов:одномерный и двумерный.
Одномерный массив с 16 целымичислами заполняется случайным образом, причем, учитывается, чтобы цифры вданном массиве не повторялись.
Каждой цифре изодномерного массива присваивается, аналогичный ей строковый элемент и вводитсяв двумерный массив. К примеру, цифре 5, присваивается строковый элемент ‘5 ‘. Исключениесоставляет цифра 16, ей присваивается пробел.
4.1.2 procedureVivod;
Процедура вывода на экрантабло с цифрами сформированное на момент отображения. Если программа толькозапущенна, тогда на экран выводится таблица заполненное случайным образом. Еслиигра уже идет то данная процедура выводит на экран ту комбинацию цифр, котораяопределена пользователем во время игры.
4.1.3 procedureNapravlenie;
В данной процедурепользователю, при помощи курсора, предлагается ввести направление перехода. Вданной процедуре считывается код нажатой клавиши, чтоб в дальнейшем можно былоосуществлять передвижение.
4.1.4 ProcedurePoisk;
В этой процедуреосуществляется поиск пустого элемента. Это необходимо для того, чтоб вдальнейшем пользователь смог относительно пустого элемента сделать свой ход.Процедура считывает каждый элемент двумерного массива и сравнивает его спустым. После того как пустой найден процедура запоминает координаты пустогоэлемента, а именно строку и столбец.
4.1.5 procedureZamena;
Программа в зависимостиот выбора направления осуществляет перестановку элементов в двумерном массиве.
Также в данной процедуресчитывается каждый ход пользователя, чтобы в дальнейшем, если пользовательразложит требуемый расклад быстрее, чем игроки, игравшие ранее, можно быловвести информацию об игроке в файл.
4.1.6 procedureproverka;
После совершения перестановкицифр, а иными словами после очередного хода, программа сравнивает расстановкуцифр в двумерной матрицы. Если текущая комбинация является правильной, тогдаигрок считается победителем.
4.1.7procedure Mesto;
В случае если игроксчитается победителем, то в данная процедура сравнивает текущей результат(количество ходов за которое игрок разложил расклад), с игроками игравшимиранее. Если данный игрок разложил быстрее, то ему предлагается ввести имя и егоимя и результат сохранятся в файл.
4.1.8 procedureGame15;
Эта процедура являетсяосновной. В ней подключается графический модуль и происходит основной процессигры.
Игра будет продолжатьсядо тех пор, пока не будет разложен правильный расклад или до тех пор покапользователь не прервет игру при помощи клавиши ESC.
4.2Вспомогательные процедуры.
4.2.2procedure readFile;
После ввода именипользователя (пункт 4.1.7), информация добавляется в файл res.txt
4.2.3 procedurewriteFile;
Данная процедурасчитывает информацию с файла res.txt и выводит на экран полученные данные, аименно игроков, которые за наименьшее количество ходов разложили требуемуюкомбинацию.
4.2.4 procedurebonus;
Маленькая хитрость даннойпрограммы. Она предназначена для разработчика программы и для преподавателяпроверяющего правильность написания игры. Чтобы, при проверке, преподавателю нетребовалась проходить всю игру, достаточно нажать клавишу End на клавиатуре и расклад почти разолжется.Также эта процедура была бы очень полезна разработчику, для отладки итестирования программы.
4.3Основная программа.
В основной программе наэкране выводится Главное меню и в зависимости от выбранных пользователемдействий происходит взаимодействие с процедурами.
В действительностинекоторые процедуры можно было объединить, т.к. основная цель использованияпроцедур это исключение повторяющихся действий, а в данной программе некоторыепроцедуры используются один раз и их можно было записать в другие процедуры илиосновную программу, но, на мой взгляд, так гораздо удобнее, как припрограммировании, так и при проверки.
5. Описаниеалгоритма программы
Несмотря на простотуданной программы, написание алгоритма оказалось достаточно не простой задачей.В связи с этим пришлось разделить его, в целях его читаемости и доступности.
Основной алгоритмпрограммы разбит на четыре раздела (схема 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 на диске (каки в случае с файлами, пишем только имя и расширение файла, а не полный путь,для того чтоб в будущем можно было перемещать файлы программы).
5.3.2 Заполнениетабло случайными цифрами.
В памяти компьютера создаетсятабло, в котором, в дальнейшем будут производиться перестановки. Табло состоитиз шестнадцати клеток (четыре строки и четыре столбца), которое заполняетсяпятнадцатью, неповторяющимися цифрами от 1 до 15 и одной пустой клеткой.
Данный раздел реализованпри помощи процедуры Tablo. Фактически табло, которое описывается ранее это двумерный массив с цифрами от 1до 15 и ноль. Но отображение цифр на экране и ноля, вместо пустого элемента,делает табло не красивым. Отсюда следует, что двумерный массив, долженсодержать строковые или символьные элементы.
Следующем моментомреализации данной процедуры, является заполнение табло случайными цифрами. Длязаполнения табло случайными цифрами используется функция random, которая является генераторомслучайных цифр, но работает соответственно только с цифрами, а у нас строковыйдвумерный массив.
Проанализировав выше сказанное,приходим к тому, что необходимо создать два массива. Один одномерный изшестнадцати элементов типа integer,второй двумерный, четыре на четыре, типа string. Сначала одномерный массив, в случайном порядке,заполняется целыми неповторяющимися цифрами от 1 до 16, а затем в зависимостиот расположения цифр, заполняется двумерный строковый массив. К примеру, еслипервый элемент одномерного массива равен цифре 11 тогда первому элементудвумерного массива будет присвоено строка «11».
Общий алгоритм данногораздела заключается в следующем (Схема 4):
– Выбор случайногочисла;
– Проверка наналичие совпадений в массиве;
– Занесениеинформации в массив;
– Проверка заполненли массив;
– Заполнениедвумерного массива.
/>
Да
/>
/> Нет
/>
Нет
/>
/> Да
/>
Схема 4 – Раздел Табло
5.3.2.1 Выборслучайного числа.
Некоторой переменной b присваивается случайное число, при помощи функции random. При чем функция random ограничена интервалом от 1 до 16.
5.3.2.2 Проверкана наличие совпадений в массиве
Переменная b сравнивается с каждым элементом массива bs[i], при помощи инструкций For и if.Если такой элемент уже присутствует в одномерном массиве, тогда переменной b, вновь присваивается случайноечисло. Так происходит до тех пор, пока переменной b не будет присвоена цифра, которой еще нет в массиве.
5.3.2.3 Занесениеинформации в массив.
Значение переменной b, которое было найдено ранее,вносится в массив bs[i], за последним элементом внесенный вмассив
5.3.2.4 Проверказаполнен ли массив.
Программа проверяетзаполнен ли массив полностью, если нет, то алгоритм начинается с пункта5.3.2.1.
В итоге мы имеемодномерный массив заполненный, в случайном порядке неповторяющемся цифрами от 1до 16.
5.3.2.5 Заполнениедвумерного массива.
Заполнение двумерногомассива, при помощи инструкции For ипеременных i и j, которые обозначают столбец и строку.
Алгоритм заполнениядвумерного массива заключается в следующем:
– Первоначальнопеременной z присваивается единица. Даннаяпеременная нам необходима как счетчик.
– Каждому элементу j строки и iстолбца присваивается строковый элемент, в зависимости от цифры стоящей подномером z в одномерном массиве, если текущейэлемент одномерного массива содержит цифру 8, то текущему элементу двумерного массиваприсваивается строковый элемент «8 ». Исключением составляет цифра 16. В этомслучае в двумерный массив вводится пробел. Выбор строкового элементаосуществляется при помощи инструкции case.
– Так происходит дотех пор, пока двумерный массив не будет полностью заполнен.
5.3.3 Выводтабло.
В данном разделе наэкране появляется табло с текущей комбинацией цифр. Первоначально, таблозаполняется случайным образом п. 5.3.2, а в дальнейшем на экране будет отраженотекущее состояния цифр на табло, в зависимости от сделанных пользователемходов.
Данный раздел реализованв процедуре Vivod.
Общий алгоритм данногораздела заключается в следующем (Схема 5):
– Прорисовкаклеток;
– Прорисовка рамки;
– Вывод элементовмассива по верх клеток табло.
/>
Схема 5 — Раздел Вывод
5.3.3.1 Прорисовкаклеток.
Рисование клетокосуществляется в следующем порядке:
- Определенияразмера будущих клеток, при помощи двух переменных (h1, w1,координаты верхней левой и правой нижней точек);
- При помощи процедурыSetFillStyle, задаем нужный цвет и стильзаполнения. Цвет выберем синий, а стиль заполнения возьмем SolidFill – сплошная заливка текущем цветом,т.е. синим.
- При помощи процедурыBar вычерчиваем на экране квадрат.
- Чтобы данныедействия не повторять 16 раз, используем инструкцию For.
5.3.3.2 Прорисовкарамки.
Для того, чтобы таблоимело законченный вид, поместим ранее созданные клетки в рамку, при помощи процедурыLine.
5.3.3.3 Выводэлементов массива по верх клеток табло.
В итоге на экранепоявляется табло с шестнадцатью клетками, остается лишь в центр этих клетокпоместить цифры из двумерного массива.
Так как мы находимся вграфическом режиме, то для вывода элементов двумерного массива используемпроцедуру OutTextXY.
В итоге на экранепоявится достаточно аккуратное и не плохо оформленное табло с клетками, вцентре каждой из которых, находится цифра.
В будущем, когдапользователь будет перемещать клетки, он фактически будет совершать операции смассивом и на экран будет выводиться информация из массива, в которомосуществлена перестановка, а клетки останутся неизменными.
5.3.4 Поиск пустого элемента.
В данном разделеосуществляется поиск пустого элемента, чтобы в дальнейшем относительно негоможно было бы осуществлять передвижение
Данный раздел реализованв процедуре Poisk. Программа при помощи инструкции For и переменных i и j сравнивает каждый элемент двумерного массива AS, с пустым элементом, при помощи инструкцииIF и когда находит, присваиваетзначения переменных i и j переменным strok и stolb.Таким образом, переменные strok и stolb как бы являются координатами пустогоэлемента.
Общий алгоритм данногораздела заключается в следующем (Схема 6):
– Выбор элемента массива;
– Проверка,является ли данный элемент пробелом;
– Присвоениекоординат строки и столбца переменным.
/>
/>Нет Нет
/> Да
/>
Схема 6 — Раздел Поиск
5.3.4.1 Выборэлемента массива.
При помощи инструкции For поочередно будем выбирать каждыйэлемент массива.
5.3.4.2 Проверка,является ли данный элемент пробелом.
При помощи инструкции If, сравниваем каждый элемент массива спробелом.
5.3.4.3 Запоминаниекоординат пробела.
Переменным strok и Stolb присваиваем координаты пустого элемента.
5.3.5 Вводнаправления перехода.
В данном разделепользователю предлагается выбрать направление перехода клеток с цифрами,относительно пустой клетки. Выбор осуществляется при помощи курсора, наклавиатуре.
Данный раздел алгоритмареализован в процедуре Napravlenie.
Фактически некоторойпеременной ch (типа char) присваивается код нажатой клавиши.
Алгоритм процедурызаключается в следующем:
– Пользователю предлагается,при помощи курсора, ввести направления перехода.
– После того как пользователь,нажал кнопку на клавиатуре, код клавиши присваивается переменной ch, при помощи функции readkey.
К примеру, еслипользователь ввел направление курсора вверх, это означает, что пользовательнажал служебную клавишу под кодом 72.
5.3.6 Перемещениеэлементов табло.
В данном разделе, взависимости от направления перехода, выбранное ранее при помощи курсора, и местоположениепустой клетки, происходит перемещение:
- Стрелка влево –перемещает влево цифру, стоящую справа от пустой клетки;
- Стрелка вправо –перемещает вправо цифру стоящую слева от пустой клетки;
- Стрелка вниз –перемещает вниз цифру стоящую сверху от пустой клетки;
- Стрелка вверх –перемещает вверх цифру стоящую снизу от пустой клетки.
Данный алгоритмреализован в процедуре Zamena.
Общий алгоритм данногораздела заключается в следующем (Схема 7):
- Выбор направления перестановки;
- Перемещение клеток;
- Запись об очередном сделанном ходе.
/>
Схема 7 — Раздел Замена.
5.3.6.1 Выборнаправления перестановки.
Ранее пользователь сделалход, а это значит, что мы имеем нажатую служебную клавишу, под каким либономером. При помощи инструкции IF ифункции ord, выбирается направления перестановкиэлементов.
5.3.6.2 Перемещениеклеток.
В зависимости от значенийпеременных Strok, Stolb, которым было присвоено координаты пустого элемента вмассиве (5.3.4) и выбранного направления, осуществляется перемещение.
Например, пользовательввел направление курсора вверх, это означает, что пользователь нажал служебнуюклавишу под кодом 72, тогда, при помощи инструкции if и функции ord (if ord(ch)=72then), осуществляется перемещение.
Перемещениеосуществляется по следующему принципу: пустой клетки, а именно элементу массивас координатами as[strok,stolb], присваивается содержимое элемента стоящего подпустой клеткой (as[strok,stolb]:= as[strok+1,stolb];), а соответственно элементу, стоящему под пустойклеткой присваивается пробел (as[strok+1,stolb]:=' ';).
5.3.6.3 Запись обочередном сделанном ходе.
При запуске раздела Игра,некоторой переменной hod присваивается0. Это означает, что пользователь приступил к игре. После каждого сделанногохода, значение переменной hodувеличивается на единицу. В дальнейшем эта информация будет использована, приопределении лучших результатов.
5.3.7 Проверка.
В данном разделе программасравнивает текущую комбинацию цифр, с правильной комбинацией. Если расклады совпадают,то алгоритм выполнен и осуществляется переход к следующему пункту, в противномслучае, алгоритм вновь повторяется, начиная с пункта 5.3.3.
Данный раздел реализованв процедуре proverka.
По умолчанию логическаяпеременная prov равна false (ложь). Программа проверяет если элемент первойстроки и первого столбца равен 1, второй равен двум и т.д. и элемент последнейстроки и последнего столбца равен пустому элементу, то расклад считается,выполнен и переменной prov присваиваетсязначение true (истина).
5.3.8 Итог.
В данном разделе,программа считывает, за какое количество ходов игрок, выполнил требуемыйрасклад и сравнивает с результатами прошлых игр. Если игрок разложил табло забольшее количество ходов, чем это сделали игроки ранее, тогда программазавершает свою работу и переходит в Главное меню, в противном случае пользователюпредлагается ввести свое имя. В дальнейшем его имя будет, отображается в спискелучших игроков.
Данный раздел реализованв процедуре Mesto.
Общий алгоритм данногораздела заключается в следующем (Схема 8):
- Количество ходов;
- Считываниерезультатов из файла;
- Проверка, входитли данный результат в список лучших;
- Ввод имени;
- Перестановки вфайле результатов;
- Сохранениярезультатов в файл./> /> /> /> /> /> /> />
Перестановки результатов
Нет
/>
/> Да/> /> /> /> /> /> /> /> />
Схема — 8 Раздел Итог.
5.3.8.1 Количествоходов
В течение всей игры,программа записывает каждый сделанный ход. Таким образом, по завершению игры,т.е. когда пользователь разложил верный расклад, а не когда просто покинулигру, мы знаем точное количество ходов, за которое игрок разложил расклад(Количество ходов присваивается переменной hod).
5.3.8.2 Считываниерезультатов из файла.
В данном разделепрограмма считывает данные из файла res.txt и для удобства обработки этойинформации, вносит ее в два массива it и res. Массив it содержит информацию о количестве ходов, за которое игроки,игравшие ранее разложили расклад, массив res содержит имена этих игроков.
5.3.8.3 Проверка,входит ли данный результат в список лучших
В данном разделерезультат текущего игрока сравнивается с результатами игроков из массива it.
В случае если игроки,игравшие ранее разложили расклад за наименьшее количество ходов, то программазавершает свою работу и переходит в Главное меню, в противном случае программапродолжает свою работу (сл. пункт.)
5.3.8.4 Ввод имени.
Пользователю предлагаетсяввести свое имя, чтобы его имя и результат были сохранены в списке лучших игроков.
5.3.8.5 Перестановкив файле результатов.
В данном разделенеобходимо совершить перестановки в массиве, но нужно не просто удалить какойто элемент, а на его место поставить текущий результат, нужно осуществить сдвигвсех элементов на один, а если текущей результат будет десятым, то заменитьего.
Эту задачу можно решитьнесколькими способами. Один из способов, это совершать перестановкинепосредственно в массивах it и res и осуществлять сдвиг элементов, но,на мой взгляд, наиболее простой способ, это создать еще два массива, дляудобства назовем их itv и resv, и в результате совершить простейшиеоперации перемещения элементов из одного массива в другой. Эти операциисовершим по следующей схеме:
При помощи инструкции For сравниваем каждый элемент массиварезультатов (it), с результатом текущего игрока(переменная hod). Если результат игрока из массива it меньше результата текущего игрока,то результат и имя игрока из массива it и res присваиваем массивам itv и resv. Если результат текущего игрока меньше чем очереднойэлемент массива it и большепредыдущего элемента массива it, торезультат текущего игрока вносится в очередной элемент массивов itv и его имя присваивается очередномуэлементу массива resv, а результаттекущего элемента массивов it и res добавляется в массивы itv и resv за результатами текущего игрока. Соответственно когдаинструкция For начнет сравнивать следующий элементмассива it, то результат текущего игрока, будетменьше, как текущего так и предыдущего элементов массива it, а это не удовлетворяет условию. Этоозначает, что очередной элемент массивов it и resпросто добавится за последним элементом массивов itv и resv.Так будет происходить пока массивы itv и resv не будут полностью заполнены, а последнийэлемент массивов it и res, соответственно не войдут, во вновьсозданный список лучших игроков, которые описаны в массивах itv и resv. В итоге мы осуществим сдвиг результатов на однупозицию.
Для более полногоописания данной процедуры рассмотрим пример:
В таблице 3 расположеныдве строки. В верхней содержатся элементы массива it, а в нижней массива res.
Таблица 3 – Массивы it и res.It 10 20 30 40 50 60 70 80 90 95 res A B C D E F G H K L
Предположим, что текущийигрок, под именем Z, победил за 44хода.
Программа начинает искатьв каком интервале расположен текущей результат (44). Для этого каждый элементмассива it сравнивается с переменной hod. Если первый элемент меньше 44, тоего имя и результат переносится в массивы itv и resv,если следующий элемент меньше 44, то и его переносят в массивы itv и resv (таблица 4)
Таблица 4 – Массивы it и res.Itv 10 20 resv A B
Так происходит до тех порпока, программа не найдет элемент в массиве it, который больше 44, но при этом программа проверяет, что 44больше и предыдущего элемента массива it. Если данное условие выполняется, то программа добавляет результат и имятекущего игрока под именем Z, вмассивы itv и resv соответственно, а текущий результат из массивов it и res, также добавляется в массив, но уже за результатамиигрока Z (Таблица 5).
Таблица 5 – Массивы it и res.Itv 10 20 30 40 44 50 resv A B C D Z E
У нас получилось, что 44меньше 50, но больше 40, по этому за результатом 40 добавили 44, а за нимтекущий элемент с результатом 50.
Далее, при проверкирезультата 44 со следующем элементом с результатом 60, 44 будет меньшерезультата 60, но 44 и меньше результата 50, а следовательно, условие невыполняется и игрок с результатом 60 переносится в массивы itv и resv. Так происходит пока оба массива itv и resv, не будут заполнены. А последний результатсоответственно исчезнет (Таблица 6)
Таблица 6 – Массивы it и res.Itv 10 20 30 40 44 50 60 70 80 90 resv A B C D Z E F G H K
На первый взгляд, вседостаточно усложнено, но при создании алгоритма перестановки непосредственновнутри массивов it и res, получается еще хуже.
5.3.8.6 Сохранениярезультатов в файл.
В данном разделеинформация из массивов itv и resv вносится в файл res.txt. Данный файл открывается в режиме перезаписи иинформация в файле обновляется и когда пользователь выдя в Главное меню зайдетв раздел Результаты, он уже уведет обновленную информацию из файла res.txt и соответственно и свой результат.
5.4 Результаты.
В данном разделе дляпользователя отображается информация о лучших игроках, которые за наименьшееколичество ходов собрали требуемую комбинацию.
Данный раздел реализованпри помощи процедуры result.Данная процедура считывает информацию из файла res.txt и выводит считанную информацию на экран дляознакомления пользователю.
Реализована даннаяпроцедура, точно таким же способом, как и в разделе 5.1 Описание, заисключением, того, что обращение происходит к файлу res.txt, по этому подробно останавливаться на данномразделе не имеет смысла.
6. Описание входныхи выводных данных
В таблице 7 описываютсявходные и выходные данные, которые выстроены примерно в том порядке, в которомони должны взаимодействовать с пользователем
Таблица 7 Описаниевходных и выходных данныхВходные Выходные
2. Выбор раздела в Главном меню программы
4. Ввод при помощи курсора направления перехода:
- Влево;
- Вправо;
- Вверх
- Вниз;
- ESC – покинуть игру в любой момент
5. Ввод имени в случае победы за наименьшее количество ходов.
1. Отображение на экране Главного меню
3. Вывод на экран ранее выбранного раздела:
- Описание – вывод на экран описание программы
- Управление – вывод на экран информацию о клавишах управления
- Результаты – вывод на экран списка лучших игроков
- Игра – Вывод на экран табло с комбинацией цифр
7. Программноеи аппаратное обеспечение программы.
Для запуска игрыдостаточно любого компьютера, на котором установлена хоть какая-нибудьоперационная система, семейство Windows.
8. Руководствопользователя
9.
8.1. Для запуска программы необходимозапустить файл Super15.exe. Откроется Главное меню (Рисунок 1)
/>
Рисунок 1 – Главное меню
Основное меню содержитпять пунктов:
1. Описание (About program).
2. Управление (Key).
3. Игра (Play).
4. Результаты (Results).
5. Выход (Exit).
Перемещаясь при помощикурсора вверх или вниз, можно выбирать интересующие Вас меню.
8.2 При первом запуске программыпользователю рекомендуется прочитать раздел Описание (Рисунок 2), в которомуказанно:
- Назначениепрограммы;
- Разработчик;
- Описаниепрограммы;
/>
Рисунок 2 – Окно Описание
8.3 РазделУправление.
Здесь пользователювыводится на экран клавиши управления (Рисунок 3).
/>
Рисунок 3 — Управление
8.4 РазделИгра.
При переходе в этотраздел перед пользователем открывается основное табло игры (Рисунок 4), накотором расположены 15 цифр, заполненные в случайном порядке и одно пустоеполе.
/>
Рисунок 4 – Основноеигровое поле.
Управление происходит припомощи клавиш курсора:
- Стрелка влево –перемещает влево цифру, стоящую справа от пустой клетки;
- Стрелка вправо –перемещает вправо цифру стоящую слева от пустой клетки;
- Стрелка вниз –перемещает вниз цифру стоящую сверху от пустой клетки;
Стрелка вверх –перемещает вверх цифру стоящую снизу от пустой клетки.
Пользователю необходимопри помощи курсора перемещать клетки табло, до тех пор, пока на экране неотобразится, последовательная комбинация цифр, как показано на рисунке 5
/>
Рисунок 5 – Игровое полес правильно заполненной, комбинацией.
В течение всей игры,пользователь в любой момент может покинуть игру, для этого достаточно нажатьклавишу ESC и игра завершает свою работу, а наэкране появится Главное меню программы.
В течение всей игры,программа считает каждый ход игрока и если игрок раскладывает требуемуюкомбинацию, за меньшее количество ходов, чем это сделали игроки ранее, то послепобеды, пользователю предлагается ввести свое имя и информация об игроке,который разложил расклад быстрее, заносится в список лучших игроков (Рисунок 6).
/>
Рисунок 6 — Ввод имени
8.5 пунктРезультаты.
В данном разделе менюможно посмотреть результаты лучших игроков (Рисунок 7), а именно тех игроков,которые собрали требуемую комбинацию за наименьшее количество ходов.
На экране небольшаятабличка в левом столбце Moveзаписано количество ходов, а в правом Name имя игрока.
/>
Рисунок 7 – Список лучшихигроков
8.5Последний пункт меню Выход.
При нажатии на данныйпункт меню, программа завершает свою работу.
10. Заключение
Не смотря на внешне кажущуюсяпростоту данной программы, он таит в себе ряд сложностей, которые реализуются сиспользованием всех основных приемов Турбо Паскаль. Вообще Турбо Паскаль каксреда программирование уже давно устарела, но основы, которые лежат в средепрограммировании в Турбо Паскаль, лежат в болшенстве известных и популярныхприложений. На мой взгляд, изучая программирование в Турбо Паскаль, можноосвоить основные приемы программирования.
Целью данной курсовойработы, являлось углубление знаний и расширение навыков по разработкеалгоритмов и их реализации на персональном компьютере, на мой взгляд,разработанная мной программа, вполне отвечает поставленным целям. Особенностямиданной программы является:
- Четко построенныйалгоритм;
- Интуитивнопонятный интерфейс;
- Удобноеуправление;
- Простота виспользовании;
- Вполне понятноеруководство пользователя;
- Отсутствие лишнихдополнений.
11. Списоклитературы
10.1 Учебное пособие.«Основы алгоритмизации и программирования», Е. Н. Сафьяновой
10.2 Самоучитель.«Программирование в Turbo Pascal», Н. Культин.
10.3 Открытие Интернетисточники.
Приложение 1 Листингпрограммы
program Game;
uses crt,Graph;
var
as:array[1..4,1..4] ofstring; {Двухмерный массив, содержит элементы табло}
bs:array[1..16] ofinteger; {Массив для заполнения случайными числами}
men:array[1..5] ofinteger; {Массив выводи элементы Главного меню}
res:array[1..10] ofstring; {Имена игроков с лучшими результатами}
it:array[1..10]of integer; {Результаты лучшихигроков}
resv:array[1..10] ofstring; {Массив со вновь сформированным списком лучших игроков}
itv:array[1..10] ofinteger; {Массив со вновь сформированным списком результатов лучших игроков}
i,j:integer; {Переменныедля работы с массивами}
strok, stolb:integer;{Координаты пустого элемента}
hod:integer; {Счетчик,считывает каждый ход сделанный пользователем}
lom:integer; {Переменнаядля работы с Главным меню}
name:string; {Имяигравшего пользователя}
ch:char; {Переменная,которой присваивается код нажатой клавиши на клавиатуре}
prov:boolean;{Проверкаправильности расклада}
f: text; {файловаяпеременная}
procedure Vivod;
{Процедура вывода наэкран табло с цифрами сформированное на момент отображения}
var lx,ly:integer;{Координаты вывода двухмерного массива}
x,y:integer; {Координатыклеток}
j1,i1:integer;{Переменные счетчики, для рисование клеток}
w1,h1:integer; {Ширина ивысота клеток}
begin
OutTextXY(210,50,'Forleaving press ESC');
w1:=30;
h1:=30; {Клетка размером30 на 30}
for i1:=0 to 3do {Цикл, прорисовки клеток}
for j1:=0 to 3do
begin
x:=235+j1*35; {Сдвиг клеток по х}
y:=150+i1*35; {Сдвигклеток по у}
setFillStyle(1,1); {Цвети стиль клеток, цвет синий, стиль заполнение текущем цветом}
Bar(x,y,x+w1,y+h1);{Рисование клетки}
end;
lx:=245;
ly:=162;
for i:=1 to 4 do {Циклвывода двухмерного массива по вверх клеток}
begin
for j:=1 to 4do
begin
OutTextXY(lx,ly,as[i,j]);{Вывод текстана экран}
lx:=lx+35;
end;
lx:=245;
ly:=ly+35;
end;
line(220,135,220,300); {Рисование рамки}
line(385,135,385,300);
line(220,135,385,135);
line(220,300,385,300);
end;
procedureTablo;
{Формирование табло припервом запуске заполненное случайными и неповторяющимися цифрами}
var b:integer;{Переменная, которой присваивается случайное число}
k,z:integer;{Счетчики дляопераций с массивами}
begin
randomize;
For z:=1 to 16do
begin
b:=random(15); {Выборслучайного числа}
k:=1;
while k17 do{Цикл пока не будет заполнен массив с целыми цифрами}
begin
if bs[k]=bthen
begin
b:=random(17);
k:=1;
end
else k:=k+1;
end;
bs[z]:=b; {Присвоениеочередного неповторяющегося элемента массива}
end;
z:=1;
for i:=1 to 4 do{Заполнение двухмерного массива, вместо цифр из одномерного, присваиваются строковые элементы}
begin
for j:=1 to 4do
begin
case bs[z] of
1: as[i,j]:='1';
2: as[i,j]:='2';
3: as[i,j]:='3';
4: as[i,j]:='4';
5: as[i,j]:='5';
6: as[i,j]:='6';
7: as[i,j]:='7';
8: as[i,j]:='8';
9: as[i,j]:='9';
10:as[i,j]:='10';
11:as[i,j]:='11';
12:as[i,j]:='12';
13:as[i,j]:='13';
14:as[i,j]:='14';
15:as[i,j]:='15';
16:as[i,j]:=' ';
end;
z:=z+1;
end;
end;
vivod; {Вывод табло наэкран}
end;
Procedure Poisk;
{Поиск пустого элемента втабло}
begin
for i:=1 to 4do
begin
for j:=1 to 4do
begin
if as[i,j] =' ' Then {Поиск, равен ли текущий элемент пробелу}
begin
Strok:=i; {Если равен, топрисваиваются координаты пустого элемента}
Stolb:=J
end;
end;
end;
end;
procedurebonus;
{Бонус, для проверки. При нажатии клавиши END на клавиатуре расклад собирается}
begin
as[1,1]:='1';as[1,2]:='2 ';as[1,3]:='3 ';as[1,4]:='4 ';
as[2,1]:='5';as[2,2]:='6 ';as[2,3]:='7 ';as[2,4]:='8 ';
as[3,1]:='9';as[3,2]:='10';as[3,3]:='11';as[3,4]:='12';
as[4,1]:='13';as[4,2]:='14';as[4,4]:='15';as[4,3]:=' ';
Strok:=4;Stolb:=3;
end;
procedurenapravlenie;
{Ввод направленияперехода}
begin
ch:=readkey; {Переменнойприсваивается код нажатой пользователем клавиши на клавиатуре}
end;
procedure Zamena;
{Передвижение клеток сцифрами в зависимости от выбора пользователя}
begin
napravlenie; {Процедура,ввод направления перехода}
if ord (ch)=79 thenbonus; {Если нажата клавиша END на клавиатуре то расклад сам собирается}
if ord(ch)=75 then {Еслинажата клавиша влево}
begin
if stolb4 then{Если это не последний элемент, стоящий у границы табло}
begin
as[strok,stolb]:=as[strok,stolb+1];{На место пустого элемента присваивается элемент стоящий справа от пустого}
as[strok,stolb+1]:=' '; {Элементустоящему справа от пустого присваивается пустой элемент}
stolb:=stolb+1; {Новаякоордината пустого элемента}
hod:=hod+1; {Очереднойсделанный ход}
end;
end;
if ord(ch)=72then {Если нажатаклавиша вверх}
begin
if strok4 then{Если это не последний элемент, стоящий у границы табло}
begin
as[strok,stolb]:=as[strok+1,stolb];{На место пустого элемента присваевается элемент стоящий снизу от пустого}
as[strok+1,stolb]:=' ';{Элементу стоящему снизу от пустого присваевается пустой элемент}
strok:=strok+1;{Новаякоордината пустого элемента}
hod:=hod+1; {Очереднойсделанный ход}
end;
end;
if ord(ch)=77then {Если нажатаклавиша вправо}
begin
if stolb1 then{Если это не последний элемент, стоящий у границы табло}
begin
as[strok,stolb]:=as[strok,stolb-1];{На место пустого элемента присваивается элемент стоящий слева от пустого}
as[strok,stolb-1]:=' ';{Элементу стоящему слева от пустого присваивается пустой элемент}
stolb:=stolb-1; {Новаякоордината пустого элемента}
hod:=hod+1; {Очереднойсделанный ход}
end;
end;
if ord(ch)= 80then {Если нажатаклавиша вниз}
begin
if strok1 then{Если это не последний элемент, стоящий у границы табло}
begin
as[strok,stolb]:=as[strok-1,stolb];{Наместо пустого элемента присваивается элемент стоящий сверху от пустого}
as[strok-1,stolb]:=' ';{Элементу стоящему сверху от пустого присваивается пустой элемент}
strok:=strok-1; {Новаякоордината пустого элемента}
hod:=hod+1; {Очереднойсделанный ход}
end;
end;
Vivod;
end;
procedure readFile;
{Добавляет в файлинформацию о лучших результатах}
begin
assign(f,'res.txt');{Объявления файла}
reset(f); {Открытиефайла}
j:=1;
for i:=1 to 10 do
begin
readln(f,res[i]);{Занесение имен лучших игроков из файла в массив}
readln(f,it[j]);{Занесение результатов лучших игроков в массив}
j:=j+1; {Счетчик длялучших результатов}
end;
close(f);
end;
procedurewriteFile;
{Считывает файл с лучшимирезультатами}
begin
assign(f,'res.txt'); {Объявлениефайла}
rewrite(f);{Открытие врежиме перезаписи}
for i:=1 to 10 do
begin
writeln(f,resv[i]);writeln(f,itv[i]);{Внесение информации о лучших игроках и их результатах из массивов в файл}
end;
close(f);
end;
procedure Mesto;
{Процедура в которойустанавливается занял ли игрок какое либо место, если да то занесение в списоклучших игроков}
var chetcik:integer;{Счетчик, объявляет что информация о лучим игроке уже внесена, повторнойинформации не должно быть}
begin
if prov = true then {Еслиигрок разложил расклад}
begin
readfile; {Процедурасчитывание информации из файла с лучшими результатами}
chetcik:=0;
j:=1;
for i:=1 to 10do
begin
if(hod=it[i-1]) and (chetcik
begin
{Ввод имени игрока}
OutTextXY(132,325,'willEnter name and press Enter:');
line(400,338,530,338);
GoToXY(52,21);
read(name);
{Присвоение очередномуэлементу данных текущего игрока}
itv[i]:=hod;
resv[i]:=name;
j:=j+1;
chetcik:=1;
end;
{Перенос из одногомассива в другой}
if j
begin
itv[j]:=it[i];
resv[j]:=res[i];
j:=j+1;
end;
end;
writeFile; {Сохранениеинформации в файл}
OutTextXY(230,360,'Forleaving press ENTER');
readln;
end;
end;
procedureproverka;
{Проверка правильно лиразложено табло}
begin
prov:=false;
if (as[1,1]='1') and (as[1,2]='2 ') and (as[1,3]='3 ') and (as[1,4]='4 ')
and(as[2,1]='5 ') and (as[2,2]='6 ') and (as[2,3]='7 ') and (as[2,4]='8 ')
and(as[3,1]='9 ') and (as[3,2]='10') and (as[3,3]='11') and (as[3,4]='12')
and(as[4,1]='13') and (as[4,2]='14') and (as[4,3]='15') and (as[4,4]=' ')
then
begin
prov:=true; {Если таблоразложено верно, то ИСТИНА}
OutTextXY(230,100,'CongratulateYou have won');
Mesto; {Процедура,устанавливающая на каком месте текущий пользователь}
end;
end;
procedure Game15;
{Подключение графики ипереход в режим ИГРЫ}
var grMode:integer;{Режим работы видеосистемы}
grPath:string;{Путь к файлу}
grDriver:integer;{Используемыйпрограммой драйвер видеоадаптера}
begin
hod:=0;
grDriver:=VGA;
grmode:=VGAHi;
grPath:='EGAVGA.BGI';
initGraph(grDriver,grMode,grPath); {Инициализация графического режима}
Tablo; {Формированиетабло}
Poisk; {Поиск пустогоэлемента}
repeat {Цикл, пока ненажата клавиша ESC или пока игрок не победил играть}
Zamena; {Передвижение вмассиве}
proverka; {Проверкаявляется ли данный расклад верным}
until (ord (ch)=27)or (prov=true);
closeGraph; {Закрытие графическогорежима}
end;
procedure help;
{Переход в режим справки}
var f: text; {Файловаяпеременная}
g1:string; {Переменнаядля работы со строками в файле}
begin
clrscr;
assign(f,'fhelp.txt');{Объявление файла}
reset(f); {Открытиефайла}
readln(f,g1);writeln(g1); {Присвоение переменной строки файла и вывод ее на экран}
readln(f,g1); writeln(g1);
readln(f,g1); writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
writeln('Forleaving press ENTER');
readln;
close(f);{Закрытие файла}
end;
procedureresult;
{Отображение лучшихигроков}
begin
clrscr;
GoToXY(26,5);
writeln('Bestplayers');
assign(f,'res.txt');
reset(f);
readfile; {Считываниеинформации из файла лучших результатов}
{Вывод на экран в строгомпорядке имена и результаты лучших игроков}
GoToXY(26,8);write('Move Name');
GoToXY(26,10);write(it[1]);GoToXY(36,10); writeln(res[1]);
GoToXY(26,11);write(it[2]);GoToXY(36,11);writeln(res[2]);
GoToXY(26,12);write(it[3]);GoToXY(36,12);writeln(res[3]);
GoToXY(26,13);write(it[4]);GoToXY(36,13);writeln(res[4]);
GoToXY(26,14);write(it[5]);GoToXY(36,14);writeln(res[5]);
GoToXY(26,15);write(it[6]);GoToXY(36,15);writeln(res[6]);
GoToXY(26,16);write(it[7]);GoToXY(36,16);writeln(res[7]);
GoToXY(26,17);write(it[8]);GoToXY(36,17);writeln(res[8]);
GoToXY(26,18);write(it[9]);GoToXY(36,18);writeln(res[9]);
GoToXY(26,19);write(it[10]);GoToXY(36,19);;writeln(res[10]);
GoToXY(26,23);writeln('Forleaving press ENTER');
readln;
end;
procedure avtor;
{Вывод общей информациина экран в раздел описание }
var f: text; {Файловаяпеременная}
g1:string; {Переменнаякоторой присваивается очередная строка из файла и выводится на экран}
begin
clrscr;
assign(f,'fhelp1.txt');
reset(f);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
readln(f,g1);writeln(g1);
writeln('For exitpress ENTER');
readln;
close(f);
end;
begin
{Основная программа}
{Вывод на экран главногоменю}
{Элементы Главного меню,один из которых закрашен белым цветом, а остальные зеленым}
men[1]:=15;
men[2]:=2;
men[3]:=2;
men[4]:=2;
men[5]:=2;
repeat
clrscr;
strok:=1; {Текущая строка}
Lom:=1;
{Выбор цветов}
GoToXY(32,10);Textcolor(men[1]); writeln('Key');
GoToXY(32,11);Textcolor(men[2]); writeln('About program');
GoToXY(32,12);Textcolor(men[3]); writeln('Play');
GoToXY(32,13);Textcolor(men[4]); writeln('Results');
GoToXY(32,14);Textcolor(men[5]); writeln('Exit');
ch:=readkey; {Выборнаправления передвижение элементов меню}
if (ord(ch)=80) then{Если вниз тогда текущий становится белым, а нижний становится зеленым}
begin
for i:=1 to 5do
begin
if (men[i]=15)and (strok5) then
begin
men[strok]:=2;
men[strok+1]:=15;
end
elsestrok:=strok+1;
end;
end;
if ord(ch)=72 then {Есливверх, то текущий белым, а верхний зеленым}
begin
for i:=1 to 5do
begin
if (men[i]=15)and (strok1)then
begin
men[strok]:=2;
men[strok-1]:=15;
end
elsestrok:=strok+1;
end;
end;
if ord(ch)=13then {Если нажат ENTER}
begin
for i:=1 to 5do
begin
if men[i]=15then
begin
if Lom=1 thenbegin Help; break; end; {Переход в режим справки}
if Lom=2 thenbegin avtor; break; end; {Переход в режим игры}
if Lom=3 thenbegin Game15;break; end; {Переход в режим игры}
if Lom=4 thenbegin result;break; end; {Переход в режим игры}
end
elseLom:=Lom+1;
end;
end;
until Lom=5 {До тех порпока не нажат пункт EXIT}
end.
Приложение2 Результаты работы.
Для демонстрациирезультата работы программы, возьмем основной раздел ИГРА.
При запуске программыпоявляется табло, заполненное случайными неповторяющееся цифрами от 1 до 15 иодин пустой элемент (Рисунок 8).
/>
Рисунок 8 – Основноетабло со случайными числами
/>Далее пользователю предлагается сделать ход. К примерыпереместить цифру /> на пустое место. Для этогонеобходимо нажать клавишу (вверх) на клавиатуре. В результате цифра одинпереместится вверх, а пустая клетка перемещается на место единицы (Рисунок 9).
/>
Рисунок 9 – Первый ход
В дальнейшем перемещая поодной клетки, при помощи курсора, расклад будет выполнен. Весь процесс до победыможет занять очень много ходов, поэтому перейдем к предпоследнему моменту.
К примеру, игрок долгоиграл и у него выпал следующий расклад (Рисунок 10).
/>
Рисунок 10 – очереднойход.
Теперь пользователюнеобходимо сделать один, последний ход, а именно переместить клетку с цифрой 15на пустой элемент. В результате расклад будет выполнен (Рисунок 11).
В случае если игрокразложил требуемый расклад за наименьшее количество ходов, чем игроки, игравшиеранее, то пользователю предлагается ввести имя и в дальнейшем его имя ирезультаты будет отображаться в разделе Результаты (Рисунок 11).
/>
Рисунок 11 – конец игры