Рисование клеток осуществляется в следующем порядке:
- Определения размера будущих клеток, при помощи двух переменных (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 (iford(ch)=72 then), осуществляется перемещение.
Перемещение осуществляется по следующему принципу: пустой клетки, а именно элементу массива с координатами 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, и в результате совершить простейшие операции перемещения элементов из одного массива в другой. Эти операции совершим по следующей схеме: