Game of Life+.   Главные алгоритмы.

Заметки на полях - отвлечения.






Процедура ConveyC

– излагается простейшая версия алгоритма, реализующего орто-диагональный процесс преобразований конфигураций Эволюции, то есть с числом соседних клеток в окружении ведущего элемента, равным восьми. Входит в состав личной библиотеки LibColor к задачам ConvColor, где требуется подключение к стандартным библиотекам SysUtils.hpp, iostream.h, math.h.

int ConveyC(int p1[99][99],int q1[99][99] ) { int s;

for(int i = 1; i <58; i++) {
for(int j = 1; j <76 ;j++) {

s= p1[i-1 ][j-1 ]+p1[ i-1 ][ j] +p1[ i-1][ j+1]+ p1[i][j-1] + p1[i][ j+1]+
p1[i+1][ j-1] + p1[ i+1 ][ j] + p1[ i+1 ][ j+1];

if (s==3) {q1[i][j]=1;};

if (s==2) { if(p1[i][j] == 1) { q1 [i][j] = 1; };}; }; };

return 0; }

Исходный и результирующий массивы – это двумерные p и q, состоящие из 99 х 99 элементов, то есть int p[99][99], int q[99][99].

                               

На рис. показано окружение ведущего элемента p1[i][j], состоящее из 8 фишек p1[i-1 ][j-1 ], p1[ i-1 ][ j],
p1[ i-1][ j+1], p1[i][j-1], p1[i][ j+1], p1[i+1][ j-1], p1[ i+1 ][ j], p1[ i+1 ][ j+1].






Приводится текст главной программы с включением процедур...

#include #include # include using namespace std; int Bell (int f ) { for(int i = 1; i < f ; i++) { cout << "\a" ; }; return 0;} int Wait (int t ) { for (int m = 1; m < t * 200000000; m++) {; }; return 0;} int ConveyC(int p1[99][99],int q1[99][99] ) { int s; for(int i = 1; i <58; i++) { for(int j = 1; j <76 ;j++) { s= p1[i-1 ][j-1 ]+p1[ i-1 ][ j] +p1[ i-1][ j+1]+ p1[i][j-1] + p1[i][ j+1]+ p1[i+1][ j-1] + p1[ i+1 ][ j] + p1[ i+1 ][ j+1]; if (s==3) {q1[i][j]=1;}; if (s==2) { if(p1[i][j] == 1) { q1 [i][j] = 1; };}; }; }; return 0; } //n1,m1 - разм.исх.карт, процедур нет все здесь //i1,j1 - коорд. вляпа в осн. массив i,j,n,m - параметры осн. массива int main(){ int l,i,j,n,m; char ss; int nn; int i1,j1,n1,m1; int f, t, zv; f = t = 0; int nm, pp, s, k, rnd , rnd1 ; rnd = rnd1 = 0; int p [99][99] = {0}; int q [99][99] ={0}; cout << endl << endl << " WELCOME *EVOLUTION*LIFE" <> rnd ; // откуда 0 - ручное, 1 - вляп из pgm, 2- rnd if ( rnd == 0 ) { //ручной ввод i = 5; j = 5; p[i][j] = 1; cout << endl; // контрольная печать for (i=0; i<59; i++) { for (j=0; j<59; j++) { cout << p[i][j] ; }; cout << endl;}; cout << endl; goto next; }; if ( rnd == 1 ) { n1 = 1; m1 = 1; for (i=0; i<9; i++) { for (j=0; j<9; j++) { {p [i+n1][j+m1] = p1 [i][j]; }; }; }; cout << endl; // контрольная печать for (i=0; i<9; i++) { for (j=0; j<9; j++) { cout << p1[i][j] ; }; cout << endl;}; cout << endl; goto next; }; cout << endl ; begin: k=0; n1 = m1 = 4; // размеры rnd i1 = j1 = 4; // куда rnd cout<<" rnd array " << n1 << " x " << m1 << " ! ";cout << endl;cout << endl; for (i=i1; i> " << k ; cout << endl ; //пересылка массивов и чистка for (i = 0; i < 59; i++) { for (j = 0; j < 59; j++) {p [i][j] = q [i][j]; q[i][j] = 0 ;};}; cin >> zv; goto next ; Wait ( 2 ); Bell ( 1 ); end:; return 0;}






Процедура EvolutionCh

– излагается версия алгоритма, реализующего орто-диагональный процесс преобразований конфигураций Эволюции, то есть с числом соседних клеток в окружении ведущего элемента, равным восьми. Цветность рождений определяется по доминантному принципу, то есть по преобладанию цвета в порождающей триаде.

int EvolutionCh ( int p[99][99], int q[99][99]) { //основной алгоритм

int s; int ss[8]= {0}; int vv[5] = {0};
int a, b, c, vvv; int ii , jj;
for (int i = 1; i < 11;i++){
for (int j = 1; j < 11;j++){

ss[0]= p[i-1 ][j-1 ]; ss[1]= p[i-1 ][ j] ; ss[2]= p[i-1][ j+1] ; ss[3]= p[i][j-1] ; ss[4]= p[i][ j+1] ;
ss[5]= p[i+1][ j-1] ; ss[6]= p[ i+1 ][ j] ; ss[7]= p[ i+1 ][j+1];
s=0;

for ( ii= 0;ii < 8 ; ii++ ) {
if ( ss [ii] > 0 ) {s=s+1; };}; jj = 0;
if ( s == 3 ) { for( ii= 0;ii < 8 ; ii++ )
{ if ( ss [ii] > 0 )
{ vv [jj] = ss [ii]; jj=jj+1;};};};

a = vv[0]; b = vv[1]; c = vv[2];
if (( b >= a ) && ( a >= c )) { vvv = a ;};
if (( a >= b ) && ( b >= c )) { vvv = b ;};
if (( a >= c ) && ( c >= b )) { vvv = c ;};
if (( c >= a ) && ( a >= b )) { vvv = a ;};
if (( c >= b ) && ( b >= a )) { vvv = b ;};
if (( b >= c ) && ( c >= a )) { vvv = c ;};

if (s==3) { if (p[i][j] == 0) { q[i][j]= vvv ;};};
if((s==2) || (s==3)) { if (p[i][j] > 0) { q [i][j] = p[i][j] ;
}; };
}; };

return 0 ; }

Исходный и результирующий массивы здесь также – двумерные p и q, состоящие из 12 х 12 элементов, то есть int p[12][12], int q[12][12].

На рис. показано окружение ведущего элемента p1[i][j], состоящее из 8 фишек p1[i-1 ][j-1 ], p1[ i-1 ][ j],
p1[ i-1][ j+1], p1[i][j-1], p1[i][ j+1], p1[i+1][ j-1], p1[ i+1 ][ j], p1[ i+1 ][ j+1].

                               

Массив ss является одномерным и состоит из 8 элементов, представляя каждую клетку окружения текущего, ведущего элемента pij: это ss[0] … ss[7]...






Приводится текст главной программы с включением процедур...

#include #include # include using namespace std; int Bell (int f ) { for(int i = 1; i < f ; i++) { cout << "\a" ; }; return 0;} int Wait (int t ) { for (int m = 1; m < t * 200000000; m++) {; }; return 0;} //n1,m1 - разм.исх.карт, процедур нет все здесь //i1,j1 - коорд. вляпа в осн. массив i,j,n,m - параметры осн. массива int main(){ int l,i,j,n,m; char ss; int nn; int i1,j1,n1,m1; int f, t, zv; f = t = 0; int nm, pp, s, k, rnd , rnd1 ; rnd = rnd1 = 0; int p [99][99] = {0}; int q [99][99] ={0}; cout << endl << endl << " WELCOME *EVOLUTION*LIFE" <> rnd ; // откуда 0 - ручное, 1 - вляп из pgm, 2- rnd if ( rnd == 0 ) { //ручной ввод i = 5; j = 5; p[i][j] = 1; cout << endl; // контрольная печать for (i=0; i<59; i++) { for (j=0; j<59; j++) { cout << p[i][j] ; }; cout << endl;}; cout << endl; goto next; }; if ( rnd == 1 ) { n1 = 1; m1 = 1; for (i=0; i<9; i++) { for (j=0; j<9; j++) { {p [i+n1][j+m1] = p1 [i][j]; }; }; }; cout << endl; // контрольная печать for (i=0; i<9; i++) { for (j=0; j<9; j++) { cout << p1[i][j] ; }; cout << endl;}; cout << endl; goto next; }; cout << endl ; begin: k=0; n1 = m1 = 4; // размеры rnd i1 = j1 = 4; // куда rnd cout<<" rnd array " << n1 << " x " << m1 << " ! ";cout << endl;cout << endl; for (i=i1; i> " << k ; cout << endl ; //пересылка массивов и чистка for (i = 0; i < 59; i++) { for (j = 0; j < 59; j++) {p [i][j] = q [i][j]; q[i][j] = 0 ;};}; cin >> zv; goto next ; Wait ( 2 ); Bell ( 1 ); end:; return 0;}






Процедура EvolutionChOrt

– излагается версия алгоритма, реализующего ортогональный процесс преобразований конфигураций Эволюции, то есть с числом соседних клеток в окружении ведущего элемента, равным четырем. Цветность рождений определяется по остаточному принципу, то есть по цвету порождающей фишки.

int EvolutionChOrt (int p[12][12], int q[12][12]) {

int s; int ss[4]= {0}; int vv[5] = {0}; int a, b, c, vvv, i, j , ii , jj;

for ( i = 0; i < 12;i++ ) { for ( j = 0; j < 12;j++){ q[ i][ j] = 0; };}; for ( i = 1; i < 11;i++){ for ( j = 1; j < 11;j++){

for ( ii= 0;ii < 4 ; ii++ ) { ss [ii] = 0 ; };
ss[0]= p[i-1 ][ j] ; ss[1]= p[i][j-1] ; ss[2]= p[i][ j+1] ; ss[3]= p[ i+1 ][ j] ;
s=0;
for ( ii= 0;ii < 4 ; ii++ ) {
if ( ss [ii] > 0 )
{s=s+1; }; };
jj = 0;
if ( s == 1 )
{ for( ii= 0;ii < 4 ; ii++ )
{ if ( ss [ii] > 0 )
{ vvv = ss [ii]; }; }; ;

if (s==1) { if ( p[i][j] == 0 ) { q[i][j]= vvv ; }; };}; };

return 0 ; }

Показательно проследить, как упрощается процедура построения конфигураций следующего поколения при ортогональном алгоритме преобразований.

                               

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






Процедура EvolutionChOrtV

– излагается версия алгоритма, реализующего ортогональный процесс преобразований конфигураций объемной Эволюции, то есть с числом соседних клеток в окружении ведущего элемента, равным шести. Цветность рождений определяется по остаточному принципу, то есть по цвету порождающей фишки.

int EvolutionChOrtV ( int p[8][8][8],int q[8][8][8] ) {
int s; int ss[6]= {0}; int a, b, c, vvv; int ii , jj;

for (int k = 1; k < 7;k++){
for (int i = 1; i < 7;i++){
for (int j = 1; j < 7;j++){

ss[0]= p[i - 1][j ][k ]; ss[1]= p[i + 1][j ][k ];
ss[2]= p[i ][j - 1][k ]; ss[3]= p[i ][j + 1][k ];
ss[4]= p[i ][j ][k - 1]; ss[5]= p[i ][j ][k + 1];

s=0;
for (ii=0;ii < 6; ii++) {

if ( ss [ii] > 0 )
{s=s+1; };};
jj = 0;

if ( s == 1 ) {

for( ii= 0;ii < 6 ; ii++ )

{ if ( ss [ii] > 0 )

{vvv = ss [ii]; jj=jj+1;};};};

if (s==1) {if (p[i][j][k] == 0) {q[i][j][k] = vvv ;};};
if (s<=6) {if (p[i][j][k] > 0) {q[i][j][k] = 0;};}; }; }; };

return 0 ; }

Показательно сравнить процедуру построения конфигураций следующего поколения при ортогональном объемном алгоритме преобразований. Напомним, что в этом случае окружение ведущего элемента состоит из 6 клеток поля, расположенных ортогонально, то есть по абсциссе, ординате и аппликате.

Исходный и результирующий массивы – это теперь трехмерные p и q, теперь состоящие из 8 х 8 х 8 элементов, то есть int p[ 8][8] [ 8], int q[8] [8] ] [ 8].

                                                           

Массив ss, как и ранее, является одномерным и состоит уже из 6 элементов, представляя каждую клетку окружения текущего, ведущего элемента, теперь уже трехмерного pijk: это ss[0] … ss[5] - см. рис. (полистная интерпретация).

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






Приводятся алгоритмы отражения вовнутрь игрового поля тех мнимых образований, которые произошли за его пределами - зеркальные границы.

Изложение производится в порядке нарастания сложности - от отражения для однотоновой, монохромной игры, происходящей на плоскости, далее, то же, для игры шахматного типа, далее, для объемных монохромных, и, наконец, объемных игр шахматного типа.

По мере появления излагаются коллизии, возможные в процессе реализации алгоритмов, и, главное, предлагаются пути их разрешения. Подр. см. ссылки ниже...

Процедура OtrS

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

int OtrS (
int p [99][99] ) {

int i, j; int q [12][12] = {0};
for ( j= 1; j <11;j++) {
for ( i= 1; i <11;i++) { q [ i][ j] = p [30+i][30+j]; };};
for ( j= 1; j < 11;j++) { if ( q [1][j] == 1) {

if( q [3][j] ==0) { q[3][j] = 1 ;}; };q [1][j] = 0;
if ( q[10][j] == 1) {

if (q [8] [j] ==0) { q[8][j] = 1;}; };q [10][j] = 0; };

for ( i= 1; i <11; i++) { if ( q[i][1] == 1) {

if (q [i][3] ==0) { q[i][3] = 1 ;}; }; q[i][1] = 0;

if ( q[i][10] == 1) {

if (q [i][8] ==0) { q[i][8] = 1 ;}; }; q[i][10] = 0; };

for ( j= 1; j <11;j++) {for ( i= 1; i <11;i++) { p [30+i][30+j] = q [ i][ j] ; };};

return 0 ; }

Исходная конфигурация здесь располагается в массиве int p [99][99], все преобразования отражения происходят в рабочем массиве int q [12][12].

                               

Замечания. Обычное отражение в пустое поле является естественным и не обсуждается. Возникают следующие особенности при реализации данного алгоритма отражения.

Коллизия 1. Двойное рождение, возникающее при как естественном рождении фишки на g6 - в пределах игрового поля, так при отражении мнимого рождения, произошедшего на поле i6 за пределами игрового поля, в то же поле g6, где произошло и естественное рождение - см. рис.

Решение . При монохромной игре ничего страшного не происходит, просто следует не обращать внимание на такого рода события, и трактовать двойное рождение как одиночное. Заметим, что в двухцветной, шахматной Эволюции все несколько сложнее, и на факт двойного рождения следует реагировать, как – об этом ниже.

                               

Коллизия 2. Двойное рождение, возникающее при отражении мнимых рождений, например, на полях g9, i7, в правом верхнем углу игрового поля, на поле g7 шахматной доски - см. рис.

Решение . При монохромной игре также следует не обращать внимание на такого рода события, и трактовать двойное рождение как одиночное. В шахматной Эволюции несколько сложнее, на факт двойного рождения в углах игрового поля следует реагировать очень серьезно, как – см. ниже.






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

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

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

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

Фрагменты алгоритмов, использованных в этих программах, по мере разработки их описаний, приводятся ниже.

Графический способ поиска циклических образований.

Простейший способ поиска циклических образований - графический. Для этих целей выбирается некая интегральная/ные оценка/ки конфигурации, например, число фишек, то есть вес фигуры, площадь экспансии, другие, учитывающие цвет, параметры баланса, статистические характеристики процесса….

При назначении этой/тих интегральной/ных характеристики/тик см. раздел данного сайта “Элементы теории”.

Фрагмент программы.

...
if ( (k < qqq)) {
if ( k == 0 ){cout << "fig0/1 weit0/1 123456789 12345789 123456789 x "<< cout << k << "/" << k+1 << '\t' << sump << "/" << sumq << '\t' ;
if ( sumq >= sump ) { Sout ( 220 , sump/ ms ); cout << "o";
Sout ( 95 ,(sumq-sump)/ ms); cout << "x"; };
if ( sump > sumq ) { Sout ( 220 , sumq/ ms ); cout << "x";
Sout ( 95 ,(sump-sumq)/ ms ); cout << "o"; };
Sleep ( 100); };
...

Описание процедуры. Работа ведется по глобальной циклической переменной k, причем график выбранных параметров строится до k < qqq, где qqq - некоторое наперед заданное количество его реализаций.

При значении глобальной циклической переменной k == 0, то есть в начале построений, выводится шапка графика, включающая масштаб ms изображения, см. рис.

                               

В дальнейшем, в начале каждой строки графика даются номера поколений, а также численные значения исследуемого параметра, здесь веса конфигурации предыдущего sump и последующего sumq поколений.

Используются процедуры Sout, Sleep. Первая - спецпроцедура, здесь символ, код которого задается в первой позиции, выводится столько раз, чему равно число, определяемое второй позицией в списке аргументов. Процедура Sleep - стандартная.

Логика построения графика следующая.

Если sumq >= sump, то есть сумма весов предыдущего поколения sump меньше суммы весов последующего sumq поколения, то после масштабирования sump/ms она и выводится с помощью символа, код которого здесь 220 Разница sumq-sump после масштабирования добавляется далее в эту же строку с помощью символа, код которого 95

Если sump > sumq, то есть сумма весов последующего поколения sumq меньше суммы весов sump предыдущего поколения, то после масштабирования sumq/ms она выводится с помощью символа, код которого 220 Разница, теперь sump-sumq, после масштабирования добавляется далее в эту же строку с помощью символа, код которого 95






В производстве...

Подробнее здеcь смотреть >> https://yadi.sk/i/gwoYCXGqriN6o , а также здесь скачать >>

https://docviewer.yandex.ru/view/294397760/?*=ypxdRQdIVaGQrpnkv7wLLPR5O%2BF7InVybCI6Inlh
LWRpc2s6Ly8vZGlzay9Qcm9qZWN0cy56aXAiLCJ0aXRsZSI6IlByb2plY3RzLnppcCIsIm5vaWZyYW1lIjpmYWxz
ZSwidWlkIjoiMjk0Mzk3NzYwIiwidHMiOjE1ODUyMDA2MDk5NzMsInl1IjoiOTMwNjYwNTAwMTU4NTE5OTAzMCJ9




Геннадий     Щеглов











Программа соответствия
кодов символов в 16 с/с и 10 с/с.

#include #include

using namespace std;

int main() {char s ; int n ;

cout << endl;
for (n = 1; n < 160; n++) {
s = n; cout << n << " " << s << " " << hex << n << " " << dec << n << " ";
cout << endl << endl; };

cont:; cin >> n;
s = n; cout << n << " " << s << " " << hex << n << " " << dec << n << " ";

cout << endl; return 0 ; }



Фрагмент таблицы результатов.
Последовательно приводятся:
№ п/п, символ, коды в 16 с/с и 10 с/с.

... 33 ! 21 33       34 " 22 34       35 # 23 35       36 $ 24 36       37 % 25 37       38 & 26 38       39 ' 27 39       40 ( 28 40 ...





Программа ЧастОты для полутонов.

#include
// расчет частот для полутонов
#include

using namespace std;
int main () {

int i,l,f, df; f = 25;
cout<< endl << endl ;

for (i = 0; i < 12; i++) {
cout <<'\t'<< i+1 <<'\t'

<< 1*f + i* 1*f/12<<'\t
' << 2*f + i* 2*f/12<<'\t'
<< 4*f + i* 4*f/12<<'\t'
<< 8*f + i* 8*f/12<<'\t'
<<16*f + i*16*f/12<<'\t'
<<32*f + i*32*f/12<<'\t'
<<64*f + i*64*f/12<<'\t'
<<128*f+i*128*f/12<<'\t'

cout << endl ;} ;
cin >> l ;

return 0;}



1 25 50 100 200 400 800 1600 3200
2 27 54 108 216 433 866 1733 3466
3 29 58 116 233 466 933 1866 3733
4 31 62 125 250 500 1000 2000 4000
5 33 66 133 266 533 1066 2133 4266
6 35 70 141 283 566 1133 2266 4533
7 37 75 150 300 600 1200 2400 4800
8 39 79 158 316 633 1266 2533 5066
9 41 83 166 333 666 1333 2666 5333
10 43 87 175 350 700 1400 2800 5600
11 45 91 183 366 733 1466 2933 5866
12 47 95 191 383 766 1533 3066 6133





Программа Механические стишки.

#include #include

using namespace std;

int main() { int n;

//12345678901234567890

char t1[10][20] ={ };

сhar t2[10][20] ={ };

char t3[10][20] ={ };

char t3[10][20] ={ };

for (int j = 0; j < 20 ; j++) { cout << " ";
for (int i = 0; i < 4 ; i++) {

n =rand()%10 ; cout<< " " << t1[n] ;
n =rand()%10 ; cout<< t2[n] ;
n =rand()%10 ; cout<< t3[n] ;
n =rand()%10 ; cout<< t4[n] ; cout<< "\n" ;

}; cout<< "\n" ; };
return 0; }



дробя росток сознанья кое-кого
тревожит или нет умножит
мольбя глоток сознанья итого
тревожит даже не умножит

меня росток метания каково
не может после не низложит
чего росток сознанья своего
ерошит даже да тревожит

чего когда стенания кое-кого
неможит после он тревожит
себя листок метания сего
умножит или нет стреножит


Воспроизвести этот стих голосом.



что поделаешь вдруг все вошедши остались опустившись
таки чтож они и сонечка изменивши оказались с самоваром
а что же они и сонечка намекая случилось навзничь
а хорошо ли присевши и страдая откинулись опустившись

а что же присевши и окосоглазев остались в припадке
а хорошо ли вдруг все виновато ополоумели повернувшись
а почему обычно окосоглазев полувозлежали с намеком
а почему они и сонечка отплясывая вышли на кушетке

сваха также виновато оказались с намеком
сваха обычно отдохнувши осунулись с пледом
так бывает также намекая ополоумели в припадке
а хорошо ли все виновато осунулись повернувшись

а хорошо ли вдруг все страдая случилось боком
так бывает присевши и окосоглазев все замолчали навзничь
позже мариванна не страдая случилось навзничь
позже обычно страдая все замолчали навзничь




Для воспроизводства голосом ввести любые вирши в поле ввода и нажать пуск.











      begin

      main


Game of Life+.   Главные алгоритмы.

Заметки на полях - отвлечения.


Рейтинг@Mail.ru