- Стрелка вниз – перемещает вниз цифру стоящую сверху от пустой клетки;
- Стрелка вверх – перемещает вверх цифру стоящую снизу от пустой клетки.
Данный алгоритм реализован в процедуре Zamena.
Общий алгоритм данного раздела заключается в следующем (Схема 7):
- Выбор направления перестановки;
- Перемещение клеток;
- Запись об очередном сделанном ходе.
Схема 7 - Раздел Замена.
5.3.6.1 Выбор направления перестановки.
Ранее пользователь сделал ход, а это значит, что мы имеем нажатую служебную клавишу, под каким либо номером. При помощи инструкции IF и функции ord, выбирается направления перестановки элементов.
5.3.6.2 Перемещение клеток.
В зависимости от значений переменных 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]:=' ';).
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
Страницы: 1, 2, 3, 4, 5, 6