|
Несмотря на то, что ЭКВМ предназначены не для игр, на них можно выполнять игровые программы. Быстродействия клавишных ЭВМ достаточно даже для динамических игр с ограниченным количеством движущихся объектов. На примере известной игры "Питон" (он же "Червяк" или "Змейка") рассмотрим способы работы с графическим экраном, выполнение опроса клавиатуры без останова программы, а также косвенную адресацию массива координат.
|
На специализированных игровых машинах, а также на персональных компьютерах, КПК, смартфонах, телефонах и т.п. эта игра выглядит более красочно. Но суть игры и структура программы от качества графики принципиально не изменятся, а в программе размером 360 байт разобраться куда легче.
Игровая программа "Питон" для ЭКВМ "Электроника МК"
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
000 |
Cx |
П 9 |
П А |
П С |
РР П |
90 |
10 |
РР П |
90 |
01 |
010 |
РР П |
90 |
03 |
1 |
РР П |
90 |
02 |
2 |
П 7 |
3 |
020 |
2 |
П 3 |
П 4 |
П 8 |
6 |
4 |
П В |
2 |
2 |
0 |
030 |
Р П |
17 |
4 |
5 |
0 |
Р П |
16 |
Cx |
ИП В |
РР П |
040 |
90 |
00 |
6 |
3 |
ИП В |
РР П |
90 |
12 |
Cx |
B↑ |
050 |
8 |
5 |
РР П |
90 |
00 |
3 |
2 |
2 |
РР П |
90 |
060 |
21 |
1 |
РР П |
90 |
03 |
РР ИП |
90 |
55 |
Р П |
18 |
070 |
Р ПП |
03 |
11 |
ИП 3 |
- |
F x≠0 |
70 |
ИП Е |
ИП D |
РР П |
080 |
90 |
11 |
ИП 7 |
2 |
× |
П 0 |
ИП 8 |
П 5 |
ИП 3 |
К П 5 |
090 |
F L0 |
89 |
5 |
РР П |
90 |
50 |
РР ИП |
90 |
29 |
K NOT |
100 |
F x≠0 |
31 |
Р ИП |
17 |
- |
F x≠0 |
23 |
F x<0 |
27 |
1 |
110 |
+ |
F x=0 |
17 |
1 |
/-/ |
БП |
18 |
1 |
П А |
Cx |
120 |
П 9 |
БП |
31 |
1 |
/-/ |
БП |
28 |
1 |
П 9 |
Cx |
130 |
П А |
ИП 9 |
F x=0 |
40 |
ИП А |
F x=0 |
40 |
Р БП |
02 |
87 |
140 |
ИП 9 |
ИП 3 |
+ |
П 3 |
F x<0 |
50 |
ИП В |
+ |
БП |
54 |
150 |
ИП В |
- |
F x≥0 |
55 |
П 3 |
ИП А |
ИП 4 |
+ |
П 4 |
F x<0 |
160 |
65 |
ИП В |
+ |
БП |
69 |
ИП В |
- |
F x≥0 |
70 |
П 4 |
170 |
ИП 4 |
ИП 3 |
РР ИП |
90 |
11 |
P x≠0 |
02 |
54 |
ИП 4 |
ИП Е |
180 |
- |
P x=0 |
03 |
28 |
ИП 3 |
ИП D |
- |
P x=0 |
03 |
28 |
190 |
ИП 8 |
ИП 7 |
2 |
× |
+ |
1 |
- |
П 5 |
2 |
+ |
200 |
П 6 |
К ИП 5 |
К П 6 |
К ИП 5 |
К П 6 |
ИП 7 |
1 |
+ |
П 7 |
Р ИП |
210 |
16 |
- |
F x≥0 |
17 |
Р ИП |
16 |
П 7 |
2 |
0 |
B↑ |
220 |
8 |
0 |
РР П |
90 |
00 |
Cx |
B↑ |
3 |
ИП С |
1 |
230 |
+ |
П С |
РР П |
90 |
24 |
4 |
4 |
0 |
ИП 8 |
РР П |
240 |
90 |
52 |
Р ПП |
03 |
11 |
РР ИП |
90 |
11 |
F x=0 |
42 |
250 |
F O |
РР П |
90 |
11 |
ИП 7 |
П 0 |
2 |
× |
ИП 8 |
+ |
260 |
П 1 |
2 |
+ |
П 2 |
К ИП 1 |
К П 2 |
К ИП 1 |
К П 2 |
F L0 |
64 |
270 |
4 |
РР П |
90 |
01 |
ИП 7 |
2 |
× |
ИП 8 |
+ |
1 |
280 |
- |
П 5 |
К ИП 5 |
К ИП 5 |
РР П |
90 |
11 |
0 |
РР П |
90 |
290 |
01 |
ИП 8 |
1 |
- |
П 5 |
ИП 4 |
К П 5 |
ИП 3 |
К П 5 |
РР П |
300 |
90 |
11 |
К ГРФ |
РР ИП |
90 |
50 |
F x=0 |
03 |
Р БП |
00 |
310 |
92 |
К СЧ |
ИП В |
× |
K [x] |
П Е |
К СЧ |
ИП В |
× |
k [x] |
320 |
П D |
В/О |
8Fh |
A8h |
E2h |
AEh |
ADh |
00h |
РР ИП |
90 |
330 |
55 |
К МС→Г |
Р ИП |
18 |
К МС→Г |
- |
F x<0 |
43 |
2 |
4 |
340 |
+ |
БП |
36 |
К Г→МС |
П 0 |
Cx |
ИП 0 |
K [x] |
6 |
0 |
350 |
× |
ИП 0 |
K {x} |
1 |
0 |
0 |
× |
+ |
ИП С |
С/П |
Программа загружается и запускается с нулевого адреса. После загрузки нажать "В/О", "С/П".
|
Цель игры - собрать как можно больше призов за меньшее время. Призы выводятся как отдельные точки на игровом поле (слева). Количество собранных призов выводится справа. После каждого собранного приза питон удлинняется, но не более максимального значения, записываемого в R16 в адресах 32-36. Сбор приза подтверждается звуковым сигналом, частота которого (высота тона) задается в адресах 235-237. Для отключения звука следует записать по этим адресам нули.
|
Управление питоном производится при помощи клавиш со стрелками: ←,↑,↓,→. Сразу после запуска программы питон неподвижен до нажатия любой клавиши. Игровое поле замкнуто (тороидальная топология), то есть ушедший вправо питон вылезет слева и т.п. Питону нельзя пересекать самого себя.
После окончания игры (самопересечения) в регистре X выводится число собранных призов, в регистре Y - потраченное время в формате "М,С".
Приведенную программу следует рассматривать как основу для более интересных игр. При желании она может быть усовершенствована. Например, добавлено большее количество жизней (допустимое количество самопересечений), различные типы призов, препятствия. Возможна реализация и сетевого варианта игры - несколькими питонами на общем игровом поле, с обменом данными между ЭКВМ по параллельному или последовательному порту.
Структура программы "Питон"
Краткое описание структуры программы приведено ниже в таблице. Программа использует следующие регистры:
R0 - вспомогательная переменная для организации циклов;
R1, R2 - вспомогательные переменные для косвенной адресации с автодекрементом;
R5, R6 - вспомогательные переменные для косвенной адресации с автоинкрементом;
R3, R4 - координаты головы питона X и Y соответственно;
R7 - текущая длина питона (от 2 до 450 в программе);
R8 - база для косвенной адресации массива координат точек питона (т.е. младший регистр массива, в программе 32);
R9 RA - текущее изменение координат питона на каждом шаге по X и Y соответственно (числа -1,0,1);
RB - константа 64;
RC - счетчик призов;
RD, RE - координаты очередного приза X и Y соответственно;
R16 - максимальная длина питона (450 в программе);
R17 - константа 220 (для опроса клавиатуры);
R18 - время старта программы (из часов реального времени).
Все начальные значения регистров инициализируются в программе. Данный подход имеет как плюсы, так и минусы. Это освобождает от необходимости занесения значений в регистры перед запуском программы, но для корректировки значений по умолчанию требуется редактировать саму программу.
Адрес |
Выполняемые действия |
00-36 |
Занесение начальных значений в регистры. Инициализация и очистка графического экрана |
37-47 |
Отрисовка вертикальной линии в центре экрана |
48-60 |
Вывод строки "Питон", записанной с адреса 322 Примечание: Шрифт надписи в программе не соответствует виду экрана на фотографии - разные версии игры |
61-64 |
Установка шрифта 1 в R9003. Примечание: Если вставить эти команды до вывода строки в R9021 (по адресам 55-61), надпись будет выводиться крупным шрифтом, как на фотографии |
65-69 |
Запись времени начала игры из часов реального времени R9055 в R18 |
70-76 |
Выбор координат приза так, чтобы координата X приза не совпадала с координатой X головы питона. Координата Y не проверяется, для несовпадения точек достаточно и одной. Координаты устанавливаются в подпрограмме по адресу 311 |
77-81 |
Отрисовка приза точкой (R9011) |
82-91 |
Подготовка переменных R0, R5 и цикл занесения начальных координат в массив точек питона. Здесь координаты X и Y всех начальных точек совпадают, поскольку берутся из одного регистра R3. |
92-95 |
Задание минимального времени одного шага питона в сотых долях секунды в таймере R9050. В программе минимальное время одного шага составляет 0,05 сек, т.е. скорость питона не более 20 пикселей в секунду. Для изменения можно заменить 5 на другое число |
96-101 |
Считывание скан-кода нажатой клавиши из R9029, и его инвертирование. Если ни одна клавиша не нажата, переход на адрес 131 |
102-130 |
Проверка скан-кода нажатой клавиши. Установка содержимого R9, RA в соответствии с кодом клавиши |
131-139 |
Проверка R9, RA. Если равны 0, то питон неподвижен - переход на адрес 287 |
140-154 |
Изменение X координаты головы R3+=R9, приведение R3 к диапазону 0-63 |
155-169 |
Изменение Y координаты головы R4+=RA, приведение R4 к диапазону 0-63 |
170-177 |
Считывание точки с экрана в текущей позиции головы питона. Если пустая, переход к адресу 254 |
178-189 |
Точка установлена, проверка на совпадение с призом. Если не приз, то это самопересечение, переход на адрес 328 |
190-208 |
Приз, добавление одной точки к питону в массив координат. Инкремент R7 |
209-216 |
Корректировка длины питона с учетом ограничения в R16 |
217-234 |
Инкремент числа призов RC и вывод числа в форматированном виде в R9024 |
235-241 |
Звуковой сигнал. Частота задана непосредственно 440 Гц, продолжительность взята из R8. Для отключения звука ввести частоту 0 или заменить эти команды на "КНОП" |
242-253 |
Выбор координат нового приза. Проверка, что точка под ним была пустая. Отрисовка точки |
254-269 |
Цикл сдвига массива координат точек в памяти с использованием косвенной адресации с автодекрементом. Соответствует движению питона |
270-290 |
Гашение точки в хвосте питона. Для этого атрибуты вывода в R9001 временно устанавливаются значением 4 (инверсия) |
291-301 |
Рисование точки в голове питона. Следует обратить внимание, все тело питона на каждом шаге не перерисовывается, что заметно ускоряет работу программы |
302-310 |
Отрисовка графического экрана. Цикл проверки таймера R9050. Переход на адрес 92, если время задержки истекло |
311-321 |
Подпрограмма генерации случайных координат приза без проверки на занятость позиции. Занесение в RD, RE |
322-327 |
Строка "Питон" в кодировке ЭВМ (кодовая страница 866) |
328-359 |
Вычисление времени работы программы. Преобразование времени в формат "М,С". Вывод числа призов. Останов программы |
|
Хотя существующий вариант игры вполне удовлетворителен по скорости, его можно усовершенствовать. Для этого следует заменить цикл сдвига массива по адресам 254-269, поскольку время выполнения этого блока линейно зависит от длины питона. Вместо сдвига массива в памяти следует использовать кольцевой массив с двумя указателями. Но эта структура хранения координат точек потребует некоторого изменения алгоритма программы.
|
|