//paul koop m.a. life.cpp
/******************************************************************/
/* Die Simulation wurde ursprunglich entwickelt,                  */
/* um die Verwendbarkeit von Zellularautomaten                    */
/* fuer die Algorithmisch Rekursive Sequanzanalyse                */
/* zu ueberpruefen								*/
/* Modellcharakter hat allein der Quelltext. Eine Compilierung    */
/* dient nur als Falsifikationsversuch                            */
/******************************************************************/

//includedateien
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

//datenstruktur

//prototypen
class   inhalt;
typedef inhalt* zahl;
void    aufbau();
void    abbaux(zahl x);
void    abbauy(zahl y);
void    text_anfang();
void    text_ende();
typedef int raum[80];
void zufall(raum *von);
void editor(raum *von);
void korrektor(raum *von);
int neu(raum *r, zahl x, zahl y);

//const
const int true  = 1;
const int false = 0;
const unsigned char l = 111;
const unsigned char t = 255;
const int lebendig = true;
const int notlebendig =false;

//typedef

//classen
class   inhalt
	      {//BEGIN inhalt
	       public:
	       int i;
	       zahl v;
	       zahl n;
	      };//END inhalt


//variablendefinition
raum a[80],b[80];
zahl n,x,y,xa,ya;

//prozeduren und funktionen

void aufbau()
{//BEGIN aufbau

 int z = 0;
 n = new(inhalt);
 xa   = n;
 x    = n;
 x->i = z;
 do
 {//BEGIN do
  z=z+1;
  n=new(inhalt);
  x->n=n;
  n->v=x;
  x=n;
  x->i=z;
 }//END do
 while(z<79);
 x->n=xa;
 xa->v=x;

 z=0;
 n=new(inhalt);
 ya   = n;
 y    = n;
 y->i = z;
 do
 {//BEGIN do
  z=z+1;
  n=new(inhalt);
  y->n = n;
  n->v = y;
  y    = n;
  y->i = z;
 }//END do
 while (z<23);
 y->n  = ya;
 ya->v = y;
}//END aufbau

void abbaux(zahl x)
{//BEGIN abbaux
 //cout << "abbaux "<<x->i<<endl;
 if (x->n != xa) {abbaux(x->n);}
 delete(x);
}//END abbaux

void abbauy(zahl y)
{//BEGIN abbauy
 //cout << "abbauy "<<y->i<<endl;
 if (y->n != ya) {abbauy(y->n);}
 delete(y);
}//END abbauy

int neu (raum *r, zahl x, zahl y)
{//BEGIN neu
 int z;
  z = 0;
  if (r[x->v->i][y->v->i]) {z=z+1;}
  if (r[x->i   ][y->v->i]) {z=z+1;}
  if (r[x->n->i][y->v->i]) {z=z+1;}
  if (r[x->v->i][y->i   ]) {z=z+1;}
  if (r[x->n->i][y->i   ]) {z=z+1;}
  if (r[x->v->i][y->n->i]) {z=z+1;}
  if (r[x->i   ][y->n->i]) {z=z+1;}
  if (r[x->n->i][y->n->i]) {z=z+1;}
 if (r[x->i][y->i])
 {//BEGIN if
  if ((z>=2)&&(z<=3))
  {
   return lebendig;
  }
  else
  {
   return notlebendig;
  }
 }//END if
 else
 {//BEGIN else
  if (z==3)
  {
   return lebendig;
  }
  else
  {
   return notlebendig;
  }
 }//END else
}//END neu

void text_anfang()
{// BEGIN text_anfang
  window(1,25,80,25);
  textbackground(RED);
  textcolor(WHITE);
  clrscr();
  cout<<"Koop Editor <F10>Zufall <Pfeil>Cursor  <Einfg>lebendig <Entf>tot <Return>Start";
  gotoxy(1,1);
  textcolor(2);
  textbackground(BLUE);
  window(1,1,80,24);clrscr();window(1,1,80,25);
}// END text_anfang

void text_ende()
{// BEGIN text_ende
  gotoxy(1,25);
  textbackground(RED);
  textcolor(WHITE);
  cout<<"Koop Game of life <F1>neu       <F2>Editieren                    <RETURN> Ende";
  gotoxy(1,1);
  textcolor(2);
  textbackground(BLUE);
}// END text_ende

void zufall( raum* von)
{//BEGIN zufall
 int z;
  randomize();gotoxy(1,1);
  for (int y=0;y<=23;y++)
   {//BEGIN for1
    for (int x=0;x<=79;x++)
     {//BEGIN for2
      z = random(2);
      //cout<<x<<y;
      if (z == 0)
      {//BEGIN
	(von[x][y]) = lebendig;
	cout<<l;
      }//END
      else
      {//BEGIN
	(von[x][y]) = notlebendig;
	cout<<t;
      }//END
     }//END for2
    }//END for1
    //cout<<"Test zufall";
}// END zufall

void editor (raum* von)
{//BEGIN editor
    char ch1,ch2,defchar;
    int z;

  z =notlebendig;
  randomize();
  text_anfang();

  for(int yz=0;yz<24;yz++)
  {
   for (int xz=0;xz<80;xz++)
   {
    von[xz][yz]=notlebendig;
   }
  }

   x= xa;
   y= ya;
   do
   {
   ch1 = getch();
   if (ch1 ==0)
    {//BEGINif
     ch2 = getch();
     switch (ch2)
     {//switch
      case 68 : {
		 zufall(von);
		 break;
		}
      case 72 : {y = y->v;break;}
      case 80 : {y = y->n;break;}
      case 75 : {x = x->v;break;}
      case 77 : {x = x->n;break;}
      case 71 : {y = y->v;
		 x = x->v;
		break;}
      case 73 :  {y = y->v;
		  x = x->n;
		  break;}
      case 81 :  {y = y->n;
		  x = x->n;
		  break;};
      case 79 :  {y = y->n;
		  x = x->v;
		  break;}

      case 83 :  { z = !(lebendig);break;}
      case 82 :  { z = lebendig;break;}
      default :   { defchar=7;cout<<defchar;}
     }//switch
    gotoxy(x->i,y->i);
    if (z)
     {
       von[x->i][y->i] = lebendig;
       cout<<l;
       gotoxy(x->i,y->i);
      }
      else
      {
       von[x->i][y->i] = !(lebendig);
       cout<<t;
       gotoxy(x->i,y->i);
      }
    }//end if ch==0;
    else {defchar=7;cout<<defchar;}
   }
   while (ch1 != 13);
   text_ende();
}//END editor

void korrektor (raum* von)
{//BEGIN korrektor
    char ch1,ch2,defchar;
    int z;

  z =notlebendig;
  randomize();
  text_anfang();
  gotoxy(1,1);
  for(int yz=0;yz<24;yz++)
  {
   for (int xz=0;xz<80;xz++)
   {
    if(von[xz][yz]==lebendig){cout<<l;}else{cout<<t;}
   }
  }

   x= xa;
   y= ya;
   do
   {
   ch1 = getch();
   if (ch1 ==0)
    {//BEGINif
     ch2 = getch();
     switch (ch2)
     {//switch
      case 68 : {
		 zufall(von);
		 break;
		}
      case 72 : {y = y->v;break;}
      case 80 : {y = y->n;break;}
      case 75 : {x = x->v;break;}
      case 77 : {x = x->n;break;}
      case 71 : {y = y->v;
		 x = x->v;
		break;}
      case 73 :  {y = y->v;
		  x = x->n;
		  break;}
      case 81 :  {y = y->n;
		  x = x->n;
		  break;};
      case 79 :  {y = y->n;
		  x = x->v;
		  break;}

      case 83 :  { z = !(lebendig);break;}
      case 82 :  { z = lebendig;break;}
      default :   { defchar=7;cout<<defchar;}
     }//switch
    gotoxy(x->i,y->i);
    if (z)
     {
       von[x->i][y->i] = lebendig;
       cout<<l;
       gotoxy(x->i,y->i);
      }
      else
      {
       von[x->i][y->i] = !(lebendig);
       cout<<t;
       gotoxy(x->i,y->i);
      }
    }//end if ch==0;
    else {defchar=7;cout<<defchar;}
   }
   while (ch1 != 13);
   text_ende();
}//END korrektor

void spiel(raum *von,raum *nach)
{// BEGIN spiel
  y =ya;
  x =xa;
  do{
   do{
    nach[x->i][y->i]=neu(von,x,y);
    if (nach[x->i][y->i]) {cout<<l;}else{cout<<t;}
    x = x->n;
   } while (x!=xa);
   y = y->n;
  }while (y!=ya);
 }//END spiel


void hauptprogramm()
{

    char ch1,ch2;
    int xz,yz;

   if (kbhit()){ do{ ch1 = getch();} while (kbhit());}
   do
   {//do
   if(kbhit())
     {
      ch1 = getch();
      if (ch1 == 0)
	{
	  ch2=getch();
	  switch (ch2)
	  {
	   case 59: {
		 x = xa;
		 abbaux(x);
		 y = ya;
		 abbauy(y);
		 aufbau();
		 editor(a);
		break;}
	   case 60: {korrektor(a);break;}
	  };
	 }
     }
    else
    {
     gotoxy(1,1);
     spiel(a,b);
     gotoxy(1,1);
     spiel(b,a);
    }
   }//do
   while (ch1 != 13);
 };


//hauptprogramm
void main()
{//BEGIN main
  aufbau();
  editor(a);
  hauptprogramm();
  x = xa;
  abbaux(x);
  y = ya;
  abbauy(y);
}//END main



