ZX-Ревю 1996 №4-5 1996 г.

Форум - об игре "LIFE".


© Александров Андрей, г. Липецк, 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. Такая организация памяти удобна для загрузки и выгрузки фигур через магнитофон, т.к. не надо оперировать со всем экраном, а понадобится лишь количество точек, номер хода и координаты точек.

Что касается глайдеров, то их можно либо удалять "вручную", записывая в соответствующие им координаты нули, либо предусмотреть уничтожение точек возле границ поля по команде.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Страницы истории - Толкин: окончание рассказа о культовом писателе.
Вступление - Файл не принимается! Этот файл - "NICRON"...
Партийная зона - подробный отчет и результат Phantom Lord с Ростовского пати PARADOX'2000. А также разгромная критика от UnBEL!EVER'a.
Приколы №4 - Дело рук товарища Argon'а, с небольшой помощью CYBORG'а.
Hint - Mortal Kombat.

В этот день...   21 ноября