HexLife_1st_upload.html



direct download: (2,507 MB, Feb. 2011) HexLife1stUpload.zip (     downloads yet) ,
uncompressed zipped folder ''HexLife1stUpload-zip'' containing
executable jar: ''HexLife1stUpload.jar'' to doubleclick to run program on any operating system, that has java jre,
java sdk or virtual machine above 1.4.0_03 installed - which version this program was compiled with..
direct download: (379 KB) make-stuff (aus hexLife-Ordner).zip ,
highly compressed zipped folder'' make-stuff (aus hexLife-Ordner).zip'' containing
several *.bmp and *jpg and *.rtf (Text) about how the Grid, the algo and zoom-problems were put into reality..



                                                                
                                                   -s2b2 .. only glider in hexLife ??





Ok, folks! .. here's the long promised 'Game Of Life - enhancement' for You ! 
I am pretty happy and proud to offer You a hexagonal implementation of the famous 'time-killer' - let's call it a 'beta-version' (cos' it's the first
 upload and still has minor imponderabilities and defectives) - ''HexLife, 1st upload''.

..
It's highly self-explaining and comes with ..
o     an algo handling ''on''-cells only, for faster performance,
        scanning ''on''-cell's neighbour's neighbours for births (instead of all cells).
o     It is as is best viewn with screen-resolution 1024x768, for it does'nt have any resizable Layout yet.
o     a bunch of 'ad hoc' collected patterns
o     its src-code, commented in 'pidgin germlish or engman'
It was developed on piii, win'98, java j2sdk1.4.0_03-b04.


some important hints for use:
o     tooltip tf1:   plz untoggle tf1 (i-count and messages) for fast loading from file !
o     plz do'nt click too fast ! (prog sometimes ca'nt handle yet)
o     major bug discovered! .. alas! ..
        .. sometimes prog 'vanishes' after many clicks or long time use .. ?!
        .. looks like whole prog is being auto-Garbage-collected .. ;o|:)) .. queer .. :o|         (plz, do'nt blame! .. :o| .. )
o     do single cell or two cells or triangle in center ..
        and then do 20 to 50 steps wit *b1* or *b2* , then ''pause'', then do s1345b3456 !
        will it die or stay forever doing all possible ornaments?

..
Here's some few links to what I last found on this topic:
another hexlife applet www.well.com/~dgb/hexlife.html
hexatron, applet with Golay, Preston, Callahan and other distinct rules www.hexatron.com/hexca/
hexagonal applet www.cse.sc.edu/~bays/h6h6h6/
HexCells 1.0.1, nice little proggie with small zoom, but great patterns members.optusnet.com.au/thekingdoms/hexlife/
collidoscope, applet and screensaver, thirty days, then small limitations (even these may be gotten around) www.collidoscope.com/ca/hcat.html www.collidoscope.com/
..
applet www.antimodal.com/flash/hexlife/
..
[article:] www.complex-systems.com/pdf/15-3-4.pdf

Now a bit of philosophy, if You want: Nature is not mainly 'cartesian' in my eyes .. we have Fibonnacci in sunflower's seems, there's 3d-diamond-Grid for carbon, bees work their honeycombs hexagonally, ice- and snow-crystals are hexagonal, .. furthermore lichens, sponges, corals, scorched earth, foam, and many more in our dimensions, then cells in plants or living bodies tend to 'roundness' more than to building blocks' (like humans .. ;o]] .. hehe), molecules do'nt gather in 'cubes' .. arrange logs on a heap and there will be five big ones around a small one and seven small ones around a slightly bigger one and you will find few things in nature that - bunched, clustered or accumulated - will arrange in x,y-horizontal-vertical mode alongside one another .. not to speak of Mandelbrodt and Julia and all that stuff .. long speech-short sense .. Beauty and as much overwhelming as nature-like patterns like persian carpets, ornaments, embroideries, (all extremely apt for like textile industry or commercial design even!? .. see screenshots to see what I mean .. ) generated by different rules for birth and survive will sustain this, even though rarely gliders and ships and puffers and eaters and many more like in GOL are found in HexLife. But who knows, what surprises 'hexagonality' may still hide .. :o) .. In that sense, I wish You fun and incitement with ''HexLife, 1st upload'' ! .. The proggie is direct free download and 'open source' (to accustom, work on and enhance it yourself or implying Golay, Preston, Callahan, aso.) and I was eager to upload this, but I will work on an enhanced ''2nd upload'' even faster - with like handling the border by deleting border pixels or implying torus-mode, moving and copy&pasting elements with mouse, 'doing two or more tasks at once' .. no .. wait! .. [cancel that last one .. VerbalWrongFetchError in line.thisLine], then badly necessary a decent Layout for resizing window and all components, and a 'cell-count-graph' with even changing algo-scan-mode to 'all cells scanned for even faster performance, if threshold ''too many cells'' and last but not least a customizable 'look and feel' like moving Your most used Buttons to where You want them or stuff alike - .. [where was I? ..] .. will work on it even faster, if - but not only if - YOU
a) send feedback
b) send me gorgeous patterns or systematic pattern-element-collections
c) alert me and the world, that you're still alive by mailing 'hullo?'' or alike .. ;o)) .. or even ..
d) feel like participating in the next ''HexLife, 2nd upload'' to by doing so even come sooner and ..
''Please, send me one pound!'' by
PayPal to     christof.held@t-online.de.

Any symbolic amount is welcome as palpable feedback to motivate me! .. :o) 
And t'is nice to see one's work cherished!



and here's your source code:
horrible src-code partly .. but it works!
I'm happy for any hints improving it! (without altering it! .. ;o)) .. )
(clicking here just in front of it, then doing ''ctrl+shift+end'' will mark it all to copypaste to your java-developing-surface (like JCreator or other) .. in direct download above it is extractable from HexLife1stUpload.jar, then HexLife1stUpload.java .. You'll manage to make it show up somehow in Your java developing program, I'm sure!)


/* @(#) aus HexLife08Upload (aus HexLife07aRuleEdit) 1.4.0_03-b04 07/01/06	*/
package myprojects.hexlife;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.io.*;
//import java.lang.Math;
//import java.lang.String;

public class HexLife1stUpload 	 extends Frame
											implements Runnable, MouseListener, MouseMotionListener, ActionListener, AdjustmentListener/*, ImageObserver */	{
//		public Label alabel;
	int i=0;
	int x; int y;
	Rectangle screenRect= new Rectangle(0,0,800,740);	/*	Carré ca.   hoch   40 - 644,    breit   20 - 623	(bei zoom 2x2pix)	*/
//	File f=new File("c:/progeigene/JCreator/MyProjects/owndata/scrshot"/*+Integer.toString(i)*/+".jpg"); //toString(i) hier eh' immer ''0''
	File f;
	BufferedImage bi;
	boolean relaxed=false; boolean onlyjuststarted=true;
	Button pauserunbutton; String cmd=">"; boolean pausebool=false; boolean runbool=true;
	Button gridbutton; boolean gridnew=true;
	Button screenshotbutton; boolean shot=false;
	Button clearbutton; Button pattbutton; boolean patt=false;
	Button nillbutt; Button onebutt; Button fiftybutt; Button hundredbutt; Button thsdbutt; int stim=100;
	Button toggibutt; boolean toggibool=true; Button togtipbutt; boolean togtipbool=true;/*	false		*/
	Button savpatbutt; Button loadpatsbutt; Button loadpatcbutt;
	Button zoom2butt; Button zoom4butt;	Button zoom6butt; Button zoom8butt; int zoom=4; 
	/*		2x2pix  zoom=1		4x4pix  zoom=2		6x6pix  zoom=3		8x8pix  zoom=4		*/
	Graphics mg; Graphics eg; Graphics sg;
	Robot robo;
	TextField tf1;
	Component ec;
	Color bgcol;
	Checkbox cbs0; Checkbox cbs1; Checkbox cbs2; Checkbox cbs3; Checkbox cbs4; Checkbox cbs5; Checkbox cbs6;  /* CheckBoxes survive */
	Checkbox cbb0; Checkbox cbb1; Checkbox cbb2; Checkbox cbb3; Checkbox cbb4; Checkbox cbb5; Checkbox cbb6;  /* CheckBoxes birth */
	int ct=1;	/*	counter für Nachbarscan	*/
	int[][] hexGrid=new int[620][620]; /*	Werte: 	1  - blacke AN-Zelle
																	2  - grüne Mauer-Zelle
																	10 - (bereits) auf (no)survive geprüfte AN-Zelle
																	11 - (bereits) auf (does)survive geprüfte AN-ZElle
																	30 - (bereits) auf (no)birth kontrollierte AUS-Zelle
																	31 - (bereits) auf (new)birth kontrollierte AUS-Zelle	*/
	public File PattFile/*= new File("c:/progeigene/JCreator/MyProjects/stories/hexLife/SavedPattern"+i+".txt")*/;		//   +i.toString()   .. ?
	public RandomAccessFile randaff;
	Button PattSaveMem1; Button PattLoadMem1; Button PattSaveMem2; Button PattLoadMem2;
	int hexMem1[][]=new int[620][620];	int hexMem2[][]=new int[620][620];
	boolean refreshGraphics=true;
	Button rndPatt10; Button rndPatt20; Button rndPattL; /*Button rndPatt_O;*/ Button rndPatt_o; boolean rnd10bool; boolean rnd20bool; boolean rndLbool; /*boolean rnd_Obool;*/ boolean rnd_obool;
	TextField tf2;  Double tf2StringToDouble=new Double(0.0); Integer tf2StringToInteger=new Integer(0);
	Color mygreen=new Color(0,120,0);
	boolean dragbool;
	TextField tf3;  Integer tf3StringToInt=new Integer(0);
   Image moos; Image xantho; Image flechte1; Image flechte13; Image flechte12; Image flechte_schuessel_fl; Image datronia_mollis; Image antarktisflechte; Image vomKirschbaum; Image daheim_Schneekristalle; Image naturSchneekristall; Image eiskristalle_Makro_41_HP;
   MediaTracker mediatracker=new MediaTracker(this);
	Scrollbar rndPixAmount; Scrollbar rndRadius;
	TextField tf4; Integer tf4StringToInteger=new Integer(0);
	Button pres1; Button pres2; Button pres3; Button pres4; Button pres5; Button pres6; Button pres7; Button pres8; Button pres9; Button pres10; 
Button pcfro;/*paste then clear from center*/ boolean pcfro_bool=true; Button cfroul;/*copy from center to up left*/ Button cfrou; Button cfrour; Button cfrol; Button cfror; Button cfrodl; Button cfrod; Button cfrodr; 
Button pcto;/*paste then clear to center*/ boolean pcto_bool=true; Button ctoul;/*copy to center from up left*/ Button ctou; Button ctour; Button ctol; Button ctor; Button ctodl; Button ctod; Button ctodr; 
int hexCopy[][]=new int[610][610];
Button clearcenteronly;

	/*	schomma die rules definieren ..	*/
	public boolean birthrule(int ct) {
		if ( (ct==0 && cbb0.getState()==true) || (ct==1 && cbb1.getState()==true) || (ct==2 && cbb2.getState()==true) || (ct==3 && cbb3.getState()==true) || (ct==4 && cbb4.getState()==true) || (ct==5 && cbb5.getState()==true) || (ct==6 && cbb6.getState()==true) ) { return true; } else { return false; }
	}
	public boolean surviverule(int ct) {
		if ( (ct==0 && cbs0.getState()==true) || (ct==1 && cbs1.getState()==true) || (ct==2 && cbs2.getState()==true) || (ct==3 && cbs3.getState()==true) || (ct==4 && cbs4.getState()==true) || (ct==5 && cbs5.getState()==true) || (ct==6 && cbs6.getState()==true) ) { return true; } else { return false; }
	}
	
	/*public void clearcells() { 	}*/
	
	/*			-	-	-					STEP					-	-	-					*/
	
	public void step(Graphics sg) throws AWTException {		if(toggibool==true){this.setTitle("HexLife1stUpload "+i);}
		
							/*		div. Kram für start oder debug		*/
		
		/*if (cmd.equals("#")==false) { }*/	/*sg.translate(20,40); */
				if(i==0) {							for (int breit=1;breit<800;breit++) {	
														if (breit%10==0) {		sg.drawLine(breit,25,breit,27);		}
														if (breit%50==0) {		sg.drawLine(breit,25,breit,29);		}
														if (breit%100==0) {	sg.setColor(Color.red); sg.drawLine(breit,25,breit,31); sg.setColor(Color.black); 		}}
											for (int hoch=1;hoch<740;hoch++) {	
														if (hoch%10==0) {		sg.drawLine(5,hoch,7,hoch);		}
														if (hoch%50==0) {		sg.drawLine(5,hoch,9,hoch);		}
														if (hoch%100==0) {	sg.setColor(Color.red); sg.drawLine(5,hoch,11,hoch); sg.setColor(Color.black); 		}}
				}
		sg.setColor(Color.black);
		if(i==0||i==1||cmd=="c"||refreshGraphics==true|| cmd=="2p"||cmd=="4p"||cmd=="6p"||cmd=="8p"||cmd==">"/*or.. or WindowFocusGained==true or nosebud==false, but not every step or i-count. yeah! */) {
			sg.drawString("survive",625,475); sg.drawString("rule",630,490);  sg.drawString(" birth",675,475); sg.drawString("rule",680,490);
			sg.drawString("%",767,325); sg.drawString("pix",748,205); sg.drawString("presets",740,475);
			sg.drawString("copy",700,340); sg.drawString("fro",660,355); sg.drawString("or",705,355); sg.drawString("to",745,355); sg.drawString("center",695,450); 
		}
		robo=new Robot();
		i++;
																/*		routine für clearbutton		*/
		if (cmd=="c") { /*getGraphics()*/sg.setColor(Color.lightGray);		/*	malen bzw darstellen nur den zoom-Bereich: 	*/
		if(zoom!=1){ for (int p=300-300/zoom/*1*/;p<300+300/zoom/*300*/;++p) { for (int q=300-300/zoom/*2*/;q<300+300/zoom/*300*//* && q%2==0*/;++q/*+=2*/) {			/*	geht vlt nur p,q = 0  und clearRect ganzes Carré ?	*/
			/**/if (hexGrid[p][q]!=0) { /*getGraphics()*/sg./*fillRect*/fillOval(zoom/*2*/*(p-(300-300/zoom))+20-zoom,zoom/*2*/*(q-(300-300/zoom))+40-zoom,2*zoom,2*zoom); }
		}}}else{for (int p=0;p<=600;++p) { for (int q=0;q<=600;q+=2/*++*/) {			/*	geht vlt nur p,q = 0  und clearRect ganzes Carré ?	*/
			/**/if (hexGrid[p][q]!=0) { sg.fillRect(p+19,q+39/* ?! */,2,2); }
		}}}			/* ausradieren auch gesamten, auch nicht sichtbaren hexGrid[][] außerhalb zoom: 	*/
		for (int p=0;p<=600;++p) { for (int q=0;q<=600/* && q%2==0*/;q+=2/*++*/) {	
			/**/if (hexGrid[p][q]!=0) { hexGrid[p][q]=0; }
		}}	}
							/*		.. die eigentliche run()     STEP     Routine		*/
		
	if (runbool==true || refreshGraphics==true) { 		if(toggibool==true) { tf1.setText("running .. i="+i); }
	
													/*	grid neu malen, wenn start oder gridbutton geklickt	*/
		if (gridnew==/*i==1||cmd=="#"*/true || refreshGraphics==true) { 		int zc=300-300/zoom; int wh=2*zoom;
			for (x=300-300/zoom/*0*/;x<=300+300/zoom/*300*/;++x) { for (y=300-300/zoom/*0*/;y<=300+300/zoom/*300*/; ++y) {		/*	ein Schachspringer-Gitter wird mit Kreisen bemalt	*/
				if ( (y%4==0 && x%2==0) || (y%2==0 && y%4!=0 && x%2!=0) ) {  if(zoom!=1){ sg.setColor(Color.lightGray);/*}*/  sg./*drawRect*/drawOval(zoom/*2*/*(x-zc)+20-zoom,zoom/*2*/*(y-zc)+40-zoom,wh,wh); } }
				if (hexGrid[x][y]==1) { sg.setColor(Color.black); sg./*fillRect*/fillOval(zoom/*2*/*(x-zc)+20-zoom,zoom/*2*/*(y-zc)+40-zoom,wh,wh); }
				/*if (hexGrid[x][y]==2) { sg.setColor(Color.green); sg.fillRect(2*x+20,2*y+40,4,4); }*/
		}}  if (i==1) { if(toggibool==true) { tf1.setText("draw, then press ''>'' to iterate .. i="+i); } }  if (i==1 /*|| cmd=="#"*/) { pausebool=true; runbool=false; return; } gridnew=false;
		}
													/*	screenshot machen, wenn "S"-Button geklickt	*/
		if (shot==true) {
			try { bi=robo.createScreenCapture(screenRect); }catch(SecurityException sex) {}
	//		try { ImageIO.write(bi,"jpg",f); }catch(IOException ioex) {}
		/* .. ! Achtung ! .. screenshots akkumulieren (nach i benannt) unbemerkt und nehmen Festplattenplatz auf C: .. !	.. wenn: 	*/
	//		try { ImageIO.write(bi,"jpg",new File("c:/progeigene/JCreator/MyProjects/owndata/scrshot"+Integer.toString(i)+".jpg")); }catch(IOException ioex) {}								
			try { ImageIO.write(bi,"jpg",new File("scrshot"+Integer.toString(i)+".jpg")); }catch(IOException ioex) {}								
	//		try { ImageIO.write(bi,"jpg",new File(/**/"../screenshotSe/scrshot"+Integer.toString(i)+".jpg")); }catch(IOException ioex) {}
	/* .. letzteres = error FileNotFoundException ..  */
			shot=false;
		}
													/* 	random pattern in center	 */
					/* nur dem hexGrid Zufallswerte zuweisen, die dann automatisch gezoomt, iteriert und dargestellt werden müßten ..  
					 * .. aber hexGrid[][] muß richtig 'getroffen werden (nur jedes zweite Pixel x,y im Fenster ist Element von hexGrid)
					 *	zwar mit Versatz je nach x od y .. ?? 	*/
		if (rnd10bool==true) {  		for (x=295;x<=305;++x/*+=2*/) { for (y=294;y<=304;y+=2/*++*/) {
		 		if(( y   %4==0 &&  x   %2==0) || ( y   %2==0 &&  y   %4!=0 &&  x   %2!=0) ) { hexGrid[x][y]=(int)(Math.random()+0.3); }
				/* Math.random() liefert double 0,00-1,00 .. und ''(int)'' rundet ab: ''+n'' 
				 * zB 0.3 bewirkt, daß (int)(0.69+0.3)=0   (int)(0,70+0.3)=1  */
		}		}	rnd10bool=false; }
		if (rnd20bool==true) { 			for (x=291;x<=311;++x/*+=2*/) { for (y=290;y<=310;y+=2/*++*/) {
		 		if(( y   %4==0 &&  x   %2==0) || ( y   %2==0 &&  y   %4!=0 &&  x   %2!=0) ) { hexGrid[x][y]=(int)(Math.random()+0.3); }
		}		}	rnd20bool=false; }		
													/* 	random horizontal bars resp. rectangles 	 */
		if (rndLbool==true) { 	 if(toggibool==true){ tf1.setText("loading .. PLZ WAIT ! ");}  int rad=rndRadius.getValue();
			for (x=51;x<=551;++x/*+=2*/) { for (y=300-rad;y<=300+rad;++y/*+=2*/) {
		 		if(( y   %4==0 &&  x   %2==0) || ( y   %2==0 &&  y   %4!=0 &&  x   %2!=0) ) { 
			 		hexGrid[x][y]=(int)(Math.random()+(double)(rndPixAmount.getValue())/150 ); } /* '' /150 '', da getValue() = 0 - 150 */
		}		}	tf1.setText("ok"); rndLbool=false; }														/* .. aber gewollt in Prozent */
															/* 	draw random ring, custom thick	 */
		if (rnd_obool==true) {    if(toggibool==true){tf1.setText("loading .. PLZ WAIT ! ");}  int rad=rndRadius.getValue();/*(int)(tf4StringToInteger.valueOf(tf4.getText()).intValue()*//*);*/
			for(int x=1; x<600; ++x) { 	for(int y=2; y<600; y+=2) { 		/* rad = custom radius-'spread' from tf3 user-input .. not */
		 		if( ( y   %4==0 &&  x   %2==0) || ( y   %2==0 &&  y   %4!=0 &&  x   %2!=0) ) {	/* ..inner-outer Radius which is 150+-rad */
					if ( 	x < 300+(int)(Math.sqrt(Math.pow(150+rad,2)-Math.pow(y-300,2))) && 	/* ''300+-'' ab Kreis um Nullpunkt */
							x > 300-(int)(Math.sqrt(Math.pow(150+rad,2)-Math.pow(y-300,2))) &&	/* ''x,y -300'' für Werte ab Zentrum 300,300 */
							(y > 300+(int)(Math.sqrt(Math.pow(150-rad,2)-Math.pow(x-300,2))) ||  /* ''150+-rad'' Radius1=150+rad .. */
							y < 300-(int)(Math.sqrt(Math.pow(150-rad,2)-Math.pow(x-300,2))) ) 	) { /* Radius2=150-rad .. rad=Spanne, spread */
////						hexGrid [ x ] [ y ]  =  (int)(Math.random()+(double)(tf2StringToDouble.valueOf(tf2.getText()).doubleValue())); /* ?! */
////						hexGrid [ x ] [ y ]  =  (int)(Math.random()+(double)(tf2StringToDouble.valueOf(tf2.getText()).doubleValue())); /* no 'NumberField' in java .. ;o] */
						hexGrid [ x ] [ y ]  =  (int)( Math.random()+(double)(rndPixAmount.getValue())/150 );			
						/*						f(x) = Wurzel( radius^2 - x^2 )									.. Halbkreis um Nullpunkt
						*	entspricht:		 y   = Math.sqrt( .. )															- '' -
						*		also ..		hexGrid [ x ] [ Math.sqrt(..) ]  =  Math.rnd( 1 oder 0 )				- '' -				als rnd
						*						.. not all random, 'cos   Sqrt(x^2) and y+=2   involved													*/
		}	} 	}	}   if(toggibool==true){tf1.setText("ok");}   rnd_obool=false; }	/* if(toggibool==true) { tf1.setText("loading .. hexGrid [ "+x+" ][ "+y+" ] = "+hexGrid[x][y]);}*/
		
													/*			Der sb-algo:			*/
		/*	ersma' die Nachbarn zählen ..
		 *	erst die der an eine lebende Zelle angrenzenden Leerstellen für births	*/
			/*	(es müssen schon sehr viele Zellen an sein, um ein scan aller leeren Zellen auf birth hin lohnend zu machen)	*/
	if(refreshGraphics==false) {
		for (int j=5; j<600; ++j) { for (int k=6; k<600; k+=2) {
			
				if (birthrule(0)) {
				if (hexGrid[j][k]==0) {		/*	außschließlich für b0	*/
					if ( 	(hexGrid[j-1][k-2]==0 || hexGrid[j-1][k-2]==30 || hexGrid[j-1][k-2]==31) &&
							(hexGrid[j-2][k]  ==0 || hexGrid[j-2][k]  ==30 || hexGrid[j-2][k]  ==31) &&
							(hexGrid[j-1][k+2]==0 || hexGrid[j-1][k+2]==30 || hexGrid[j-1][k+2]==31) &&
							(hexGrid[j+1][k+2]==0 || hexGrid[j+1][k+2]==30 || hexGrid[j+1][k+2]==31) &&
							(hexGrid[j+2][k]  ==0 || hexGrid[j+2][k]  ==30 || hexGrid[j+2][k]  ==31) &&
							(hexGrid[j+1][k-2]==0 || hexGrid[j+1][k-2]==30 || hexGrid[j+1][k-2]==31)	) { ct=0; }
					if (birthrule(ct)) { hexGrid[j][k]=31; ct=1; } else { ct=1; }
				} }
			
			if (hexGrid[j][k]==1 || hexGrid[j][k]==10 || hexGrid[j][k]==11) {	/*	die 'Ausgangszelle'	*/
				if (hexGrid[j-1][k-2]==0) {	/*	erste angrenzende (obli) aus-Zelle, die jetzt auf birth geprüft wird	*/
					if (hexGrid[j-2][k-4]==1 || hexGrid[j-2][k-4]==10 || hexGrid[j-2][k-4]==11) { ct+=1; }
						/*	2, weil Ausgangszelle is' ja für ihren leeren Nachbar schon ein Nachbar	*/
					if (hexGrid[j-3][k-2]==1 || hexGrid[j-3][k-2]==10 || hexGrid[j-3][k-2]==11) { ct+=1; }
					if (hexGrid[j-2][k]  ==1 || hexGrid[j-2][k]  ==10 || hexGrid[j-2][k]  ==11) { ct+=1; }
					if (hexGrid[j+1][k-2]==1 || hexGrid[j+1][k-2]==10 || hexGrid[j+1][k-2]==11) { ct+=1; }
					if (hexGrid[j]  [k-4]==1 || hexGrid[j]  [k-4]==10 || hexGrid[j]  [k-4]==11) { ct+=1; }
				/*	jetzt schon - bei jeder geprüften Zelle - entscheidet birthrule, ob die Nachbaranzahl sich auswirkt	*/
					if (birthrule(ct)) { hexGrid[j-1][k-2]=31; ct=1; } else { hexGrid[j-1][k-2]=30; ct=1; } }
				if (hexGrid[j-2][k]==0) {	/*	li	*/
					if (hexGrid[j-3][k-2]==1 || hexGrid[j-3][k-2]==10 || hexGrid[j-3][k-2]==11) { ct+=1; }
					if (hexGrid[j-4][k]  ==1 || hexGrid[j-4][k]  ==10 || hexGrid[j-4][k]  ==11) { ct+=1; }
					if (hexGrid[j-3][k+2]==1 || hexGrid[j-3][k+2]==10 || hexGrid[j-3][k+2]==11) { ct+=1; }
					if (hexGrid[j-1][k+2]==1 || hexGrid[j-1][k+2]==10 || hexGrid[j-1][k+2]==11) { ct+=1; }
					if (hexGrid[j-1][k-2]==1 || hexGrid[j-1][k-2]==10 || hexGrid[j-1][k-2]==11) { ct+=1; }
					if (birthrule(ct)) { hexGrid[j-2][k]=31; ct=1; } else { hexGrid[j-2][k]=30; ct=1; } 	}
				if (hexGrid[j-1][k+2]==0) {	/*	liun	*/
					if (hexGrid[j-2][k]  ==1 || hexGrid[j-2][k]  ==10 || hexGrid[j-2][k]  ==11) { ct+=1; }
					if (hexGrid[j-3][k+2]==1 || hexGrid[j-3][k+2]==10 || hexGrid[j-3][k+2]==11) { ct+=1; }
					if (hexGrid[j-2][k+4]==1 || hexGrid[j-2][k+4]==10 || hexGrid[j-2][k+4]==11) { ct+=1; }
					if (hexGrid[j]  [k+4]==1 || hexGrid[j]  [k+4]==10 || hexGrid[j]  [k+4]==11) { ct+=1; }
					if (hexGrid[j+1][k+2]==1 || hexGrid[j+1][k+2]==10 || hexGrid[j+1][k+2]==11) { ct+=1; }
					if (birthrule(ct)) { hexGrid[j-1][k+2]=31; ct=1; } else { hexGrid[j-1][k+2]=30; ct=1; } 	}
				if (hexGrid[j+1][k+2]==0) {	/*	reun	*/
					if (hexGrid[j-1][k+2]==1 || hexGrid[j-1][k+2]==10 || hexGrid[j-1][k+2]==11) { ct+=1; }
					if (hexGrid[j]  [k+4]==1 || hexGrid[j]  [k+4]==10 || hexGrid[j]  [k+4]==11) { ct+=1; }
					if (hexGrid[j+2][k+4]==1 || hexGrid[j+2][k+4]==10 || hexGrid[j+2][k+4]==11) { ct+=1; }
					if (hexGrid[j+3][k+2]==1 || hexGrid[j+3][k+2]==10 || hexGrid[j+3][k+2]==11) { ct+=1; }
					if (hexGrid[j+2][k]  ==1 || hexGrid[j+2][k]  ==10 || hexGrid[j+2][k]  ==11) { ct+=1; }
					if (birthrule(ct)) { hexGrid[j+1][k+2]=31; ct=1; } else { hexGrid[j+1][k+2]=30; ct=1; } 	}
				if (hexGrid[j+2][k]==0) {	/*	re	*/
					if (hexGrid[j+1][k-2]==1 || hexGrid[j+1][k-2]==10 || hexGrid[j+1][k-2]==11) { ct+=1; }
					if (hexGrid[j+1][k+2]==1 || hexGrid[j+1][k+2]==10 || hexGrid[j+1][k+2]==11) { ct+=1; }
					if (hexGrid[j+3][k+2]==1 || hexGrid[j+3][k+2]==10 || hexGrid[j+3][k+2]==11) { ct+=1; }
					if (hexGrid[j+4][k]  ==1 || hexGrid[j+4][k]  ==10 || hexGrid[j+4][k]  ==11) { ct+=1; }
					if (hexGrid[j+3][k-2]==1 || hexGrid[j+3][k-2]==10 || hexGrid[j+3][k-2]==11) { ct+=1; }
					if (birthrule(ct)) { hexGrid[j+2][k]=31; ct=1; } else { hexGrid[j+2][k]=30; ct=1; } 	}
				if (hexGrid[j+1][k-2]==0) {	/*	reob	*/
					if (hexGrid[j]  [k-4]==1 || hexGrid[j]  [k-4]==10 || hexGrid[j]  [k-4]==11) { ct+=1; }
					if (hexGrid[j-1][k-2]==1 || hexGrid[j-1][k-2]==10 || hexGrid[j-1][k-2]==11) { ct+=1; }
					if (hexGrid[j+2][k]  ==1 || hexGrid[j+2][k]  ==10 || hexGrid[j+2][k]  ==11) { ct+=1; }
					if (hexGrid[j+3][k-2]==1 || hexGrid[j+3][k-2]==10 || hexGrid[j+3][k-2]==11) { ct+=1; }
					if (hexGrid[j+2][k-4]==1 || hexGrid[j+2][k-4]==10 || hexGrid[j+2][k-4]==11) { ct+=1; }
					if (birthrule(ct)) { hexGrid[j+1][k-2]=31; } else { hexGrid[j+1][k-2]=30; } }
					
		/*	jetzt die der lebenden Zelle selbst für survive	*/
				ct=0;	/*	!	*/
				if (hexGrid[j-1][k-2]==1 || hexGrid[j-1][k-2]==10 || hexGrid[j-1][k-2]==11) { ct+=1; }
				if (hexGrid[j-2][k]  ==1 || hexGrid[j-2][k]  ==10 || hexGrid[j-2][k]  ==11) { ct+=1; }
				if (hexGrid[j-1][k+2]==1 || hexGrid[j-1][k+2]==10 || hexGrid[j-1][k+2]==11) { ct+=1; }
				if (hexGrid[j+1][k+2]==1 || hexGrid[j+1][k+2]==10 || hexGrid[j+1][k+2]==11) { ct+=1; }
				if (hexGrid[j+2][k]  ==1 || hexGrid[j+2][k]  ==10 || hexGrid[j+2][k]  ==11) { ct+=1; }
				if (hexGrid[j+1][k-2]==1 || hexGrid[j+1][k-2]==10 || hexGrid[j+1][k-2]==11) { ct+=1; }
				if (surviverule(ct)) { hexGrid[j][k]=11; ct=1; } else { hexGrid[j][k]=10; ct=1; }
				
		}	}}	}	/* End 	..if hexGrid[Ausgangszelle]	..forfor j,k  .. if-refreshGraphics		*/
		
											/*		Ende   sb-algo		*/
	
				/*	noch alle Teile malen je nach Wert und Zwischenwerte zurückübersetzen	*/

		for (int n=1/*1*/;n<=600/*300*/;++n) { for (int m=2/*2*/;m<=600/*300*//* && m%2==0*/;m+=2) {
		/* all cells 1 to 600 value hexGrid [x][y]= 10, 30, 11, 31 must be reset to 1 or 0 (on / off) .. */
			if (hexGrid[n][m]==11 || hexGrid[n][m]==31) {
				if (n>=300-300/zoom && n<=300+300/zoom && m>=300-300/zoom && m<=300+300/zoom) {
				/* .. but draw and erase only zoom-area. */
					sg.setColor(/*Color.*/mygreen); 	if(zoom!=1) { 	sg./*fillRect*/fillOval(zoom/*2*/*(n-(300-300/zoom))+20-zoom,zoom/*2*/*(m-(300-300/zoom))+40-zoom,2*zoom,2*zoom); }
														else { 			sg./*fillOval*/fillRect(zoom/*2*/*(n-(300-300/zoom))+20-zoom,zoom/*2*/*(m-(300-300/zoom))+40-zoom,2*zoom,2*zoom); }
			}	hexGrid[n][m]=1; 	}
			if (hexGrid[n][m]==10||hexGrid[n][m]==77) {
				if (n>=300-300/zoom && n<=300+300/zoom && m>=300-300/zoom && m<=300+300/zoom) {
					sg.setColor(Color.lightGray/*gray*/); if(zoom!=1) { 	sg./*fillRect*/fillOval(zoom/*2*/*(n-(300-300/zoom))+20-zoom,zoom/*2*/*(m-(300-300/zoom))+40-zoom,2*zoom,2*zoom);}
															else { 			sg./*fillOval*/fillRect(zoom/*2*/*(n-(300-300/zoom))+20-zoom,zoom/*2*/*(m-(300-300/zoom))+40-zoom,2*zoom,2*zoom); }
			}	hexGrid[n][m]=0; 	}
			if (hexGrid[n][m]==30) 						{ hexGrid[n][m]=0; } /* (off-cells, scanned 'not newborn' -> nothing to draw or erase here) */
		}}
		/*if(refreshGraphics==true) { i-=1; }*/  refreshGraphics=false;
		try { Thread.sleep(steptakt(stim)); } catch(InterruptedException e) { }
	}	}	/*	End 		..if-runbool==true		..	step()	*/
	
				/*			ENDE     STEP				*/
	
	public void run() { while(true) { if (i==0 || runbool==true) { /*try {*/try { step(getGraphics()); }catch(AWTException awex){ tf1.setText("awex caught from run()-step()"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} }/*}*/catch(ArrayIndexOutOfBoundsException aioobe){ tf1.setText("aioobe caught"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} } } } }
	
						/*			draw with clicks		*/
	
	public void mousePressed(MouseEvent e) {
	 	x=((e.getX())-20+zoom)/zoom+(300-300/zoom)/* /2 2 */; y=((e.getY())-40+zoom)/zoom+(300-300/zoom)/* /2 2 */;
	 	if (x>300-300/zoom/*0*/ && x<300+300/zoom/*300*/ && y>300-300/zoom/*0*/ && y<300+300/zoom/*300*/) {             
		 	mg=getGraphics(); /*mg.translate(20,40);*/
		 	if(( y   %4==0 &&  x   %2==0) || ( y   %2==0 &&  y   %4!=0 &&  x   %2!=0) ) { if (hexGrid[x]  [y]  ==0)  { hexGrid[x]  [y]  =1; dragbool=true; mg.setColor(Color.black/*green*/); mg./*fillRect*/fillOval(zoom/*2*/* (x-(300-300/zoom))   +20-zoom,zoom/*2*/* (y-(300-300/zoom))   +40-zoom,2*zoom,2*zoom); }else{ hexGrid[x]  [y]  =0; dragbool=false; mg.setColor(Color.lightGray); mg./*fillRect*/fillOval(zoom/*2*/* (x-(300-300/zoom))   +20-zoom,zoom/*2*/* (y-(300-300/zoom))   +40-zoom,2*zoom,2*zoom); } }
		 	if(( y   %4==0 && (x-1)%2==0) || ( y   %2==0 &&  y   %4!=0 && (x-1)%2!=0) ) { if (hexGrid[x-1][y]  ==0)  { hexGrid[x-1][y]  =1; dragbool=true; mg.setColor(Color.black/*green*/); mg./*fillRect*/fillOval(zoom/*2*/*(x-1-(300-300/zoom))+20-zoom,zoom/*2*/* (y-(300-300/zoom))   +40-zoom,2*zoom,2*zoom); }else{ hexGrid[x-1][y]  =0; dragbool=false; mg.setColor(Color.lightGray); mg./*fillRect*/fillOval(zoom/*2*/*(x-1-(300-300/zoom))+20-zoom,zoom/*2*/* (y-(300-300/zoom))   +40-zoom,2*zoom,2*zoom); } }
		 	if(((y-1)%4==0 &&  x   %2==0) || ((y-1)%2==0 && (y-1)%4!=0 &&  x   %2!=0) ) { if (hexGrid[x]  [y-1]==0)  { hexGrid[x]  [y-1]=1; dragbool=true; mg.setColor(Color.black/*green*/); mg./*fillRect*/fillOval(zoom/*2*/* (x-(300-300/zoom))   +20-zoom,zoom/*2*/*(y-1-(300-300/zoom))+40-zoom,2*zoom,2*zoom); }else{ hexGrid[x]  [y-1]=0; dragbool=false; mg.setColor(Color.lightGray); mg./*fillRect*/fillOval(zoom/*2*/* (x-(300-300/zoom))   +20-zoom,zoom/*2*/*(y-1-(300-300/zoom))+40-zoom,2*zoom,2*zoom); } }
		 	if(((y-1)%4==0 && (x-1)%2==0) || ((y-1)%2==0 && (y-1)%4!=0 && (x-1)%2!=0) ) { if (hexGrid[x-1][y-1]==0)  { hexGrid[x-1][y-1]=1; dragbool=true; mg.setColor(Color.black/*green*/); mg./*fillRect*/fillOval(zoom/*2*/*(x-1-(300-300/zoom))+20-zoom,zoom/*2*/*(y-1-(300-300/zoom))+40-zoom,2*zoom,2*zoom); }else{ hexGrid[x-1][y-1]=0; dragbool=false; mg.setColor(Color.lightGray); mg./*fillRect*/fillOval(zoom/*2*/*(x-1-(300-300/zoom))+20-zoom,zoom/*2*/*(y-1-(300-300/zoom))+40-zoom,2*zoom,2*zoom); } }
//			repaint();
	}	}
	public void mouseClicked(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) { relaxed=true; }
	
						/*			Tooltips			*/
						
	public void mouseEntered(MouseEvent e) {
		if(togtipbool==true) { 
			mg=getGraphics(); ec=e.getComponent();
			if (ec==screenshotbutton) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("makes a screenshot.jpg saved to program's directory",410,670); }
			if (ec==gridbutton) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("gridbutton repaints grid if necessary",410,670); mg.drawString("(re-zooming does similar)",430,690); }
			if (ec==clearbutton) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("clear whole Pattern",410,670); }
			if (ec==nillbutt||ec==onebutt||ec==fiftybutt||ec==hundredbutt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("speedbuttons",410,670); }
			if (ec==thsdbutt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("speedbuttons",410,670); mg.drawString("use this one + run-pause-run-pause.. ",410,690); mg.drawString("to run single steps",420,710); }
			if (ec==toggibutt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("toggle i-count and messages on / off",410,670); mg.drawString("untoggling will load from file much faster!",410,670); }
			if (ec==togtipbutt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("toggle tooltips on / off",410,670); }
			if (ec==savpatbutt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("save actual pattern together with current sb-rule (to ''classes''-folder)",410,670); mg.drawString("see cyan tf3 on how to type desired filename",410,690); }
			if (ec==loadpatsbutt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("load pattern with its saved sb-rule",410,670); mg.drawString("( that's why you saved it for with its rule )",420,690); mg.drawString("see cyan tf3 on how to choose filename to load",420,710); }
			if (ec==loadpatcbutt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("load pattern with current sb-rule",410,670); mg.drawString("( that's why you chose a rule below )",420,690); mg.drawString("see cyan tf3 on how to choose filename to load",420,710); }
			if (ec==zoom2butt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("zoom to 2x2 pixels per cell",410,670); }
			if (ec==zoom4butt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("unzoom back to 4x4 pixels per cell",410,670); }
			if (ec==zoom6butt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("zoom to 6x6 pixels per cell",410,670); }
			if (ec==zoom8butt) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("zoom to 8x8 pixels per cell",410,670); }
			if (ec==PattSaveMem1||ec==PattLoadMem1||ec==PattSaveMem2||ec==PattLoadMem2) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("fast save to and load from memory",410,670); mg.drawString("( not to file .. discarded after Window close )",420,700); }
			if (ec==rndPatt10||ec==rndPatt20) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("generate random pattern n*n in the center",410,670); }
			if (ec==rndPattL) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("generate random bar resp. rectangle (adds it)",410,670); mg.drawString("use scrollbars or textfields to adjust",420,690); mg.drawString("its size and amount of pixels",420,710); }
			if (ec==rndPatt_o) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("generate big random ring (adds it)",410,670); mg.drawString("type thickness of ring between",420,685); mg.drawString(" 1 and 150 to tf4 or use scrollbar",420,700); mg.drawString("use 1 for 1pix-circle",420,715); }
			if (ec==rndPixAmount) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("%-amount of random ''on'' cells",410,670); }
			if (ec==rndRadius) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("thickness of random pattern in pixels",410,670); }
			if (ec==tf2) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("tf2 for %-amount of random ''on'' cells",410,670); mg.drawString("( hit ''Enter'' to validate )",430,690); }
			if (ec==tf4) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("tf4 for thickness of random pattern in pixels",410,670); mg.drawString("( hit ''Enter'' to validate )",430,690); }
			if (ec==tf3) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("TextField 'tf3' for entering filename before saving or loading",410,670); mg.drawString("will save as / load from ''SavedPattern'' + [..] + ''.txt''",420,685); mg.drawString("eg. input ''-s2b23'' will save as / load from ''SavedPattern-s2b23.txt''",420,700); mg.drawString("! Attention ! .. saving will overwrite!",420,715); }
			if (ec==cbs0||ec==cbb0||ec==cbs6||ec==cbb6) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("choose any, some or no rule(s) for survival of 'on' cells",410,670); mg.drawString("and/or birth of 'off' cells, depending on",420,690); mg.drawString("the number of their 'on' neighbours",420,710); }
			if (ec==pcfro||ec==cfroul||ec==cfrou||ec==cfrour||ec==cfrol||ec==cfror||ec==cfrodl||ec==cfrod||ec==cfrodr) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("copy center area ( 200x200 like zoom 6p )",410,670); mg.drawString("to upleft, right, downleft or downuprightleftnose",420,690); mg.drawString("use center button to toggle 'clear or not' center after copying",410,710); }
			if (ec==pcto||ec==ctoul||ec==ctou||ec==ctour||ec==ctol||ec==ctor||ec==ctodl||ec==ctod||ec==ctodr) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("copy outer area upleftdownright ( 200x200 like center-zoom 6p )",410,670); mg.drawString("to center   ..   use center button to toggle 'clear or not'",420,690); mg.drawString("outer area after toggling .. errhh! .. copying!   *gosh*  ¦o))",420,710); }
			if (ec==pres1||ec==pres2||ec==pres3||ec==pres4||ec==pres5||ec==pres6||ec==pres7||ec==pres8||ec==pres9||ec==pres10) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("changing presets or rules while running may",410,670); mg.drawString("disturb iteration algorithm  ..  especially at high speed.",410,690); mg.drawString("better use pause when running big symmetric structures",410,710); }
			if (ec==clearcenteronly) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString("clear center only (for pasting from outer areas)",410,670); }
//			if (ec==) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString(" .. ",410,670); }
//			if (ec==) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString(" .. ",410,670); }
//			if (ec==) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString(" .. ",410,670); }
//			if (ec==) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString(" .. ",410,670); }
//			if (ec==) { mg.setColor(new Color(255,255,255,110)); mg.fillRect(400,655,380,70); mg.setColor(Color.black); mg.drawString(" .. ",410,670); }
//			else { /*mg.drawString(ec.toString(),410,670);*/ }mit gewünschtem Dateinamen
	}	}
	public void mouseExited(MouseEvent e) { if(togtipbool!=false||/**/i==1) { mg=getGraphics(); mg.clearRect(400,655,380,70); } }
	
						/*			draw by dragging		   	*/

	public void mouseDragged(MouseEvent e) {
	 	x=((e.getX())-20+zoom)/zoom+(300-300/zoom); y=((e.getY())-40+zoom)/zoom+(300-300/zoom);
	 	/*   x' = zoom * (x-(300-300/zoom)) +21 -zoom   becomes   x = (x'-21+zoom)/zoom) +(300-300/zoom)   */
	 	if (x>300-300/zoom && x<300+300/zoom && y>300-300/zoom && y<300+300/zoom) {
		 	mg=getGraphics();
		 	if(( y   %4==0 &&  x   %2==0) || ( y   %2==0 &&  y   %4!=0 &&  x   %2!=0) ) { 
			 	if (dragbool==true)  { hexGrid[x]  [y]  =1; mg.setColor(Color.black/*green*/); mg./*fillRect*/fillOval(zoom* (x-(300-300/zoom)) +20-zoom,zoom* (y-(300-300/zoom)) +40-zoom,2*zoom,2*zoom); } 
			 	if (dragbool==false) { hexGrid[x]  [y]  =0; mg.setColor(Color.lightGray); mg./*fillRect*/fillOval(zoom* (x-(300-300/zoom)) +20-zoom,zoom* (y-(300-300/zoom)) +40-zoom,2*zoom,2*zoom); 		 } }
		 	else if(( y   %4==0 && (x-1)%2==0) || ( y   %2==0 &&  y   %4!=0 && (x-1)%2!=0) ) { 
		 		if (dragbool==true)  { hexGrid[x-1][y]  =1; mg.setColor(Color.black/*green*/); mg./*fillRect*/fillOval(zoom*(x-1-(300-300/zoom)) +20-zoom,zoom* (y-(300-300/zoom)) +40-zoom,2*zoom,2*zoom);  } 
		 		if (dragbool==false) { hexGrid[x-1][y]  =0; mg.setColor(Color.lightGray); mg./*fillRect*/fillOval(zoom*(x-1-(300-300/zoom)) +20-zoom,zoom* (y-(300-300/zoom)) +40-zoom,2*zoom,2*zoom); 		} }
		 	else if(((y-1)%4==0 &&  x   %2==0) || ((y-1)%2==0 && (y-1)%4!=0 &&  x   %2!=0) ) { 
		 		if (dragbool==true)  { hexGrid[x]  [y-1]=1; mg.setColor(Color.black/*green*/); mg./*fillRect*/fillOval(zoom* (x-(300-300/zoom)) +20-zoom,zoom*(y-1-(300-300/zoom)) +40-zoom,2*zoom,2*zoom);  } 
		 		if (dragbool==false) { hexGrid[x]  [y-1]=0; mg.setColor(Color.lightGray); mg./*fillRect*/fillOval(zoom* (x-(300-300/zoom)) +20-zoom,zoom*(y-1-(300-300/zoom)) +40-zoom,2*zoom,2*zoom); 		} }
		 	else if(((y-1)%4==0 && (x-1)%2==0) || ((y-1)%2==0 && (y-1)%4!=0 && (x-1)%2!=0) ) { 
		 		if (dragbool==true)  { hexGrid[x-1][y-1]=1; mg.setColor(Color.black/*green*/); mg./*fillRect*/fillOval(zoom*(x-1-(300-300/zoom)) +20-zoom,zoom*(y-1-(300-300/zoom)) +40-zoom,2*zoom,2*zoom); } 
		 		if (dragbool==false) { hexGrid[x-1][y-1]=0; mg.setColor(Color.lightGray); mg./*fillRect*/fillOval(zoom*(x-1-(300-300/zoom)) +20-zoom,zoom*(y-1-(300-300/zoom)) +40-zoom,2*zoom,2*zoom); 		} }
	}	}
								 		/**/ /**/		/**/ /**/		/**/ /**/		/**/ /**/

	/*		show start-Tooltip	*/
	public void mouseMoved(MouseEvent e) {
		if ( onlyjuststarted==true && 20" ); pausebool=true; runbool=false; if(toggibool==true) { tf1.setText("paused .. i="+i); } }
		if (cmd==">" ) { pauserunbutton.setLabel("||"); runbool=true; pausebool=false; }
		if (cmd=="#" ) {  gridnew=true; refreshGraphics=true; try { /*pauserunbutton.setLabel(">" ); pausebool=true; runbool=false;*/ if(toggibool==true) { tf1.setText("paused .. i="+i); }
								step(getGraphics()); } catch(AWTException awex) {} }		// nur einmal step(), falls pausebool==true
		if (cmd=="scr" ) { shot=true; }
		if (cmd=="c" ) { try { pauserunbutton.setLabel(">" ); pausebool=true; runbool=false; i=0; if(toggibool==true) { tf1.setText("reset .. i="+i); }
								step(getGraphics()); } catch(AWTException awex) {} }	/*clearcells(); } catch(Exception e) {}	}*/
		if (cmd=="0" ) { stim=0; nillbutt.setForeground(Color.white); onebutt.setForeground(Color.black); fiftybutt.setForeground(Color.black); hundredbutt.setForeground(Color.black); thsdbutt.setForeground(Color.black);     nillbutt.setBackground(Color.gray); onebutt.setBackground(Color.lightGray); fiftybutt.setBackground(Color.lightGray); hundredbutt.setBackground(Color.lightGray); thsdbutt.setBackground(Color.lightGray); steptakt(stim); }		
		if (cmd=="10" ) { stim=10; onebutt.setForeground(Color.white); fiftybutt.setForeground(Color.black); nillbutt.setForeground(Color.black); hundredbutt.setForeground(Color.black); thsdbutt.setForeground(Color.black);   onebutt.setBackground(Color.gray); fiftybutt.setBackground(Color.lightGray); nillbutt.setBackground(Color.lightGray); hundredbutt.setBackground(Color.lightGray); thsdbutt.setBackground(Color.lightGray); steptakt(stim); }	
		if (cmd=="50" ) { stim=50; fiftybutt.setForeground(Color.white); onebutt.setForeground(Color.black); nillbutt.setForeground(Color.black);hundredbutt.setForeground(Color.black); thsdbutt.setForeground(Color.black);    fiftybutt.setBackground(Color.gray); onebutt.setBackground(Color.lightGray); nillbutt.setBackground(Color.lightGray);hundredbutt.setBackground(Color.lightGray); thsdbutt.setBackground(Color.lightGray);  steptakt(stim); }	
		if (cmd=="100" ) { stim=100; hundredbutt.setForeground(Color.white); onebutt.setForeground(Color.black); fiftybutt.setForeground(Color.black); nillbutt.setForeground(Color.black);thsdbutt.setForeground(Color.black);  hundredbutt.setBackground(Color.gray); onebutt.setBackground(Color.lightGray); fiftybutt.setBackground(Color.lightGray); nillbutt.setBackground(Color.lightGray);thsdbutt.setBackground(Color.lightGray);  steptakt(stim); }	
		if (cmd=="500" ) { stim=500; thsdbutt.setForeground(Color.white); onebutt.setForeground(Color.black); fiftybutt.setForeground(Color.black); nillbutt.setForeground(Color.black); hundredbutt.setForeground(Color.black); thsdbutt.setBackground(Color.gray); onebutt.setBackground(Color.lightGray); fiftybutt.setBackground(Color.lightGray); nillbutt.setBackground(Color.lightGray); hundredbutt.setBackground(Color.lightGray); steptakt(stim); }	
		if (cmd==" " ) { f=new File(tf3.getText()+".jpg"); }
		if (cmd=="2p" ) { zoom=1; zoom2butt.setForeground(Color.white); zoom4butt.setForeground(Color.black); zoom6butt.setForeground(Color.black); zoom8butt.setForeground(Color.black);  zoom2butt.setBackground(Color.gray); zoom4butt.setBackground(Color.lightGray); zoom6butt.setBackground(Color.lightGray); zoom8butt.setBackground(Color.lightGray);  mg.clearRect(20,40,610,610);
								gridnew=true; refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} }
		if (cmd=="4p" ) { zoom=2; zoom2butt.setForeground(Color.black); zoom4butt.setForeground(Color.white); zoom6butt.setForeground(Color.black); zoom8butt.setForeground(Color.black);  zoom2butt.setBackground(Color.lightGray); zoom4butt.setBackground(Color.gray); zoom6butt.setBackground(Color.lightGray); zoom8butt.setBackground(Color.lightGray);  mg.clearRect(20,40,610,610);
								gridnew=true; refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} }
		if (cmd=="6p" ) { zoom=3; zoom2butt.setForeground(Color.black); zoom4butt.setForeground(Color.black); zoom6butt.setForeground(Color.white); zoom8butt.setForeground(Color.black);  zoom2butt.setBackground(Color.lightGray); zoom4butt.setBackground(Color.lightGray); zoom6butt.setBackground(Color.gray); zoom8butt.setBackground(Color.lightGray);  mg.clearRect(20,40,610,610);
								gridnew=true; refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} }
		if (cmd=="8p" ) { zoom=4; zoom2butt.setForeground(Color.black); zoom4butt.setForeground(Color.black); zoom6butt.setForeground(Color.black); zoom8butt.setForeground(Color.white);  zoom2butt.setBackground(Color.lightGray); zoom4butt.setBackground(Color.lightGray); zoom6butt.setBackground(Color.lightGray); zoom8butt.setBackground(Color.gray);  mg.clearRect(20,40,610,610);
								gridnew=true; refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} }
		if (ae.getSource()==toggibutt ) { if(toggibool==true) { toggibool=false; }		else if(toggibool==false) { toggibool=true; } }
		if (ae.getSource()==togtipbutt) {   if(togtipbool==true) {   togtipbool=false; 	  mg.clearRect(400,640,390,100);          
//			eiskristalle_Makro_41_HP=getToolkit().getImage("Eiskristalle_Makro_41_HP.jpg"); moos=getToolkit().getImage("Moos.jpg"/*bmp*//*gif*/); xantho=getToolkit().getImage("Xanthoriaparietina.jpg"); flechte1=getToolkit().getImage("Flechte1.jpg"); flechte13=getToolkit().getImage("Flechte13.jpg"); flechte12=getToolkit().getImage("Flechte12.jpg"); flechte_schuessel_fl=getToolkit().getImage("Flechte_schuessel_fl.jpg"); datronia_mollis=getToolkit().getImage("Datronia_mollis.jpg"); antarktisflechte=getToolkit().getImage("Antarktisflechte.jpg"); vomKirschbaum=getToolkit().getImage("VomKirschbaum.jpg"); daheim_Schneekristalle=getToolkit().getImage("Daheim_Schneekristalle.jpg"); naturSchneekristall=getToolkit().getImage("NaturSchneekristall.jpg");
			eiskristalle_Makro_41_HP=Toolkit.getDefaultToolkit().getImage("Eiskristalle_Makro_41_HP.jpg"); moos=Toolkit.getDefaultToolkit().getImage("Moos.jpg"/*bmp*//*gif*/); xantho=Toolkit.getDefaultToolkit().getImage("Xanthoriaparietina.jpg"); flechte1=Toolkit.getDefaultToolkit().getImage("Flechte1.jpg"); flechte13=Toolkit.getDefaultToolkit().getImage("Flechte13.jpg"); flechte12=Toolkit.getDefaultToolkit().getImage("Flechte12.jpg"); flechte_schuessel_fl=Toolkit.getDefaultToolkit().getImage("Flechte_schuessel_fl.jpg"); datronia_mollis=Toolkit.getDefaultToolkit().getImage("Datronia_mollis.jpg"); antarktisflechte=Toolkit.getDefaultToolkit().getImage("Antarktisflechte.jpg"); vomKirschbaum=Toolkit.getDefaultToolkit().getImage("VomKirschbaum.jpg"); daheim_Schneekristalle=Toolkit.getDefaultToolkit().getImage("Daheim_Schneekristalle.jpg"); naturSchneekristall=Toolkit.getDefaultToolkit().getImage("NaturSchneekristall.jpg");
			/*mediatracker=new MediaTracker(this);*/ 	mediatracker.addImage(eiskristalle_Makro_41_HP,0);	mediatracker.addImage(moos,0);	mediatracker.addImage(xantho,0);	mediatracker.addImage(flechte1,0);	mediatracker.addImage(flechte13,0);	mediatracker.addImage(flechte12,0);	mediatracker.addImage(flechte_schuessel_fl,0);	mediatracker.addImage(datronia_mollis,0);	mediatracker.addImage(antarktisflechte,0);	mediatracker.addImage(vomKirschbaum,0);	mediatracker.addImage(daheim_Schneekristalle,0);	mediatracker.addImage(naturSchneekristall,0);
			try{ mediatracker.waitForAll(); }catch(InterruptedException iex) {}
			switch ( (int)(Math.random()*12) ) {
				case 0: mg.drawImage(eiskristalle_Makro_41_HP,500,640,this); break;  case 1: mg.drawImage(moos,500,640,this); break;  case 2: mg.drawImage(xantho,490,640,this); break;  case 3: mg.drawImage(flechte1,490,640,this); break;  case 4: mg.drawImage(flechte13,490,640,this); break;  case 5: mg.drawImage(flechte12,490,640,this); break;  case 6: mg.drawImage(flechte_schuessel_fl,510,640,this); break;  case 7: mg.drawImage(datronia_mollis,480,640,this); break;  case 8: mg.drawImage(antarktisflechte,490,640,this); break;  case 9: mg.drawImage(vomKirschbaum,490,640,this); break;  case 10: mg.drawImage(daheim_Schneekristalle,460,640,this); break;  case 11: mg.drawImage(naturSchneekristall,450,640,this); break; 
		} /*refreshGraphics=true; try{step(getGraphics());}catch(AWTException awex){}  refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} i-=2;*/	}	else if(togtipbool==false) { togtipbool=true; } }
	   		
		/*		save pattern to file	with its rule 	*/
		if (cmd=="s") { /*  */
	//		try { /*File */PattFile= new File("c:/progeigene/JCreator/MyProjects/stories/hexLife/loadable patterns/SavedPattern"+tf3.getText()/*i*/+".txt"); PattFile.createNewFile();	}catch(FileNotFoundException fnofex) {}catch(IOException joex) {}
			try { /*File */PattFile= new File("SavedPattern"+tf3.getText()/*i*/+".txt"); PattFile.createNewFile();	}catch(FileNotFoundException fnofex) {}catch(IOException joex) {}
			/* .. ( landet ohne Pfadangabe im classes-Ordner ) .. 
			 * .. Nur existierende Pfade werden angenommen, also keine neuen Ordner angelegt.
			 * .. auch relative Pfade, wie in DOS liefern Exceptions. */
			try { randaff=new RandomAccessFile(PattFile,"rw"); }catch(FileNotFoundException fnofex) {}/*catch(IOException joex) {}*/
			
				try { randaff.writeInt(-80); if (cbs0.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-81); if (cbs1.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-82); if (cbs2.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-83); if (cbs3.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-84); if (cbs4.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-85); if (cbs5.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-86); if (cbs6.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-90); if (cbb0.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-91); if (cbb1.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-92); if (cbb2.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-93); if (cbb3.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-94); if (cbb4.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-95); if (cbb5.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
						randaff.writeInt(-96); if (cbb6.getState()==true) { randaff.writeInt(-11); } else { randaff.writeInt(-10); }
				}catch(IOException joex) { tf1.setText("joex caught from s"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} }
			
			for(int x=0;x<=600;++x/*+=2*/) { for (int y=0;y<=600;++y/*+=2*/) {
				try {   if (hexGrid[x/*+200*/][y]==1)/**/ { randaff.writeInt(x); randaff.writeInt(y);/**/ }
				}catch(IOException joex) { tf1.setText("joex caught from s"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} }
			/* if you're curious to see how bytes are written as ASCII chars to ''SavedPattern*.txt'' use: */
//			for(int x=0;x<=600;++x) { 			try { randaff.write(x);
//				}catch(IOException joex) { eg=getGraphics(); eg.drawString("joex caught from s"+i,50,720); } }
			/* .. open file like usual. To see the unprintable characters too choose font ''Terminal'' in WordPad or Word		*/
		} }	try { randaff.close(); }catch(IOException ioex){}	}
																														/**/	/**/
		/*		load pattern from file with or without its rule		*/
		if (cmd=="ls"||cmd=="lc") { 
	//		/*try {*/ PattFile= new File("c:/progeigene/JCreator/MyProjects/stories/hexLife/loadable patterns/SavedPattern"+tf3.getText()+".txt"); /*PattFile.createNewFile(); hier auch?	}catch(FileNotFoundException fnofex) {}catch(IOException joex) {}*/
			/*try {*/ PattFile= new File("SavedPattern"+tf3.getText()+".txt"); /*PattFile.createNewFile(); hier auch?	}catch(FileNotFoundException fnofex) {}catch(IOException joex) {}*/
			try { randaff=new RandomAccessFile(PattFile,"r"); }catch(FileNotFoundException fnofex) {}
//			/*cmd="c"; */	try { step(getGraphics()); }catch(AWTException awex) { eg=getGraphics(); eg.drawString("awex caught from ls"+i,50,720); }
			if(cmd=="ls") {	/* sicherer wär' erst checken, ob readInt()==-80 usw ..  */
				try { randaff.readInt(); if (randaff.readInt()==-11) { cbs0.setState(true); } else { cbs0.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbs1.setState(true); } else { cbs1.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbs2.setState(true); } else { cbs2.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbs3.setState(true); } else { cbs3.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbs4.setState(true); } else { cbs4.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbs5.setState(true); } else { cbs5.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbs6.setState(true); } else { cbs6.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbb0.setState(true); } else { cbb0.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbb1.setState(true); } else { cbb1.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbb2.setState(true); } else { cbb2.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbb3.setState(true); } else { cbb3.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbb4.setState(true); } else { cbb4.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbb5.setState(true); } else { cbb5.setState(false); }
						randaff.readInt(); if (randaff.readInt()==-11) { cbb6.setState(true); } else { cbb6.setState(false); }
				}catch(IOException joex) { tf1.setText("joex caught from ls"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} }
			} else { try { for(int n=1;n<=28;++n) { randaff.readInt(); } }catch(IOException joex) { tf1.setText("joex caught from lc"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} } }
			int x; int y;	try {
									while( (x=randaff.readInt()) != -1 /* ''-1'' here: 'eof' */) { while( (y=randaff.readInt()) != -1 ) {
										hexGrid[x][y]=1;  if(toggibool==true){tf1.setText("loading cells from file .. x = "+x+",   y = "+y);} /* debug eg=getGraphics(); eg.drawString(" "+i+" "+hexGrid[x][y],50+i,720);*/ break;
										}
										/*try{Thread.sleep(1);}catch(InterruptedException ie){}*/ }	randaff.close();
								}
								catch(EOFException eofex) { tf1.setText("eofex caught from ls"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} }catch(IOException jojex) { tf1.setText("jojex caught from ls"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} }
//								try { randaff.close(); }catch(IOException ioex){ eg=getGraphics(); eg.drawString("ioex caught from ls"+i,50,720); }
								gridnew=true; refreshGraphics=true;  try { step(getGraphics()); }catch(AWTException awex) { tf1.setText("awex caught from ls"+i); try{Thread.sleep(500);}catch(InterruptedException ie){} }
		}
			
		if (cmd=="SM1") { for(int x=0;x<=600;++x) { for(int y=0;y<=600;++y) { hexMem1[x][y]=hexGrid[x][y]; } } PattSaveMem1.setBackground(Color.gray); PattSaveMem1.setForeground(Color.white); }
		if (cmd=="SM2") {	for(int x=0;x<=600;++x) { for(int y=0;y<=600;++y) { hexMem2[x][y]=hexGrid[x][y]; } } PattSaveMem2.setBackground(Color.gray); PattSaveMem2.setForeground(Color.white); }
		if (cmd=="LM1") { cmd="c";	 for(int x=0;x<=600;++x) { for(int y=0;y<=600;++y) { hexGrid[x][y]=hexMem1[x][y]; } } cmd=null; /*  queer, but works .. looks like   cmd=''c'';   is evaluated even though step() is only required later .. ?! (however .. it works!) */
								/*gridnew=true;*/ refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} i=1; } /* (without   cmd=''0''; pattern will be cleared in second   step() ?! ) */
		if (cmd=="LM2") { cmd="c";	 for(int x=0;x<=600;++x) { for(int y=0;y<=600;++y) { hexGrid[x][y]=hexMem2[x][y]; } } cmd=null;
								/*gridnew=true;*/ refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {}  refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} i=1; }
		if (cmd=="rnd 10") { rnd10bool=true; /*cmd="c"; gridnew=true;*/ refreshGraphics=true; try{step(getGraphics());}catch(AWTException awex){}  refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} i=1; } 										/* bad, queer code, but works ?! .. does one step with refresh and rnd_bool true .. */
		if (cmd=="rnd 20") { rnd20bool=true; /*cmd="c"; gridnew=true;*/ refreshGraphics=true; try{step(getGraphics());}catch(AWTException awex){}  refreshGraphics=true; try { step(getGraphics()); } catch(AWTException awex) {} i=1; }										/*  .. (with both rnd_bool and refresh reset back to false),..								 */
		if (cmd=="rnd |") { rndLbool=true; 	if(toggibool==true){tf1.setText(".. loading .. PLZ WAIT !");} /*cmd="c"; gridnew=true;*/ refreshGraphics=true; try{step(getGraphics());}catch(AWTException awex){}  refreshGraphics=true; try{step(getGraphics());}catch(AWTException awex){} i=1; } /* .. then does another step with refresh and puts i back */
		if (cmd=="rnd O") { rnd_obool=true; if(toggibool==true){tf1.setText(".. loading .. PLZ WAIT !");} /*cmd="c"; gridnew=true;*/ refreshGraphics=true; try{step(getGraphics());}catch(AWTException awex){}  refreshGraphics=true; try{step(getGraphics());}catch(AWTException awex){} i=1; }
		if(ae.getSource()==tf2) { rndPixAmount.setValue((int)(tf2StringToInteger.valueOf(tf2.getText()).intValue()*1.5)); }
		if(ae.getSource()==tf4) { rndRadius.setValue((int)(tf4StringToInteger.valueOf(tf4.getText()).intValue())); }
		if(ae.getSource()==pres1) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(true); cbs3.setState(false); cbs4.setState(false); cbs5.setState(false); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(true); cbb3.setState(true); cbb4.setState(false); cbb5.setState(false); cbb6.setState(false); }
		if(ae.getSource()==pres2) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(true); cbs3.setState(true); cbs4.setState(false); cbs5.setState(true); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(true); cbb4.setState(true); cbb5.setState(false); cbb6.setState(false); }
		if(ae.getSource()==pres3) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(false); cbs3.setState(true); cbs4.setState(false); cbs5.setState(false); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(true); cbb3.setState(false); cbb4.setState(true); cbb5.setState(true); cbb6.setState(false); }
		if(ae.getSource()==pres4) { cbs0.setState(true); cbs1.setState(true); cbs2.setState(true); cbs3.setState(true); cbs4.setState(false); cbs5.setState(false); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(true); cbb4.setState(false); cbb5.setState(false); cbb6.setState(false); }
		if(ae.getSource()==pres5) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(false); cbs3.setState(true); cbs4.setState(true); cbs5.setState(true); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(true); cbb3.setState(false); cbb4.setState(false); cbb5.setState(false); cbb6.setState(false); }
		if(ae.getSource()==pres6) { cbs0.setState(true); cbs1.setState(false); cbs2.setState(true); cbs3.setState(false); cbs4.setState(true); cbs5.setState(true); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(true); cbb4.setState(true); cbb5.setState(true); cbb6.setState(false); }
		if(ae.getSource()==pres7) { cbs0.setState(false); cbs1.setState(true); cbs2.setState(true); cbs3.setState(false); cbs4.setState(true); cbs5.setState(true); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(true); cbb4.setState(true); cbb5.setState(true); cbb6.setState(true); }
		if(ae.getSource()==pres8) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(false); cbs3.setState(false); cbs4.setState(false); cbs5.setState(false); cbs6.setState(false); cbb0.setState(false); cbb1.setState(true); cbb2.setState(true); cbb3.setState(false); cbb4.setState(false); cbb5.setState(false); cbb6.setState(false); }
		if(ae.getSource()==pres9) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(false); cbs3.setState(true); cbs4.setState(true); cbs5.setState(true); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(true); cbb4.setState(true); cbb5.setState(true); cbb6.setState(false); }
		if(ae.getSource()==pres10) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(true); cbs3.setState(true); cbs4.setState(true); cbs5.setState(true); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(true); cbb4.setState(true); cbb5.setState(true); cbb6.setState(true); }
	//	if(ae.getSource()==pres) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(false); cbs3.setState(false); cbs4.setState(false); cbs5.setState(false); cbs6.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(false); cbb4.setState(false); cbb5.setState(false); cbb6.setState(false); }
	//	if(ae.getSource()==pres) { cbs0.setState(false); cbs1.setState(false); cbs2.setState(false); cbs3.setState(false); cbs4.setState(false); cbs5.setState(false); cbb.setState(false); cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(false); cbb4.setState(false); cbb5.setState(false); cbb6.setState(false); }
		if(ae.getSource()==cfroul||ae.getSource()==cfrou||ae.getSource()==cfrour||ae.getSource()==cfrol||ae.getSource()==cfror||ae.getSource()==cfrodl||ae.getSource()==cfrod||ae.getSource()==cfrodr) { 
		 for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexCopy[x][y]=hexGrid[x][y];
		 } } /* center von hexGrid[][] wurde ausgelesen und kopiert nach hexCopy[][] */
		 if(ae.getSource()==cfroul) { for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexGrid[x-200][y-200]=hexCopy[x][y]; hexCopy[x][y]=0; } } } 
		 if(ae.getSource()==cfrou) { for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexGrid[x][y-200]=hexCopy[x][y]; hexCopy[x][y]=0; } } } 
		 if(ae.getSource()==cfrour) { for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexGrid[x+200][y-200]=hexCopy[x][y]; hexCopy[x][y]=0; } } } 
		 if(ae.getSource()==cfrol) { for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexGrid[x-200][y]=hexCopy[x][y]; hexCopy[x][y]=0; } } } 
		 if(ae.getSource()==cfror) { for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexGrid[x+200][y]=hexCopy[x][y]; hexCopy[x][y]=0; } } } 
		 if(ae.getSource()==cfrodl) { for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexGrid[x-200][y+200]=hexCopy[x][y]; hexCopy[x][y]=0; } } } 
		 if(ae.getSource()==cfrod) { for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexGrid[x][y+200]=hexCopy[x][y]; hexCopy[x][y]=0; } } } 
		 if(ae.getSource()==cfrodr) { for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { hexGrid[x+200][y+200]=hexCopy[x][y]; hexCopy[x][y]=0; } } } 
		 if(pcfro_bool==false){ for(x=201;x<=400;++x) { for(y=202;y<=400;/*++*/y+=2) { if(hexGrid[x][y]==1){ hexGrid[x][y]=77/*10*//*0*/; } } } }
		} /* abhängig von wohin wurde hexCopy[][] ins hexGrid[][] zurückkopiert (und selbst wieder gelöscht), dann das hexGrid[][]-center gelöscht oder nicht */
		if(ae.getSource()==pcfro) { if(pcfro_bool==false){ pcfro_bool=true; pcfro.setLabel("+"); } else /* ! not only ''if'' ;o)) ! */ if(pcfro_bool==true){ pcfro_bool=false; pcfro.setLabel("-"); }  }
		/* jetzt umgekehrt .. */																			
		if(ae.getSource()==ctoul||ae.getSource()==ctou||ae.getSource()==ctour||ae.getSource()==ctol||ae.getSource()==ctor||ae.getSource()==ctodl||ae.getSource()==ctod||ae.getSource()==ctodr) { 
			/* erst werden die Randbereiche abhängig 'von woher' ausgelesen, ins center von hexCopy[][] kopiert, und am Rand (hexGrid[][]) schon gelöscht oder nicht */
			if(ae.getSource()==ctoul) { for(x=0;x<=200;++x) { for(y=0;y<=200;/*++*/y+=2) { hexCopy[x+200][y+200]=hexGrid[x][y]; if(pcto_bool==false){ if(hexGrid[x][y]==1){ hexGrid[x][y]=77; }  } } }  }
			if(ae.getSource()==ctou) { for(x=200;x<=400;++x) { for(y=0;y<=200;/*++*/y+=2) { hexCopy[x][y+200]=hexGrid[x][y]; if(pcto_bool==false){ if(hexGrid[x][y]==1){ hexGrid[x][y]=77; } } } }  }
			if(ae.getSource()==ctour) { for(x=400;x<=600;++x) { for(y=0;y<=200;/*++*/y+=2) { hexCopy[x-200][y+200]=hexGrid[x][y]; if(pcto_bool==false){ if(hexGrid[x][y]==1){ hexGrid[x][y]=77; } } } }  }
			if(ae.getSource()==ctol) { for(x=0;x<=200;++x) { for(y=200;y<=400;/*++*/y+=2) { hexCopy[x+200][y]=hexGrid[x][y]; if(pcto_bool==false){ if(hexGrid[x][y]==1){ hexGrid[x][y]=77; } } } }  }
			if(ae.getSource()==ctor) { for(x=400;x<=600;++x) { for(y=200;y<=400;/*++*/y+=2) { hexCopy[x-200][y]=hexGrid[x][y]; if(pcto_bool==false){ if(hexGrid[x][y]==1){ hexGrid[x][y]=77; } } } }  }
			if(ae.getSource()==ctodl) { for(x=0;x<=200;++x) { for(y=400;y<=600;/*++*/y+=2) { hexCopy[x+200][y-200]=hexGrid[x][y]; if(pcto_bool==false){ if(hexGrid[x][y]==1){ hexGrid[x][y]=77; } } } }  }
			if(ae.getSource()==ctod) { for(x=200;x<=400;++x) { for(y=400;y<=600;/*++*/y+=2) { hexCopy[x][y-200]=hexGrid[x][y]; if(pcto_bool==false){ if(hexGrid[x][y]==1){ hexGrid[x][y]=77; } } } }  }
			if(ae.getSource()==ctodr) { for(x=400;x<=600;++x) { for(y=400;y<=600;/*++*/y+=2) { hexCopy[x-200][y-200]=hexGrid[x][y]; if(pcto_bool==false){ if(hexGrid[x][y]==1){ hexGrid[x][y]=77; } } } }  }
				for(x=200;x<=400;++x) { for(y=200;y<=400;/*++*/y+=2) { hexGrid[x][y]=hexCopy[x][y]; hexCopy[x][y]=0;
			} } /* .. und (Zeile drüber) von hexCopy[][]-center für hexGrid einfach übernommen! ( und hexCopy[][] gelöscht ) */
		}
		if(ae.getSource()==pcto) { if(pcto_bool==false){ pcto_bool=true; pcto.setLabel("+"); } else if(pcto_bool==true){ pcto_bool=false; pcto.setLabel("-"); }  }
		if(ae.getSource()==clearcenteronly) { for(x=200;x<=400;++x) { for(y=200;y<=400;/*++*/y+=2) { hexGrid[x][y]=0; } }  refreshGraphics=true; try{step(getGraphics());}catch(AWTException awex){} }
	}	/* end..actionperformed() */					/*	 */
	
	public int steptakt(int stim) { return stim; }
															 /**/ /**/		/*	if(toggibool==true){}	*/ /**/		/**/		/**/ /**/		/**/ /**/		/**/
	public void itemStateChanged(ItemEvent ie) {}
	
	public void adjustmentValueChanged(AdjustmentEvent adje) {  			 /* hier drunter ''/1.5'', da Wert in Prozent von 150 gewollt */
		if(adje.getSource()==rndPixAmount) {  tf2.setText( ""+String.valueOf( (int)((double)(adje.getValue()/1.5)) )/* or: +" "+Integer.toString( (int)((double)(adje.getValue()/1.5)) )*/ ); }
		if(adje.getSource()==rndRadius) {  tf4.setText( ""+String.valueOf( (int)(adje.getValue()) ) ); } /* hier Radius in Pixeln */
	}
		
	public HexLife1stUpload()	/*throws FileNotFoundException, IOException*/ {
//		try { PattFile.createNewFile(); }catch(IOException joex) {}
		addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } } );
		addMouseListener(this);
		addMouseMotionListener(this);
		setLayout(null);
		pauserunbutton=new Button(">"); pauserunbutton.setBounds(650,50,30,20); pauserunbutton.setBackground(Color.white); pauserunbutton.addActionListener(this); add(pauserunbutton);
		gridbutton=new Button("#"); gridbutton.setBounds(700,50,30,20); gridbutton.setBackground(Color.lightGray); gridbutton.addActionListener(this); gridbutton.addMouseListener(this); add(gridbutton);
		tf1=new TextField(); tf1.setBounds(40,645,300,20); tf1.setBackground(Color.white); tf1.addActionListener(this); add(tf1);
		screenshotbutton=new Button("scr"); screenshotbutton.setBounds(700,70,30,20); screenshotbutton.setBackground(Color.lightGray); screenshotbutton.addActionListener(this); screenshotbutton.addMouseListener(this); add(screenshotbutton);
		clearbutton=new Button("c"); clearbutton.setBounds(700,90,30,20); clearbutton.setBackground(Color.orange); clearbutton.addActionListener(this); clearbutton.addMouseListener(this); add(clearbutton);
		nillbutt	=new Button("0"); 	nillbutt.setBounds(650,70,30,20); 		nillbutt.setBackground(Color.lightGray); 		nillbutt.addActionListener(this); 	nillbutt.addMouseListener(this); add(nillbutt);
		onebutt		=new Button("10"); 	onebutt.setBounds(650,90,30,20); 		onebutt.setBackground(Color.lightGray); 			onebutt.addActionListener(this); 	onebutt.addMouseListener(this); add(onebutt);
		fiftybutt	=new Button("50"); 	fiftybutt.setBounds(650,110,30,20); 	fiftybutt.setBackground(Color.gray); 	fiftybutt.setForeground(Color.white); fiftybutt.addMouseListener(this); fiftybutt.addActionListener(this); 	add(fiftybutt);
		hundredbutt	=new Button("100"); hundredbutt.setBounds(650,130,30,20); 	hundredbutt.setBackground(Color.lightGray); 		hundredbutt.addActionListener(this); hundredbutt.addMouseListener(this); add(hundredbutt);
		thsdbutt	=new Button("500"); thsdbutt.setBounds(650,150,30,20); 		thsdbutt.setBackground(Color.lightGray); 		thsdbutt.addActionListener(this); 	thsdbutt.addMouseListener(this); add(thsdbutt);
		toggibutt =new Button("±"); toggibutt.setBounds(25,647,15,15); toggibutt.setForeground(Color.white); toggibutt.addActionListener(this); toggibutt.addMouseListener(this); add(toggibutt);
		togtipbutt =new Button("±"); togtipbutt.setBounds(780,720,15,15); togtipbutt.setForeground(Color.white); togtipbutt.addActionListener(this); togtipbutt.addMouseListener(this); add(togtipbutt);
		savpatbutt =new Button("s"); savpatbutt.setBounds(650,180,30,20); savpatbutt.setBackground(Color.cyan); savpatbutt.addActionListener(this); savpatbutt.addMouseListener(this); add(savpatbutt);
		loadpatsbutt =new Button("ls"); loadpatsbutt.setBounds(635,200,30,20); loadpatsbutt.setBackground(Color.cyan); loadpatsbutt.addActionListener(this); loadpatsbutt.addMouseListener(this); add(loadpatsbutt);
		loadpatcbutt =new Button("lc"); loadpatcbutt.setBounds(665,200,30,20); loadpatcbutt.setBackground(Color.cyan); loadpatcbutt.addActionListener(this); loadpatcbutt.addMouseListener(this); add(loadpatcbutt);
		zoom2butt =new Button("2p"); zoom2butt.setBounds(700,120,30,20); zoom2butt.setBackground(Color.lightGray); zoom2butt.addActionListener(this); zoom2butt.addMouseListener(this); add(zoom2butt);
		zoom4butt =new Button("4p"); zoom4butt.setBounds(700,140,30,20); zoom4butt.setBackground(Color.gray); zoom4butt.setForeground(Color.white); zoom4butt.addActionListener(this); zoom4butt.addMouseListener(this); add(zoom4butt);
		zoom6butt =new Button("6p"); zoom6butt.setBounds(700,160,30,20); zoom6butt.setBackground(Color.lightGray); zoom6butt.addActionListener(this); zoom6butt.addMouseListener(this); add(zoom6butt);
		zoom8butt =new Button("8p"); zoom8butt.setBounds(700,180,30,20); zoom8butt.setBackground(Color.lightGray); zoom8butt.addActionListener(this); zoom8butt.addMouseListener(this); add(zoom8butt);
//		try { s0=new CheckboxGroup(); cbs0=new Checkbox("0",s0,false); cbs0.setBounds(650,500,30,10);/*cbs0.setLocation(700,300);*/ add(cbs0); }catch(HeadlessException he){}
//		try { s1=new CheckboxGroup(); cbs1=new Checkbox("1",s1,true); cbs1.setBounds(650,520,30,10); add(cbs1); }catch(HeadlessException he){}
//		try { cbs2=new Checkbox("2",s0,false); cbs2.setBounds(650,540,30,10/*650,380,30,15*/); add(cbs2); }catch(HeadlessException he) {}
		cbs0=new Checkbox("0",false); cbs0.setBounds(630,500,30,15); cbs0.setBackground(Color.white); add(cbs0);		cbb0=new Checkbox("0",false); cbb0.setBounds(680,500,30,15); cbb0.setBackground(Color.white); add(cbb0);
		cbs1=new Checkbox("1",true); cbs1.setBounds(630,520,30,15); cbs1.setBackground(Color.white); add(cbs1);		cbb1=new Checkbox("1",false); cbb1.setBounds(680,520,30,15); cbb1.setBackground(Color.white); add(cbb1);
		cbs2=new Checkbox("2",false); cbs2.setBounds(630,540,30,15); cbs2.setBackground(Color.white); add(cbs2);		cbb2=new Checkbox("2",true); cbb2.setBounds(680,540,30,15); cbb2.setBackground(Color.white); add(cbb2);
		cbs3=new Checkbox("3",false); cbs3.setBounds(630,560,30,15); cbs3.setBackground(Color.white); add(cbs3); 	cbb3=new Checkbox("3",false); cbb3.setBounds(680,560,30,15); cbb3.setBackground(Color.white); add(cbb3);
		cbs4=new Checkbox("4",false); cbs4.setBounds(630,580,30,15); cbs4.setBackground(Color.white); add(cbs4);		cbb4=new Checkbox("4",false); cbb4.setBounds(680,580,30,15); cbb4.setBackground(Color.white); add(cbb4);
		cbs5=new Checkbox("5",false); cbs5.setBounds(630,600,30,15); cbs5.setBackground(Color.white); add(cbs5);		cbb5=new Checkbox("5",false); cbb5.setBounds(680,600,30,15); cbb5.setBackground(Color.white); add(cbb5);
		cbs6=new Checkbox("6",false); cbs6.setBounds(630,620,30,15); cbs6.setBackground(Color.white); add(cbs6);		cbb6=new Checkbox("6",false); cbb6.setBounds(680,620,30,15); cbb6.setBackground(Color.white); add(cbb6);
		cbs0.addMouseListener(this); cbb0.addMouseListener(this); cbs6.addMouseListener(this); cbb6.addMouseListener(this);
//		try { File PattFile= new File("c:/progeigene/JCreator/MyProjects/stories/hexLife/SavedPattern"+i+".txt"); PattFile.createNewFile();	}catch(FileNotFoundException fnofex) {}catch(IOException joex) {}	//   +i.toString()   .. ?
//		try { PattFile.createNewFile(); }catch(FileNotFoundException fnofex) {}catch(IOException joex) {}
		rndPatt10=new Button("rnd 10"); rndPatt10.setBounds(700,210,50,20); rndPatt10.setBackground(Color.lightGray); rndPatt10.addActionListener(this); rndPatt10.addMouseListener(this); add(rndPatt10);
		rndPatt20=new Button("rnd 20"); rndPatt20.setBounds(700,230,50,20); rndPatt20.setBackground(Color.lightGray); rndPatt20.addActionListener(this); rndPatt20.addMouseListener(this); add(rndPatt20);
		rndPattL=new Button("rnd |"); rndPattL.setBounds(700,250,50,20); rndPattL.setBackground(Color.lightGray); rndPattL.addActionListener(this); rndPattL.addMouseListener(this); add(rndPattL);
//		alabel= new Label("rnd O");
		rndPatt_o=new Button("rnd O"); rndPatt_o.setBounds(700,290,50,20); rndPatt_o.setBackground(Color.lightGray); rndPatt_o.addActionListener(this); rndPatt_o.addMouseListener(this); add(rndPatt_o);
		tf2=new TextField(); tf2.setBounds(735,310,30,20); tf2.setBackground(new Color(238,220,166)); tf2.addActionListener(this); tf2.addMouseListener(this); add(tf2); tf2.setText("25");
		tf3=new TextField(); tf3.setBounds(40,670,300,20); tf3.setBackground(Color.cyan); tf3.addActionListener(this); tf3.addMouseListener(this); add(tf3); tf3.setText("[user input]"/*"enter filename here before saving or loading patterns"*/);
		PattSaveMem1=new Button("SM1"); PattSaveMem1.setBounds(635,230,30,20); PattSaveMem1.setBackground(Color.lightGray); PattSaveMem1.addActionListener(this); PattSaveMem1.addMouseListener(this); add(PattSaveMem1);
		PattLoadMem1=new Button("LM1"); PattLoadMem1.setBounds(635,250,30,20); PattLoadMem1.setBackground(Color.lightGray); PattLoadMem1.addActionListener(this); PattLoadMem1.addMouseListener(this); add(PattLoadMem1);
		PattSaveMem2=new Button("SM2"); PattSaveMem2.setBounds(665,230,30,20); PattSaveMem2.setBackground(Color.lightGray); PattSaveMem2.addActionListener(this); PattSaveMem2.addMouseListener(this); add(PattSaveMem2);
		PattLoadMem2=new Button("LM2"); PattLoadMem2.setBounds(665,250,30,20); PattLoadMem2.setBackground(Color.lightGray); PattLoadMem2.addActionListener(this); PattLoadMem2.addMouseListener(this); add(PattLoadMem2);
		rndPixAmount= new Scrollbar(Scrollbar.VERTICAL,5,40,0,190); rndPixAmount.setBounds(750,210,15,100); rndPixAmount.setValue(10); rndPixAmount.setBackground(new Color(238,220,166)); rndPixAmount.setForeground(Color.lightGray); rndPixAmount.addAdjustmentListener(this);/**/ rndPixAmount.addMouseListener(this); add(rndPixAmount);
		rndRadius= new Scrollbar(Scrollbar.VERTICAL,5,40,0,190); rndRadius.setBounds(765,210,15,100); rndRadius.setValue(10); rndRadius.setBackground(new Color(176,247,172)); rndRadius.setForeground(Color.lightGray); rndRadius.addAdjustmentListener(this);/**/ rndRadius.addMouseListener(this); add(rndRadius);
		tf4=new TextField(); tf4.setBounds(765,190,30,20); tf4.setBackground(new Color(176,247,172)); tf4.addActionListener(this); tf4.addMouseListener(this); add(tf4); tf4.setText("10");
		pres1=new Button("s2b23"); pres1.setBounds(725,485,65,15); pres1.setBackground(Color.lightGray); pres1.addActionListener(this); pres1.addMouseListener(this); add(pres1);   pres2=new Button("s235b34"); pres2.setBounds(725,500,65,15); pres2.setBackground(Color.lightGray); pres2.addActionListener(this); pres2.addMouseListener(this); add(pres2);   pres3=new Button("s3b245"); pres3.setBounds(725,515,65,15); pres3.setBackground(Color.lightGray); pres3.addActionListener(this); pres3.addMouseListener(this); add(pres3);   pres4=new Button("s0123b3"); pres4.setBounds(725,530,65,15); pres4.setBackground(Color.lightGray); pres4.addActionListener(this); pres4.addMouseListener(this); add(pres4);   pres5=new Button("s345b2"); pres5.setBounds(725,545,65,15); pres5.setBackground(Color.lightGray); pres5.addActionListener(this); pres5.addMouseListener(this); add(pres5);   pres6=new Button("s0245b345"); pres6.setBounds(725,560,65,15); pres6.setBackground(Color.lightGray); pres6.addActionListener(this); pres6.addMouseListener(this); add(pres6);   pres7=new Button("s1245b3456"); pres7.setBounds(718,575,75,15); pres7.setBackground(Color.lightGray); pres7.addActionListener(this); pres7.addMouseListener(this); add(pres7);   pres8=new Button("s-b12"); pres8.setBounds(725,590,65,15); pres8.setBackground(Color.lightGray); pres8.addActionListener(this); pres8.addMouseListener(this); add(pres8);    pres9=new Button("s345b345"); pres9.setBounds(725,605,65,15); pres9.setBackground(Color.lightGray); pres9.addActionListener(this); pres9.addMouseListener(this); add(pres9);   pres10=new Button("s2345b3456"); pres10.setBounds(718,620,76,15); pres10.setBackground(Color.lightGray); pres10.addActionListener(this); pres10.addMouseListener(this); add(pres10);
//		addAdjustmentListener(this); 238,220,166  176,247,172
pcfro=new Button("±"); pcfro.setBounds(660,390,15,15); pcfro.addActionListener(this); pcfro.addMouseListener(this); pcfro.setForeground(Color.white); add(pcfro); cfroul=new Button(""); cfroul.setBounds(630,360,25,25); cfroul.addActionListener(this); cfroul.addMouseListener(this); cfroul.setBackground(Color.lightGray); cfroul.setForeground(Color.lightGray); add(cfroul); cfrou=new Button(""); cfrou.setBounds(655,360,25,25); cfrou.addActionListener(this); cfrou.addMouseListener(this); cfrou.setBackground(Color.lightGray); cfrou.setForeground(Color.lightGray); add(cfrou);   cfrour=new Button(""); cfrour.setBounds(680,360,25,25); cfrour.addActionListener(this); cfrour.addMouseListener(this); cfrour.setBackground(Color.lightGray); cfrour.setForeground(Color.lightGray); add(cfrour);   cfrol=new Button(""); cfrol.setBounds(630,385,25,25); cfrol.addActionListener(this); cfrol.addMouseListener(this); cfrol.setBackground(Color.lightGray); cfrol.setForeground(Color.lightGray); add(cfrol);   cfror=new Button(""); cfror.setBounds(680,385,25,25); cfror.addActionListener(this); cfror.addMouseListener(this); cfror.setBackground(Color.lightGray); cfror.setForeground(Color.lightGray); add(cfror);   cfrodl=new Button(""); cfrodl.setBounds(630,410,25,25); cfrodl.addActionListener(this); cfrodl.addMouseListener(this); cfrodl.setBackground(Color.lightGray); cfrodl.setForeground(Color.lightGray); add(cfrodl);   cfrod=new Button(""); cfrod.setBounds(655,410,25,25); cfrod.addActionListener(this); cfrod.addMouseListener(this); cfrod.setBackground(Color.lightGray); cfrod.setForeground(Color.lightGray); add(cfrod);   cfrodr=new Button(""); cfrodr.setBounds(680,410,25,25); cfrodr.addActionListener(this); cfrodr.addMouseListener(this); cfrodr.setBackground(Color.lightGray); cfrodr.setForeground(Color.lightGray); add(cfrodr);  
pcto=new Button("±"); pcto.setBounds(747,391,11,13); pcto.addActionListener(this); pcto.addMouseListener(this); pcto.setForeground(Color.white); add(pcto); ctoul=new Button(""); ctoul.setBounds(715,360,25,25); ctoul.addActionListener(this); ctoul.addMouseListener(this); ctoul.setBackground(Color.lightGray); ctoul.setForeground(Color.lightGray); add(ctoul); ctou=new Button(""); ctou.setBounds(740,360,25,25); ctou.addActionListener(this); ctou.addMouseListener(this); ctou.setBackground(Color.lightGray); ctou.setForeground(Color.lightGray); add(ctou);   ctour=new Button(""); ctour.setBounds(765,360,25,25); ctour.addActionListener(this); ctour.addMouseListener(this); ctour.setBackground(Color.lightGray); ctour.setForeground(Color.lightGray); add(ctour);   ctol=new Button(""); ctol.setBounds(715,385,25,25); ctol.addActionListener(this); ctol.addMouseListener(this); ctol.setBackground(Color.lightGray); ctol.setForeground(Color.lightGray); add(ctol);   ctor=new Button(""); ctor.setBounds(765,385,25,25); ctor.addActionListener(this); ctor.addMouseListener(this); ctor.setBackground(Color.lightGray); ctor.setForeground(Color.lightGray); add(ctor);   ctodl=new Button(""); ctodl.setBounds(715,410,25,25); ctodl.addActionListener(this); ctodl.addMouseListener(this); ctodl.setBackground(Color.lightGray); ctodl.setForeground(Color.lightGray); add(ctodl);   ctod=new Button(""); ctod.setBounds(740,410,25,25); ctod.addActionListener(this); ctod.addMouseListener(this); ctod.setBackground(Color.lightGray); ctod.setForeground(Color.lightGray); add(ctod);   ctodr=new Button(""); ctodr.setBounds(765,410,25,25); ctodr.addActionListener(this); ctodr.addMouseListener(this); ctodr.setBackground(Color.lightGray); ctodr.setForeground(Color.lightGray); add(ctodr);  
clearcenteronly=new Button(""); clearcenteronly.setBounds(740,385,25,25); clearcenteronly.addActionListener(this); clearcenteronly.addMouseListener(this); clearcenteronly.setBackground(Color.orange); add(clearcenteronly);
 	}	/* END .. HexLife1stUpload */							/**/ /*	  */	/**/ /**/		/**/ /**/		/**/	 /**/
	
	public static void main(String args[]) 	throws FileNotFoundException, IOException, EOFException /**/ {
		System.out.println("Starting HexLife1stUpload...");
		HexLife1stUpload mainFrame = new HexLife1stUpload();
		mainFrame.setSize(800, 740);
		mainFrame.setTitle("HexLife1stUpload");
		mainFrame.setVisible(true);
		
		new Thread(mainFrame).start();
	}
}

/* *** *** *** Versions-übergreifend ..
 *
 *		(o	Problem x zu y+1 (-1) .. Versatz .. taucht immer wieder auf, um unter zoom oder random jedes zweite Pixel richtig zu treffen .. !?
 *				Es muß eine *.bmp her mit exakter liob Ecke des hexGrid[][] bei x= und y=,
 *				wo erstmals beim malen mit Maus dem hexGrid[][] Werte An/Aus, =1, =0 zugewiesen werden, dann jeweils x2 für 6-Eck-Gitter ..
 *			Problem tauchte unüberwindlich auf bei randomPattern (und bei load?) )
 *			.. soweit entschärft:  Es durfte nicht mit   zoom*(n-(301-300/zoom))   zoom*(m-(302-300/zoom))   gemalt werden !   (nach algo-Block)
 *		o	
 *		o	..
 *
 * ******************* HexLife07 * RuleEdit							[alles aufsteigend, nur ohne Leerzeile oder mit  '' | ''  absteigend]
 *
 * *** 07aRuleEdit ff
 *									.. NACH Zwischenversionen 07a1Zoom und 07a2PattSav
 *														// gridnew könnte dringend optimiert werden -> nicht komplett gridnew,
 *																sondern, wo nötig nach zB clear
 *														// save-load-path ggf mit neuem button
 *														// mehrmaliges save-load-Problem debuggen lösen
 *																oder clear Rect und drawString MiTTig ''plz wait!''
 *
 *	o	mediatracker hinzugefügt. (sonst löscht togtipbool off neuerdings ganzes Carré Oo.-_o ?!)
 *	o	clearcenteronly orange hinzugefügt (um paterns bei zoom 2p zur Mitte zu 'fischen' zum 'ranzoomen)
//
// ???:  refreshGraphics funktioniert bei rndL und rnd_o weder mit   refresh + try step   in actionperformed, noch in if rndbool==true,
// 	mit oder ohne gridnew, egal welcher zoom
// 	obwohl i+=1 gezählt wird ..
// mit zweimal   refresh + try step   geht's !?
//		.. aber bei Lm1+2 wird alles gelöscht ?! .. wg   cmd=''c''.   Mit zusätzlich   cmd=null;   funktioniert's aber !?   *gruselig*
 *
 * o	sinnloses zoom1 2p ganz 'rausgeschmissen .. lädt alles (rndSe, zoom2p, clearbutt, refresh) viel schneller
 *	o	catch->drawString(..) .. jetzt catch->tf1.setText(..) + sleep(500);
 *	o 'save/load with rule'   erledigt! .. einfach komplett für alle 14 Checkboxen Schreiben und Lesen ''An/Aus'' erzwungen
 *			und per   setState()   verarbeitet.
 * o pa' rule-presets gemacht. .. 'custom'  noch zurückgestellt, da auslesen wieder nicht trivial
 * o getToolkit() für jpgSe jetzt im jew case .. ( hat irgendswie Ladehemmung .. ohne avast geht's manchmal besser ?! )
 * o rndL3 und 7 sind jetzt rndL mit 'Radius' 1 bis 150.
 * o scrollbar   RndRadius   und   tf4   hinzugefügt und synchronisiert.
 * o rndPixAmount-scrollbar und tf2 jetzt für user in Prozent (nicht mehr double)
 *		.. sowie miteinander synchronisiert per 	actionPerformed() -> rndPixAmount.setValue(..)		für tf2 -> rndPixAmount
 *												bzw per     adjustmentValueChanged() -> tf2.setText(..)			für     <-
 *	o rnd-Ring hinzugefügt  rndPatt_o
 *
 *	o .. jetzt die Checkboxen abfragen und richtig in den sb-rules(ct) unterbringen ..
 *		-> trivial erledigt per     if ( .. && CheckBox.getState() )     !
 *
 *		o	mit neuem   dragbool   aus mousePressed() ( wird dort nur einmal evaluiert .. ) malt und löscht mouseDragged() jetzt vernünftig 
 *				zusammenhängend. ( hier würde bzw wird pausenlos evaluiert)
 *		o	debug1 für mouseMoved() getX,Y() und zugewiesene hexGrid[][]-Werte anzeigen wieder 'rausgeschmissen (noch drin in 07a2PattSav)
 *		bissel Kleinkram zuerst ..
 *
 * *** 07a2PattSav
 *		|
 *		Um an elementaren Beispielen schrittweise zu prüfen und nachzuvollziehen, ob der algo richtig funktioniert (zB wegen
 *		des +/-1-Versatzes der Zeilen), ist nun Speichern und Laden der patterns (Zellebene), jetzt schon höchst brauchbar,
 *		BEVOR die   checkboxen   aktiviert werden.
 *		Es sollen patterns mit ihrer aktuellen sb-rule dauerhaft als Datei gespeichert werden können.
 *			Sie sollen wahlweise mit ihrer rule ODER mit aktueller sb-rule geladen werden können.
 *		Es sollen einige patterns per schnell-speicher und -lade ( memory ) zB ~Buttons in einige default-memory-Dateien ge-
 *			-speichert und geladen werden können, um nicht immer den Pfad suchen zu müssen bzw auf windows-dialog zu verzichten.
 *			.. also ähnlich, wie 'presets' .. (kann ja erstma' auch ohne sb-rule sein), dann ..
 *			dürfte es mit einem (oder mehreren) zusätzlichen   hexMem[a][b]   dann   forfor a,b hexGrid[a][b]=hexMem[x][y]   die
 *				erst bei Bedarf ins Spiel kommen, kein Problem sein .. ( aber nur zur Laufzeit, sonst doch Dateien und io nötig )
 *		.. also erstmal in IO einsteigen ..
 *		(übrigens .. Life2.32 kann sogar Bitmaps lesen und laden .. !? - vllt wird das nochmal 'ne brauchbare Behelfslösung? )
 *		|
 *		- import java.io.*;
 *		- File PattFile= new File("SavedPattern"+i+".txt");		//   +i.toString()   .. ?
 *		- FileInputstream streamFromFileIn = new FileInputStream(PattFile);
 *		  FileOutputStream streamToFileOut = new FileOutputStream(PattFile);   .. für bytes(-arrays).
 *	  		( In-, OutputStream() liest / schreibt in einen array, nicht Datei .. FileReader()~Writer() für 'characters', chars )
 *		  Auch   RandomAccessFile;   ist möglich und schreibt UND liest und hat 'file pointer'. ( geht über DataIn-OutputStream )
 *		 dazu : ..
 *		- read(byte[] b, int off, int len); write(byte[] b, int off, int len); close();   unod sicherheitshalber auch   finalize()
 *		 sowie : ..
 *		- mark();   oder einfach   if(in.read()==511) { }   um rule von x,y-Pärchen  zu unterscheiden
 *		|
 *		?? - compiler meldet: ''FileNotFoundException must be caught or declared to be thrown'' für FileIn-OutputStream ..
 *			jew. throws deklarieren in main und HexLife07a2PattSav() compiliert dann ohne error, startet aber das Programm nicht wg 
 *			''Exception in thread main'' im Output
 *			Wenn SavedPattern"+i+".txt unter Windows erstellt wird, startet es doch.
 *			Aber das soll das Programm machen! .. aber bis   PattFile.createNewFile();   kommt es eben gar nicht erst .. ?????
 *			(immerhin wurde beim 'rumprobieren SavedPattern.txt angelegt, wenn auch leer.)
 *		|
 *		-> jetzt klappt's immerhin soweit: SavedPattern.txt wird be-schrieben, .. wieder laden klappt noch nicht: 
 *			- File, FileIn-OutputStreams,  jetzt wie Buttons, Textfield und die Listener behandelt:
 *					-> im Klassenblock {} angelegt, in Klassenmethode() initialisiert und   ''(PattFile)''   zugewiesen ....
 *					-> .. und zwar dort im try{..}catch{}catch{} - Block (der unter Klassenblock {} oder in main nicht ging ..
 *							''public'' für File und FileIn-OutputStreams wiederum wollte HexLife07a2PattSav() nicht annehmmen .. )
 *						.. sicherheitshalber mit FileNotFoundException UND IOException
 *						.. und beide von main string[] args() ge-throwed
 *					.. unter actionPerformed() wird jetzt alles erkannt.
 *		also:
 *		-> public class __Zwischenspeicherkladde 	 extends [usw] { ..  
 *		besser:   SIEHE   ''learn_FileIOStream.java''
 *		|
 *		.. load funkst noch nicht .. es wird alles gelesen .. zu sehen mit Thread.sleep() und tf1.setText: streamFromFileIn.read() 
 *		tf1 zeigt bis zu dreistellige Zahlen an.
 *			(- fehlende close() unod finalize() haben die zum Schreiben geöffnete SavedPattern.txt  nicht wieder geschlossen?
 *				nach Thread.sleep() und tf1 - check nicht möglich)
 *			- irgendwas am Lese-code .. 
 *				offenbar wird alles gelesen, aber nicht richtig ausgewertet .. ?
 *			(- der frisch und richtig gelesene hexGrid[][] wird wegen cmd=''c'' ( für clearbutton ) erstmal wieder gelöscht bei step() !?
 *				ausgeschlossen <- auch ohne clearbutton geht's nicht.)
 *			- vielleicht hält pausebutt oder ''s''-Button mitten im algo an, wo hexGrid[][] nicht nur =1 oder =0, sondern auch 10,11,30,31
 *				load malt nur die =1 ~er
 *			- wenn load funktioniert, dann immer obenlinks .. vielleicht doch Zifferweise, statt Zahlweise gelesen ?!
 *		|
 *		load per ''ls'' reagiert nur einmal. Woran liegt's ?
 *		Wie vorauszusehen, wird wohl nicht bis 600 gelesen und geschrieben. ( sondern jew. bis ca. 256 = ±128 = ±2^7 )
 *		|
 *		Lösungen müssen her für:
 *		1) Name (anders als lfd i) für ''SavedPattern'' + ? +''.txt'' um Speicher- und Lade-Datei richtig auszusuchen
 *				zB behelfsweise per try { .. tf1.getText() .. } UND sonst default="", wenn beliebig ?
 *		//	2) anders als byte (zu klein für 600x600)
 *				DataIn-OutputStream ? oder doch chars per FileReader-Writer und byte (int?) to char und zurück ?
 *				Es sollte auch gelingen, nur die wirklich für hexGrid benutztn Pixel zu speichern .. und nur jedes 2-te x,y=1<600 umzurech-
 *					-nen. Nachteil hier ist der Versatz bei y .. und 256 sind immer noch zuwenig für 600/2=300 benötigte.
 *		//	3) richtig laden ( nicht alles oben links .. Warum? )
 *				erledigt sich vllt von alleine mit anders als byte per FileIn-OutputStream
 *		// .. 2) und 3) erledigt .. s. unten   *** 07a3PattSavRandomAccessFile
 *		4) laden UND darstellen ohne 1x step()
 *				vllt ganz einfach per neues bool für step() ohne algo-Block ?
 *		5) richtig speichern ohne Pause  .. ist dann hexGrid[][]=10,11,30,31 auch ?
 *				-> PRÜFEN ! .. per *.write(hexGrid[][]) oder besser drawString(..,50,720)
 *				.. oder von vornherein ausschließen per pausebool=true; runbool=false; -> speichern, dann direkt wieder zurück true<->false ?
 *				.. ferner:  Wie und Wann funktioniert nochmal   ''return; ''   .. zum hin- und herspringen zw step() und actionPerformed()
 *		6)																																								geeignet ?
 *
	 *	*** 07a3PattSavRandomAccessFile
	 *		( .. wie der Name schon sagt ..   writeInt()   und   readInt()   klang doch zu verführerisch )
	 *		.. Zwischenversion in 07a2PattSav übernommen
	 *
	 *		o	einwandfrei!! .. lädt jetzt richtig mit writeInt() und readInt()  ( schreibt und liest immer vier bytes )
	 *			YIPPIE !
	 *							.. damit haben sich obige 2) und 3) erledigt.
	 *
	 *		o tf2 und rnd-malen hinzugefügt. .. (funktioniert zoom 6 nicht richtig wg mod-gerade-ungerade Zeilen per %4, %2 usw.)
	 *
 *	*** .. wieder *** 07a2PattSav
 *
 *	.. weiter mit 07aRuleEdit ..
 *
/ / / / / / / /   ES DARF NICHT MIT     zoom*(n-(301-300/zoom))     zoom*(m-(302-300/zoom))     GEMALT WERDEN !!   (nach algo-Block)
 *			( .. urspr. wg ArrIndexOutBound ? oder um nicht in den Rand 'reinzumalen ? .. )
 *
 *		o noch SavedPattern+tf3.getText()+.txt hinzugefügt ( in actionPerf(), cmd=''s'' )
 *		o .. ganzen FileIn-OutputStream-Kram 'rausgeschmissen (in learn_FileIOStreams.java festgehalten .. gut für bis zu 256 bytes)
 *
 *		- noch die Schönheitsfehler hinkriegen:
 *			- notdürftiger programflow (noch ohne Auslagern in methoden) run-pause bei scr unod rnd unod gridnew unod zoombuttSe..
 *				je nach Click-Reihenfolge reagiert   '' > ''   nicht mehr )
 *			  .. dazu die ganzen boolSe nachverfolgen, nachvollziehen, durchdenken .. :o(
 *			- Lösung für   ''SavedPattern*.* ''   zB per   tf2.getText()   sonst   default ''i''   .. ?
 *		[erl.] - ungewollter Versatz bei mousePressed(), mouseDragged() ->   '' hexGrid[][]= ''   .. malt richtig, iteriert aber versetzt ?!
 *		
 *	*** 07a1Zoom	-	eigene Zwischenversion, da viele Änderungen in __Zwischenspeicherkladde ..
 *
 *		- rb und pb heißen jetzt runbool und pausebool
 *		- grid neu malen pausiert nicht mehr i
 *		- e.getX() in mouseDragged() und ~Pressed() war doch noch umständlicher (als einfach ''/zoom'')
 *				x'= muss äquivalent umgeformt werden zu x= .. also erstmals Gemaltes zurückgelesen werden zur algo-Rechenebene.
 *				dabei sowohl richtig gemalt, als auch hexGrid[][]= -Werte exakt vergeben werden  (s. Bem. dort)
 *
 *		.. auf Rechenebene, wo hexGrid[][] gescannt und iteriert wird, .. HAT zoom NIX ZU SUCHEN !!
 *			also im survive/birth-algo-Block schonmal gar nicht ..
 *			.. aber das genügt nicht, denn beim malen mit Maus sind beide beteiligt   zoom UND hexGrid[][] wird editiert .. !??
 *				alle Zellen auch außerhalb zoom-area müssen 1,0 richtig zugewiesen bekommen
 *				Zellen dargestellt werden hingegen nur im Zoombereich.
 *		-> forfor und if dementsprechend geschachtelt in ''alle Teile malen'', ''mouseDragged()'' und ''mousePressed()''
 *		..   zoom   , statt   "2"   bei mouseDragged(), Zeile   getX(), getY()   hat auch gefehlt ..
 *
 *			-   sinngem.:	draw und fill   2*x,2*y   jetzt   zoom*x,zoom*y
 *			-				   0 noch API, javabuch, konsultieren
 *		
 *	- zwischendurch kleinere version mit fillRect(x,y,2,2) *********** HexLife06bSmall4x4
 *		noch ohne initialPattern() und Pattern-IO to File
 *		/3 = /2  ..  3* = 2*  ..  fillOval = fillRect  ..  drawOval = drawRect (lightGray)  ..  6,6 = 4,4  ..
 *		.. array größer [310][310]  ..  <200 = <300 bzw <=200 = <=300  ..  
 *
 *	- nun arrayoutbound-problem notdürftig gelöst mit j=5; k=6;
 *
 *	- if(rb==true) {} !! .. nicht rb=true ??! (Und Button Label muß ">" sein, wenn prog jetzt mit paused startet)
 *		mit if rb==true wird aber nun if cmd=="#" nicht mehr erreicht .. ?!  --> irgendwie umstellen!
 *		default jetzt rb=true, erst nach Grid Malen false (+ setText + return).
 *	- copypaste-Funktionalität (um Patterns nicht immer neu malen zu müssen) läßt sich auch verwirklichen, indem
 *		vor dem Startbutton-Klick (nach dem Mausmalen) alle An-Zellen (also hexGrid[][] ) in einem zB
 *		initialPattern[][] gespeichert werden, der dann mit einem neuen zB Button initialPattbutt ('skip back'
 *		also) das Iterieren pausiert, alles cleart,dann initialPattern[][] malt. Optimalerweise noch loadsave to
 *		file. (dann erübrigt sich kompliziertes copypasten vorerst .. zum Editieren später doch)
 *
 *	- ersma' um den translate-kram kümmern - genauer:
 *		maus klickt und malt richtig, algo malt richtig, aber ..
 *		wenn #-gridbutton-Klick, malt prog die An-Zellen +20, +40 (21,42?) versetzt ..
 *		.. und prog malt zum Grid versetzt (wohl ab (0,0) liob Fenster) - also mausmalen und algomalen sind zum 
 *		(erst~) Grid versetzt, .. und dann noch das gridbutton-Grid (zusätzlich?).
 *		Wie funktioniert dieser Fehler?
 *		-->
 *	!! Ohne translate und überall malen mit +20, +40 klappt's jetzt !! .. (s.a. debug-translate.java).
 *		Per gridbutton Grid neu malen überlagert jetzt richtig. Aber per clearbutton noch 1 Pixel Versatz.
 *		
 *
 *	******************* HexL05AlgoSteht		..	Yippie !  :o)
 *
 *	- ersma' als HexLife05AlgoSteht speichern weiter HexLife06
 *	- ärgerlich immer noch:
 *		o	translate-kram
 *			bzw pause-run-Koordination bei "s, #, c", dann ">, ||"-Klick? liegt's daran?
 *			unod #-Grid malt ein (oder 21,42?) Pixel versetzt
 *			(ein Problem oder drei Probleme?)
 *		o	arrayindexoutbound  (=Rand vom hexGrid handeln)
 *	- dringend benötigte features:
 *		o	edit, insbes. c&p-funktionen;
 *		o	randomfill;
 *		o	checkbuttons für rules;
 *		o	save-load from file, für Testpattern;
 *		o	zoom .. (=größeres Universum, leichteres Editieren in groß)
 *	- steptakt "0-500" Buttons und Methode - für Thread.sleep(steptakt(stim)) - hinzugefügt.
 *	- ?! ct=0 ! (nicht=1), wenn survive geprüft wird! .. (alle survive-in hexrules'08.ewr falsch gewesen!)
 *	- feature: grid 60° rotieren wär' gut.
 *	- merkenswert: ganze code-Stücke wie in Variable verpacken, wie in birthrule(int ct).
 *
 *			***   Nachbarn scannen   ***
 *			der Reihe nach von ab liob (zeilenweise im Springersprung) werden AN-Zellen 'behandelt':
 *			o	erst werden alle angrenzenden AUS-Zellen auf ihre Nachbarn und birth geprüft.
 *					Dabei erhalten sie einen zwischenzeitlichen Wert für ''birth oder nicht'', der
 *					nach dem Malen und vor Stepende wieder 'Übersetzt werden muß, um am Ende wieder
 *					nur an- und aus-Zellen zu haben.
 *			o	erst jetzt wird die an-Zelle auf ihre Nachbarn und survive geprüft (und erhält entspr.
 *					einen Zwischenwert).
 *			o?	.. möglicherweise ist es optimaler, einen extra Prüf-array einzurichten, in den das
 *					Prüfergebnis birth death survive aufgenommen wird, der dann nur noch gemalt wer-
 *					-den muß, statt mit Zwischenwerten, was eine Umbenennungs-Schleife erfordert ?
 *			[ Reichlich Optimierung ist möglich, da eine Leerzelle oft an mehrere An-Zellen grenzt
 *			und schon fertig gescannt ist, bevor sie 'drankommt' und gar nicht mehr gescannt werden muß.
 *			Auch ist eine An-Zelle, die ihre Nachbarn findet, für letztere selbst Nachbar. (Es ist
 *			aber wohl aufwendiger, diese Ersparnis aus dem systematischen scan (zB im Uhrzeigersinn)
 *			auszunehmen, damit sie sich auch auswirkt (Zeilen einer switch-Schleife überspringen 
 *			oder einen extra Nachbar-array für jede An-Zelle (??) einrichten zu müssen?)
 *			Programm läuft aber eh' so schnell, daß sogar Thread.sleep(#) nötig is'.]
 *
 *
					[j-2][k-4]		[j][k-4]		[j+2][k-4]

			[j-3][k-2]		[j-1][k-2]		[j+1][k-2]		[j+3][k-2]

	[j-4][k]		[j-2][k]		[j][k]			[j+2][k]		[j+4][k]

			[j-3][k+2]		[j-1][k+2]		[j+1][k+2]		[j+3][k+2]

					[j-2][k+4]		[j][k+4]		[j+2][k+4]				
 *	- ..
 *	- 
 *	- translate:
 *		funkst nur scheinbar .. programm malt über das grid hinaus bis in liob Ecke und unten zu 'kurz'.
 *		korrigier' ich's, kann die maus nich' mehr stimmen .. ?!
 *		Aber den Nachbaralgo kann ich ja schomma machen ..
 *	- in den schnell-langsam-Wechsel sind alle Buttons involviert:
 *		zunächst läuft es schnell, gridbuttonmacht's langsam, dann play oder snapshot-Buttons wieder schnell o.s.ä.
 *
 *	Bestandsaufnahme ..
 *	[HexL04BereitFuerRulesAlgo; HexL04Diffus; HexLife (im eigenen projekt neben bzw drüber)]
 *	- HexLife.java, ein projekt drüber war wohl der accu?
 *		aber es verhält sich anders als HexL04BereitFuerRulesAlgo und auch HexL04Diffus, ..
 *		zu letzterer unterscheidet sich HexLife nur ca. Zeile 46 (forfor n,m-Schleife; -21, -42, statt -1,-2).
 *		Is'vielleicht neu gespeichert, aber noch nich' compiliert?
 *	- das translate-chaos muß weg! .. ggf ganz verzichten?										_[			gemalt)
 *		(oder: in ''bereitfürrules'' wird wohl nochmal transliert, wenn gridbutton geklickt wird, dadurch doppelt
 *	- immer noch arrayindexoutbound exceptions.
 *	- eine version läuft langsam, andere schnell; 'mal ändert gridbutton das tempo hin zu 'höllisch'; auch
 *		snapshot;  .. ?
 *	- HexL04BereitFuerRulesAlgo und HexL04Diffus unterscheiden sich nur durch screenshot und algo in forfor-
 *		n,m-Schleife (''BereitFuerusw'' hat nur eine rudimentäre probierzeile drin).
 *		HexL04Diffus scheint demnach die jüngste und beste version zu sein (nicht eine Abwandlung).
 *		.. und HexLife demnach der Ober-speicher-accu.
 *	- HexL04Diffus war offenbar noch nich' compiliert .. läuft jetzt auch zT. (s.o.) schnell bzw so, wie auch HexLife.
 *	
 *	[drüber: 23,01,08]
 *
 *	[älterer, vorgefundener Kommentar]
 *	jetzt alle freien nachbarn scannen (nachbarsnachbarn zählen für birth); alle Nachbarn zählen für survive ..	
 *	
 *  ******************** HexLife04Diffus
 *	
 *	- .. was kann alles 'draus werden ?
 *	- Zufallsweg-algo, 'Schmetterlingsweg'
 *
 *	******************** HexL04BereitFuerRulesAlgo
 *
 *	- pauserunbutton hinzugefügt
 *	- if (robo.getPixelColor(42+3*x  ,52+3*y)==Color.black) {}   um pixelfarbe vom screen zu lesen verworfen, dafür wieder ..
 *	- mit array alle pixel im hexGrid erfaßbar, scanbar, prüfbar und malbar gemacht. pixel löschen is' dann trivial
 *	.. sg.translate(..) wird später anscheinend von mg bzw getGraphics miterfaßt
 *	.. ohne rb und pb wirkt "#", gridbutton, wie ein pausebutton, weil cmd!=">" ..
 *	! Achtung ! .. in zB forfor-n,m-Schleife ist translate(20,40) nicht berücksichtigt -> beim malen wieder abziehen (-21,-42).
 *		auf e.getX() bzw Y wirkt's offenbar mit.
 *	- einfacher algo (testweise) verwirklicht.
 *
 *	.. alles bißken zusammengeschustert und 'rumprobiert .. warum funktioniert m%2 nicht? ..
 *	.. Lösung mit pb und rb noch nich' optimal: während run gridbutton klicken, läßt cmd="#" nicht nur für einen step() das Grid auffrischen
 *	.. translate, e.getX/3, .. (was noch?) verlangt alles in allem malen x: -1, y: -2 .. warum genau bleibt schleierhaft ..
 *	.. die unterschiedliche Behandlung der Exceptions is' noch unklar (warum awex, und nich' sex schon bei step() .. warum sex, und nich'
 *		awex erst bei robo.createScreenCapture() ? ) .. aber es funktioniert ja und die HexLife-Routine kann beginnen!
 *
 *	- screenshotbutton + boolean shot hinzugefügt .. sonst "relaxed" immer true (nach einmal released) und programm viel langsamer! (speichert ständig screenCaptures)
 *	.. translate stimmt immer noch nich' ganz .. pixel malebene ist um translate verschoben und liefert ArrayIndexOutOfBounds, wenn pixel über'n Rand weglaufen ..
 *		wenn statt - in der forfor-n,m-routine - bei -21,-42, bei -1, -2 gemalt werden lasse, bleiben die (zufallswege der) pixel richtig am rand des Grid stehen,
 *		aber bei den mausgesetzten pixeln wird translate(20,40) durchgeführt .. ?! .. vielleicht wirkt translate auf   e.getX() bzw Y   doch nicht .. ? .. würde
 *		heißen: mausgesetzte pixel sind (beim malen doch) nicht transliert ..
 *	.. möglicher Fehler:   translate()   wirkt - natürlich - in step(), aber nicht in mousePressed() oder mouseDragged .. -> dort auch mg.translate machen? oder
 *		entsprechend draw-coords korrigieren (mit -21, -42) .. ?
 *		.. dort auch   translate(20,40)   führt dazu, daß mouse-eingegebene pixel +20,+40 von der maus weg gemalt werden .. ?! .. ??
 *		also mousePressed() und mouseDragged() malt an der richtigen Stelle (translate(+20,+40) ..
 *			forfor-n,m rechnet und malt ebenfalls vom mausgesetzten pixel aus richtig weiter, .. nur ist dabei der 'gültigkeitsbereich' (?) der malebene um (-20,-40)
 *			verschoben ?! .. wie kann das sein? .. 
 *		
 *
 *	******************** HexL03WoW .. RoboKram & ImageIO.write(..)
 *
 *	.. ein screenshot vom Fenster soll gemacht werden, dann als Bild zB *.jpg oder *.bmp auf Festplatte abgespeichert werden
 *
 *	der Robot macht einen screenshot als BufferedImage, das für javax.imageio.ImageIO.write(RenderedImage,string Bildformat,File)  
 *	als RenderedImage gilt!
//?	 *	der Robot macht einen screenshot als BufferedImage, das wiederum ein WritableRaster kopieren kann, ..
//?	 *	von javax.imageio.ImageIO.write(RenderedImage,string Bildformat,File)     wird RenderedImage gebraucht  ..?
//?	 *	außerdem gibt's noch WritableRaster, WritableRenderedImage möglicherweise werden noch ImageReader und ImageWriter für ImageIO benötigt
 *
 *	- der Robot muß richtig .. äh .. 'eingerichtet' werden: (im class-Kopf als variable einrichtet klappt nich' .. )
 *		java.awt.Robot.createScreenCapture(Rectangle)     wirft IllegalArgumentException (aber nur, wenn Rect.width() oder Rect.height()==0 )
 *		.. wirft SecurityException, wenn Konflikt mit Windows, .. errormeldung beim kompilieren verlangt aber nach catch or throw
 *		AWTException!?
 *		.. also irgendwie, bevor er überhaupt eingerichtet ist, muß AWTException schon zum Abgefangen werden bereit sein .. ?1
 *		Robot robo=new Robot();     also erst in Methode instanzieren & initialisieren, die AWTException catcht oder throwt
 *		aktuell: step() throws   und run() while[..] {    mit   try { step(getGraphics()); }catch[..usw]
 *	- man hat damit schonmal ein BufferedImage .. und das ist ein RenderedImage! .. jedenfalls funktioniert
 *		ImageIO.write(BufferedImage,string [Bildformat], File);
 *		.. wohl, weil BufferedImage interface RenderedImage implementiert
 *
 *	******************* HexL02MausMalen
 *
 *	- ClickMe Applet (allJava CD) link: e'exShred'Javatool' code zBs [usw]. html
 *		bißchen umständlich mit "Spot"-kram .. MouseListener-Sachen dafür übersichtl.
 *
 *	******************* WSP - candy / HexL01SpringerGitterBunt
 *
 *	- siehe ../stories/hexneighbours.bmp & hexneighbour's neighbours.bmp
 *		wg Springer-Gitter per Modulo-Bedingungen
 */