© Александров Андрей, г. Липецк, 1996.
Откликаюсь на просьбу о помощи читателей из п. Белогорск, Кемеровской обл. (ZX-РЕВЮ 96/1-2, с. 94-96). Тоже пытаюсь запрограммировать игру "LIFE", и могу посоветовать следующее.
Главная их ошибка в том, что они обсчитывают "вакуум", из за чего и возникают проблемы с быстродействием и движущимися фигурами (глайдерами). Вкратце, алгоритм моей программы такой. Чтобы не обсчитывать "вакуум", я отвел под координаты точек область памяти объемом 5K, т.е. 2,5K отводится под координату X и 2,5K отводится под координату Y. Таким образом, здесь умещаются координаты 2500 точек. Этого вполне хватает. Сама программа состоит из следующих блоков:
1) Определение координат соседних точек. Для каждой точки (х,у) таких точек 8, т.е. (x-1,y), (x+1,y), (x,y-
1), (x,y+1), (x-1,y-1), (x-1,y+1), (x+1,y-1), (x+1,y+1). Для этого массива координат отводится 20K памяти. Здесь сразу исключаются координаты, в которых уже есть точки фигуры, т.е. остаются только координаты соседних пустых клеток.
2) Происходит компрессия полученного массива соседних пустых клеток, т.к. более половины из полученных координат повторяются, и не один раз (ведь точки исходной фигуры находятся по соседству.
В ходе дальнейшей работы над "LIFE" блоки 1 и 2 я объединил. Это сократило объем программы и повысило быстродействие. Теперь вычисленная координата соседней точки сразу сравнивается с координатами точек фигуры и с ранее вычисленными координатами соседних точек и, в случае совпадения, исключаются.
3) Определение, в каких из пустых клеток образуются новые точки.
CALL |
9402 |
EXX |
|
LD |
DE,18919 |
LD |
A,(LONG+1) |
LD |
C,A |
EXX |
|
LD |
IX,(NACH.) |
LD |
DE,(LONG) |
XOR |
A |
LD |
D,A |
SUB |
1 |
EX |
AF,AF' |
DI |
|
CALL |
#0562 |
EXX |
|
PUSH |
DE |
LD |
A, (DE) |
RRCA |
|
SET |
7, A |
LD |
B, 6 |
LD |
(DE),A |
INC |
D |
DJNZ |
L1 |
POP |
DE |
BIT |
0,A |
JR |
Z,P1 |
INC |
DE |
DEC |
C |
JR |
Z,P2 |
EXX |
|
INC |
D |
CALL |
#05A9 |
JR |
LOOP |
LD |
HL,10072 |
EXX |
|
EI |
|
RET |
|
DEFW |
|
DEFW |
|
4) Определение, какие из старых точек выживают.
5) Объединение точек, полученных в блоках 3 и 4, в результате чего образуется искомая фигура (делается следующий ход).
В своей программе я широко применял команду блочного сравнения CPIR. Благодаря раздельному расположению в памяти координат X и Y, сравниваются сначала координаты X, а затем, при необходимости, координаты Y. Такая организация памяти удобна для загрузки и выгрузки фигур через магнитофон, т.к. не надо оперировать со всем экраном, а понадобится лишь количество точек, номер хода и координаты точек.
Что касается глайдеров, то их можно либо удалять "вручную", записывая в соответствующие им координаты нули, либо предусмотреть уничтожение точек возле границ поля по команде.