Об игре «Жизнь» – 1

В эту игру играют на неограниченном клеточном поле. Каждая клетка может иметь два состояния: либо в ней есть жизнь либо она безжизненная. Данная клетка имеет 8 соседей: клетки по горизонтали, вертикали и диагонали, которые имеют с клеткой общее ребро или вершину. Жизнь течет поколениями. За одно поколение в каждой клетке происходит изменение. Если количество ее соседей составляет 0 или 1 живых клеток, то данная клетка умирает от одиночества. Если у клетки 2 соседа, то ее состояние остается прежним, а если с ней граничат 3 живые клетки, то в ней появляется жизнь. И наконец если у клетки более 3 соседей, то жизнь в клетке прекращается от «перенаселения».

Реализация этой программы языком программирования достаточно очевидна. Используется двумерная матрица, в которой хранится игровое поле. В каждой клетке может стоять либо 1, если есть жизнь, либо 0, если, соответственно, жизни нет.

type MyArray    = array [0..nmax+1, 0..nmax+1] of 0..1;

Далее для проверки состояние каждой ячейки поля при переходе в новое поколение нам необходима процедура, в которой будет производиться пересчет значений.

for i := 1 to xmax do begin       {цикл пробега по всем строкам}

for j := 1 to ymax do begin       {цикл пробега по всем столбцам}

Count := 0;

for k:=1 to 8 do

if a[i+DX[k],j+DY[k]]=1 then Inc(Count);

{считаем всех соседей}

case Count of

0..1, 4..8 : lower[j] := 0;

2          : if a[i,j] = 1 then lower[j] := 1

else lower[j] := 0;

3          : lower[j] := 1;

end;     {меняем значение клетки}

end;

for j := 1 to ymax do begin

a[i-1, j] := upper[j];

upper[j]  := lower[j];

end;

end;

for j := 1 to ymax do a[xmax,j] := lower[j];

Причем стоит помнить, что при вычислении значения клетки нам необходимо пользоваться данными только текущего поколения, и результаты пересчета предыдущей строки не должны оказывать никакого влияния на вычислений, для этого в программу были добавлены два одномерных массива:

upper, lower : array [0..nmax+1] of 0..1;

в которых хранятся значения клеток в следующем поколении.

Ввод начального и вывод текущего поколения игрового поля осуществляется через файл.

Множество устойчивых фигур.

Прежде чем приступать к нашему исследованию, давайте введем понятие симметричности. Симметричной называется фигура,  одна из частей которой является зеркальным отражением другой. Соответственно, если существует отражение одной из частей, то должна существовать и ось, которая разделяет эти две половины. В зависимости от того, как расположена эта ось, выделим два вида отражения или симметричности: горизонтальная и диагональная. Горизонтальным будем называть отражение, когда ось проходит параллельно границам клеток поля. Диагональным отражением соответственно считается отражение, когда ось пересекает клетки поля по диагонали. Приведем пример. Фигуры, изображенные на рисунке 1 являются горизонтально симметричными. Теперь рассмотрим пример с фигурой, обладающей диагональной симметрией (рис.2). Эта фигура также примечательно тем, что не обладает горизонтальной симметрией, в отличие от предыдущего примера, где фигуры были «двойные» (рис.1).

Еще один важный момент. Все остальные виды симметрии, которые характерны для устойчивых фигур, могут быть получены путем поворота оси симметрии на 900, либо путем комбинации двух видов отражения.

Похожие записи

Добавить комментарий