amoeba_1



direct download: (603 KB, march 2011) amoeba.zip ( 45     downloads yet) ,
uncompressed zipped folder ''amoeba.zip'' containing executable jar:
''Amoeba05GUI.jar''
to doubleclick to run program
on any operating system, that has java jre,
java sdk or virtual machine preferably 1.4.0_03 installed - which version this program was compiled with..



    here's some hints on using moeba ..
o first of all .. PLEASE, do'nt click too fast while running! .. Moeba will eventually
         hang if size changed while running. Use Pause '' || '' , rather!
         It does no prob bear changing the rules while running, though.
         Resetting (and autogrow new Moeba with given size) with clearbutton while
         running usually np too.
o put speed-ruler allto left for ' unleashed '.
o You can grow Moebas bigger than (numpix-ruler max=) 1000, by editing textfield
         to e.g. 5000 then hit '' Enter ''.
o rules behave differently for different Moeba-shapes .. so a frozen Moeba might
         be reanimated while running (frozen) with changing a rule.
BUGS:
• when frozen several times and reanimated, prog will hang! .. alas!
(like when switching d12 one or both off in spread scattered multi-moeba and b!123)
• on Win XP with jre 7 (java runtime environment) moeba will partly start or hop to upper left corner (instead center)

I will be working these out whenever I find time again ..
    how it works ..
The neighbourhood is absolutely same as Conway's GameOfLife. But, only one cell is evaluated per step (not all cells resp. to GOL). Moeba's chosen grown size stays the same (unless changed manually). After grown it runs like this: One random cell meeting deathrule dies. (algo scans cells randomly, until one found meeting deathrule) According to birthrule a random cell is born somewhere at Moeba's border, where birthrule is met. Is a rule not met by any cell, Moeba will freeze. There's coherent Moebas, bloblike ones, perforated (d7 andor d8) or spread scattered 'multi'-moebas, with limbs snakelike or frizzling out of Moeba's corpus, .. well .. what I'm telling You as there's screen- shots below ..
    Some interesting aspects and questions arise:
o scattered Moebas must (unless exceptional b0 like in GOL too) cannot spread uncontrolled
         cos' they will tend to grow towards where most of its scattered body accumulates.
         That makes it have sort'a far-coherence, even though obviously scattered.
         I rarely observed sort'a 'escapers' from allbeit rather compact body Moebas.
         These scattered Moebas appear more like ants rather then 'coherent' (even though they are).
o Which rule (at what size) makes biggest this far-range-coherence?
o A spread Moeba with an usually compact rule (if started from compact Moeba), .. will it find
         to become compact? depending on size? .. or will it freeze?
         d<8 b167 is such an example .. it sort'a 'has a rectangular attractor' it will soon take in after
         started from compact shape .. but changed to this rule from a scattered Moeba will (depending
         on size?) take ages - if ever? - to find back to this rectangular attractor .. !?
o How do Moeba rules compare to random?
         seen e.g. the chaotic (?) butterfly's random way, compared to a small Moeba? (or big one even)
         Does coherency in sense of this algo make it 'slower' as single random-cell, under aspect of
         'moving away'?
o .. ?
    the nature aspect ..
.. seen single Moeba as element of a bigger system with like food or walls, or a system of many Moebas [this feature planned!] working together or against one another or assimilating one another to grow or working independent from one another for food and life-energy, .. Moeba and its rules could be helpful for .. lemme think .. enquiries? science? .. the ''growing and spreading of lichens''? .. ;o)] .. ''populations spreading andor moving''? .. intelligent fluids, mildew, virusses, ebola, hanta, dengue, lhassa, blobs ta- king over human civilization?? .. or serious: behavior, growing and spreading of bacteria in human meta- bolism, of cancer, metastasis? amoeba combines systematic building structures, spreading, (by having to meet rules) as well as random element by the algo working on single random cells only .. does'nt that remind of 'mechanisms of evolu- tion'? .. while sciences by their nature tend to query ongoings systematically and and on their systematic properties .. seen like that, I think amoeba contributes to understanding chaos, disorder <-> order aspect if studied intensely .. ;o)) In that sense, I wish You fun and incitement, exploring the hidden laws and behavior of all possible Moebas!
Even, if YOU do'nt ..

a) send me gorgeous rules for Moeba
b) send even any feedback
c) feel like participating in next upload with a lot of features to come, by
telling me that with a small symbolic amount by PayPal to


christof.held@t-online.de

.. I will work on major features as ..
o	custom colors and switching trace on/off
o	many more rule-presets, maybe edit user presets
o	implying food and a smell algo for Moeba, .. growing by eating too, of course
o	running several Moebas interacting whatever way
o	getting that stupid frame.getWidth() fixed for decent resizing of window
o	make Moeba have a torus and follow-mode
o	a hexagonal implementation


and here's your src-code for this 'ad hoc' - upload:

/* @(#) Amoebe05GUI (aus Amoebe04.java) 1.4.0_03b /01/14 */
package myprojects.Amoebe05GUI;

import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class Amoebe05GUI extends Frame 
						implements Runnable, MouseListener, ActionListener, AdjustmentListener/*, ImageObserver */	{
	
	/* neu oder c&p aus HexLife1stUpload */
	int growcount=0; 			int j=0; 				int numpix=150;		
	TextField tf1;				TextField tf2;  								
	Graphics gg; /* 'grow-' */	Graphics rg; /* run- */		Graphics mg; /* 'mouse-' */	Graphics aeg; /* action-event-graphics */
	Button pauserunbutton; 	String cmd=">"; 		boolean pausebool=true; 		boolean runbool=false;
	Checkbox cbd0; Checkbox cbd1; Checkbox cbd2; Checkbox cbd3; Checkbox cbd4; Checkbox cbd5; Checkbox cbd6; Checkbox cbd7; Checkbox cbd8;   /* CheckBoxes death */
	Checkbox cbb0; Checkbox cbb1; Checkbox cbb2; Checkbox cbb3; Checkbox cbb4; Checkbox cbb5; Checkbox cbb6; Checkbox cbb7; Checkbox cbb8;  /* CheckBoxes birth */
	Button pres1; Button pres2; Button pres3; Button pres4; Button pres5; Button pres6; Button pres7; Button pres8; Button pres9; Button pres10; 
	Button clearbutton;		int num_Mem;			boolean growbool=true;
	Scrollbar sb_numpix;	TextField tf_numpix; Integer tf_numpixStringToInteger=new Integer(0);
	Scrollbar sb_speed; int speed;
//	Rectangle framRect; /*Frame mainFrame;*/ static Rectangle rect;
	
	/* übernommen aus amoebe04 */
	Math m=null;		int x=0;				int y=0;
/*numpix*/		public int[][] arr=new int[numpix+9][2];				/*arr[0][0]=350;					arr[0][1]=350;*/
	int ci=0; 			int cj=0; 			int ck=0;			boolean done=false;			boolean donek=false;
	int numneighgrow=0;			int numneighdie=0;			int numneighbirth=0;
	boolean case1=false; boolean case2=false; boolean case3=false; boolean case4=false; boolean case5=false; boolean case6=false; boolean case7=false; boolean case8=false;
	boolean casek1=false; boolean casek2=false; boolean casek3=false; boolean casek4=false; boolean casek5=false; boolean casek6=false; boolean casek7=false; boolean casek8=false;
/*ALPHA*/		Color alphaclear=new Color(200,250,150,5);

	/*	schomma die rules definieren ..	*/
	public boolean deathrule(int ct) {			/*numneighdie*/
		if ( (ct==0 && cbd0.getState()==true) || (ct==1 && cbd1.getState()==true) || (ct==2 && cbd2.getState()==true) || (ct==3 && cbd3.getState()==true) || (ct==4 && cbd4.getState()==true) || (ct==5 && cbd5.getState()==true) || (ct==6 && cbd6.getState()==true) || (ct==7 && cbd7.getState()==true) || (ct==8 && cbd8.getState()==true) ) { return true; } else { return false; }
	}
	public boolean birthrule(int ct) {			/*numneighbirth*/
		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) || (ct==7 && cbb7.getState()==true) || (ct==8 && cbb8.getState()==true) ) { return true; } else { return false; }
	}
	
	public void growstep(Graphics gg) { 	/*tf2.setText("framRect.width = "+framRect.width);*/	/* "arr[0][0] = "+arr[0][0] */
		
		if(/*growcount<=numpix &&*/ growbool==true) {		++growcount;
			
			if(num_Mem!=0) {  /*gg.setColor( new Color( (int)(m.random()*255),(int)(m.random()*255),(int)(m.random()*255),(int)(m.random()*17) ) );*/ gg./*fill*/clearRect(0,0,800,700);
				/*for(int n=0; n<=num_Mem; ++n) { arr[n][0]=350; arr[n][1]=350; }*/ /**/num_Mem=0; /*arr=null;*/ arr=new int[numpix+9][2];	}
///* ?	*/		if(runbool==true) { 

	

		/*	ersma' rnd-birth-Punkt	*/
//			for(int n=0;n<=numpix;++n) {
//				arr[n][0]=300+n/((int)(m.random()*numpix)+1);	/* x */
//				arr[n][1]=300+n/((int)(m.random()*numpix)+1);	/* y */
//			}
				arr[0][0]=350;	/* x */
				arr[0][1]=350;	/* y */ 		arr[1][0]=351;	arr[1][1]=351; 	/* bleibt sonst =0 wg algo +/=/-2 */
			gg.setColor(Color.red);
			gg.drawLine(arr[0][0],arr[0][1],arr[0][0],arr[0][1]);
			gg.setColor(Color.orange);
			
		/*	.. dann ersma' wachsen lassen ..	*/
		
//		boolean done=false;
///*numpix*/for (int i=0; i<=numpix; ++i) {		/*while (runbool!=false) {*/
			numneighgrow=0;
			case1=false; case2=false; case3=false; case4=false; case5=false; case6=false; case7=false; case8=false;
			done=false;
			ci=(int)(m.random() * growcount);		/* eine beliebige, bereits gemalte Zelle arr[ci] (aus bereits generierten Zellen arr[i] ) herausgreifen, .. */
			for (int n=0; n<=growcount; ++n) {		/*while (runbool!=false) {*/
				if (arr[ci][0]+2 == arr[n][0] && arr[ci][1]+2 == arr[n][1]) { numneighgrow+=1; case1=true; }
				if (arr[ci][0]+2 == arr[n][0] && arr[ci][1]   == arr[n][1]) { numneighgrow+=1; case2=true; }
				if (arr[ci][0]+2 == arr[n][0] && arr[ci][1]-2 == arr[n][1]) { numneighgrow+=1; case3=true; }
				if (arr[ci][0]   == arr[n][0] && arr[ci][1]+2 == arr[n][1]) { numneighgrow+=1; case4=true; }
				if (arr[ci][0]   == arr[n][0] && arr[ci][1]-2 == arr[n][1]) { numneighgrow+=1; case5=true; }
				if (arr[ci][0]-2 == arr[n][0] && arr[ci][1]+2 == arr[n][1]) { numneighgrow+=1; case6=true; }
				if (arr[ci][0]-2 == arr[n][0] && arr[ci][1]   == arr[n][1]) { numneighgrow+=1; case7=true; }
				if (arr[ci][0]-2 == arr[n][0] && arr[ci][1]-2 == arr[n][1]) { numneighgrow+=1; case8=true; }
				if (numneighgrow==8) { ci=(int)(m.random() * growcount); n=-1; numneighgrow=0;		// bei gleichem i muß neues ci probiert werden .. // n=-1 .. erstaunlich. (sonst - bei n=0 - wird per ++n zu n=1 evaluiert, dann wird arr[0] nicht als Nachbar erkannt)
					case1=false; case2=false; case3=false; case4=false; case5=false; case6=false; case7=false; case8=false; }
//				}		/* End	..while runbool not false	*/
			}		/*	End		.. for n	*/		// case==true muß außerhalb n-Schleife (innert i-Schleife) bleiben und numneighgrow (?) member- / lokale variable?
			/*	.. dann zu irgendeinem freien Nachbarfeld hinwachsen	*/
			if (numneighgrow < 8) {		// kann eigentlich nicht anders sein ..
				while (done==false) {
					int sc=(int)((m.random() * 8)+1);
					switch (sc) {
						case 1: if (case1==false) { gg.drawRect(arr[ci][0]+2,arr[ci][1]+2,1,1);
									arr[growcount+1][0]=(arr[ci][0]+2); arr[growcount+1][1]=(arr[ci][1]+2); done=true; break; } break;
								// break im if springt wg done=true zum nächsten i; nach if springt hinter switch zum nächsten while
						case 2: if (case2==false) { gg.drawRect(arr[ci][0]+2,arr[ci][1],1,1);
									arr[growcount+1][0]=(arr[ci][0]+2); arr[growcount+1][1]= arr[ci][1]   ; done=true; break; } break; 	//	else { }
						case 3: if (case3==false) { gg.drawRect(arr[ci][0]+2,arr[ci][1]-2,1,1);
									arr[growcount+1][0]=(arr[ci][0]+2); arr[growcount+1][1]=(arr[ci][1]-2); done=true; break; } break; 	//	else { }
						case 4: if (case4==false) { gg.drawRect(arr[ci][0],arr[ci][1]+2,1,1);
									arr[growcount+1][0]= arr[ci][0];    arr[growcount+1][1]=(arr[ci][1]+2); done=true; break; } break; 	//	else { }
						case 5: if (case5==false) { gg.drawRect(arr[ci][0],arr[ci][1]-2,1,1);
									arr[growcount+1][0]= arr[ci][0];    arr[growcount+1][1]=(arr[ci][1]-2); done=true; break; } break; 	//	else { }
						case 6: if (case6==false) { gg.drawRect(arr[ci][0]-2,arr[ci][1]+2,1,1);
									arr[growcount+1][0]=(arr[ci][0]-2); arr[growcount+1][1]=(arr[ci][1]+2); done=true; break; } break; 	//	else { }
						case 7: if (case7==false) { gg.drawRect(arr[ci][0]-2,arr[ci][1],1,1);
									arr[growcount+1][0]=(arr[ci][0]-2); arr[growcount+1][1]= arr[ci][1]   ; done=true; break; } break; 	//	else { }
						case 8: if (case8==false) { gg.drawRect(arr[ci][0]-2,arr[ci][1]-2,1,1);
									arr[growcount+1][0]=(arr[ci][0]-2); arr[growcount+1][1]=(arr[ci][1]-2); done=true; break; } break; 	//	else { }
					}		/*	switch	*/
				}		/*	while	*/
			}	/*	if-numneighgrow<8	*/
			/**/if (done==false) { tf2.setText("flow-error:  done==false"+" growcount="+growcount+" ci="+ci); try{Thread.sleep(500);}catch(InterruptedException ie){}
			}else { if(growcount<=numpix) { tf1.setText("numpix= "+numpix+"   growcount= "+growcount+" ci = "+ci+" done = "+done); } }
//			}		/* End	..while runbool not false		*/
//		}		/* End		.. for i			*/
///* debug moeba jumps 0,0 */for(int n=0;n<139;++n){System.out.println("arr["+n+"][0] = "+arr[n][0]+"  arr["+n+"][1] = "+arr[n][1]); }
			} 	/* End 	.. if growcount<=numpix		 */ 	if(growcount>numpix) { growbool=false; }
		} 	/* End 		.. growstep		 */
		
		/*	und jetzt - loslaufen 	*/
		
	public void runstep(Graphics rg) {
		
/* ?	*/		if(runbool==true) { 

		/*	erst ein Randpixel mit Spurfarbe übermalen	*/
//		g.setColor(new Color(250,230,220,5));		//	0,0,0,3
//		for (int j=0; ; ++j) {
		++j;		/*while (runbool!=false) {*/	// hier Anzahl Durchläufe = Wegstrecke-Pixel .. nicht mehr Gesamtanzahl Pixel
			numneighdie=0;
/*numpix*/	cj=(int)(m.random() * (numpix+1));	// ein beliebiges, das in r-Schleife auf Freistellen gecheckt wird !! Achtung !! j!=0
/*numpix*/	for (int r=0; r<=numpix; ++r) {
				if (arr[cj][0]+2 == arr[r][0] && arr[cj][1]+2 == arr[r][1]) { numneighdie+=1; }
				if (arr[cj][0]+2 == arr[r][0] && arr[cj][1]   == arr[r][1]) { numneighdie+=1; }
				if (arr[cj][0]+2 == arr[r][0] && arr[cj][1]-2 == arr[r][1]) { numneighdie+=1; }
				if (arr[cj][0]   == arr[r][0] && arr[cj][1]+2 == arr[r][1]) { numneighdie+=1; }
				if (arr[cj][0]   == arr[r][0] && arr[cj][1]-2 == arr[r][1]) { numneighdie+=1; }
				if (arr[cj][0]-2 == arr[r][0] && arr[cj][1]+2 == arr[r][1]) { numneighdie+=1; }
				if (arr[cj][0]-2 == arr[r][0] && arr[cj][1]   == arr[r][1]) { numneighdie+=1; }
				if (arr[cj][0]-2 == arr[r][0] && arr[cj][1]-2 == arr[r][1]) { numneighdie+=1; }
				/*DEATHRULE (Gegenteil von numneighdie) */
///*numpix*/		if (r==numpix && numneighdie>4) { cj=(int)(m.random() * (numpix+1)); r=-1; numneighdie=0; }
/*numpix*/		if (r==numpix && !deathrule(numneighdie)/*>4*/) { cj=(int)(m.random() * (numpix+1)); r=-1; numneighdie=0; }
			}	/*	r	*/	/*	c & p	---- das pixel mit der gefundenen Anzahl Nachbarn wird gelöscht. -----
							 *	|| (r==570 && numneighdie==2) || (r==570 && numneighdie==1)	numneighdie==8 || r==570 && (numneighdie!=4 && numneighdie!=3 && numneighdie!=2 && numneighdie!=1 && numneighdie!=0)
							 *	&& numneighdie<6 && numneighdie>2		r==570 && numneighdie>5	 || numneighdie==7		!(numneighdie<3 || numneighdie==6)						
							 *	numneighdie > 1 && 
							 */
//			if (numneighdie < 8) {			// wenn es ( arr[cj] ) Freistellen hat, ist es ein Randpixel und kann 'absterben'
//				/*	Hintergrundfarbe: g.setColor(new Color(177,167,160));	bei alpha am besten nur eine (mal-)farbe .. 	*/
//				g.fillRect(50,50,20,20);
				rg.setColor(Color.black);
				rg.drawRect(arr[cj][0],arr[cj][1],1,1);
				rg.setColor(Color.orange);
//				rg.setColor(new Color(250,250,250,80));
//			}	/*	if-numneighdie<8	*/

			/*	zum Schluß jetzt nochmal um ein Pixel wachsen lassen, das nach dem vorhin übermalten benannt wird	*/
			numneighbirth=0;
			casek1=false; casek2=false; casek3=false; casek4=false; casek5=false; casek6=false; casek7=false; casek8=false;
			donek=false;
/*numpix*/	ck=(int)(m.random() * (numpix+1));		// jetzt nochmal eins zum wachsen lassen
/*numpix*/	for (int q=0; q<=numpix; ++q) {
				if (arr[ck][0]+2 == arr[q][0] && arr[ck][1]+2 == arr[q][1]) { numneighbirth+=1; casek1=true; }
				if (arr[ck][0]+2 == arr[q][0] && arr[ck][1]   == arr[q][1]) { numneighbirth+=1; casek2=true; }
				if (arr[ck][0]+2 == arr[q][0] && arr[ck][1]-2 == arr[q][1]) { numneighbirth+=1; casek3=true; }
				if (arr[ck][0]   == arr[q][0] && arr[ck][1]+2 == arr[q][1]) { numneighbirth+=1; casek4=true; }
				if (arr[ck][0]   == arr[q][0] && arr[ck][1]-2 == arr[q][1]) { numneighbirth+=1; casek5=true; }
				if (arr[ck][0]-2 == arr[q][0] && arr[ck][1]+2 == arr[q][1]) { numneighbirth+=1; casek6=true; }
				if (arr[ck][0]-2 == arr[q][0] && arr[ck][1]   == arr[q][1]) { numneighbirth+=1; casek7=true; }
				if (arr[ck][0]-2 == arr[q][0] && arr[ck][1]-2 == arr[q][1]) { numneighbirth+=1; casek8=true; }
				
//				if(arr[q][0]==0&&arr[q][1]==0) { /*rg.setColor(Color.red); rg.fillRect(0,0,800,740);*/ 
//					 tf2.setText("q="+q);
//					/*try{Thread.sleep(10);} catch(InterruptedException ie){}*/ }
				
				/*BIRTHRULE (Gegenteil von numneighbirth) */
///*numpix*/		if (q==numpix && (numneighbirth>4 || numneighbirth<2)) { ck=(int)(m.random() * (numpix+1)); q=-1; numneighbirth=0;		// muß gelten für alle r
/*numpix*/		if (q==numpix && !birthrule(numneighbirth/*>4 || numneighbirth<2*/)) { ck=(int)(m.random() * (numpix+1)); q=-1; numneighbirth=0;		// muß gelten für alle r
					casek1=false; casek2=false; casek3=false; casek4=false; casek5=false; casek6=false; casek7=false; casek8=false; }
			}	/*	q	*/	/*	c & p	----- das pixel mit der gefundenen Anzahl Nachbarn erhält einen weiteren Nachbarn ---------
							 *	|| (q==570 && numneighbirth==0) || (numneighbirth==2)	 (q==570 && numneighbirth==1)	 || ()	numneighbirth>2		q==570 && numneighbirth>4
							 *	numneighbirth > 2 && numneighbirth==8
							 */
			/*	.. dann zu irgendeinem freien Nachbarfeld hinwachsen	*/
//			if (numneighbirth > 1 && numneighbirth < 8) {		// dieses if kann nochmal nützlich werden, wenn amoebe wachsen oder schrumpfen können soll ..
				while (donek==false) {
					int sck=(int)((m.random() * 8)+1);
					switch (sck) {
						case 1: if (casek1==false) { rg.drawRect(arr[ck][0]+2,arr[ck][1]+2,1,1);
									arr[cj][0]=(arr[ck][0]+2); arr[cj][1]=(arr[ck][1]+2); donek=true; break; } break;
								// break im if springt wg done=true zum nächsten i; nach if springt hinter switch zum nächsten while
						case 2: if (casek2==false) { rg.drawRect(arr[ck][0]+2,arr[ck][1],1,1);
									arr[cj][0]=(arr[ck][0]+2); arr[cj][1]= arr[ck][1]   ; donek=true; break; } break; 	//	else { }
						case 3: if (casek3==false) { rg.drawRect(arr[ck][0]+2,arr[ck][1]-2,1,1);
									arr[cj][0]=(arr[ck][0]+2); arr[cj][1]=(arr[ck][1]-2); donek=true; break; } break; 	//	else { }
						case 4: if (casek4==false) { rg.drawRect(arr[ck][0],arr[ck][1]+2,1,1);
									arr[cj][0]= arr[ck][0];    arr[cj][1]=(arr[ck][1]+2); donek=true; break; } break; 	//	else { }
						case 5: if (casek5==false) { rg.drawRect(arr[ck][0],arr[ck][1]-2,1,1);
									arr[cj][0]= arr[ck][0];    arr[cj][1]=(arr[ck][1]-2); donek=true; break; } break; 	//	else { }
						case 6: if (casek6==false) { rg.drawRect(arr[ck][0]-2,arr[ck][1]+2,1,1);
									arr[cj][0]=(arr[ck][0]-2); arr[cj][1]=(arr[ck][1]+2); donek=true; break; } break; 	//	else { }
						case 7: if (casek7==false) { rg.drawRect(arr[ck][0]-2,arr[ck][1],1,1);
									arr[cj][0]=(arr[ck][0]-2); arr[cj][1]= arr[ck][1]   ; donek=true; break; } break; 	//	else { }
						case 8: if (casek8==false) { rg.drawRect(arr[ck][0]-2,arr[ck][1]-2,1,1);
									arr[cj][0]=(arr[ck][0]-2); arr[cj][1]=(arr[ck][1]-2); donek=true; break; } break; 	//	else { }
					}		/*	switch	*/
				}		/*	while	*/
//			}	/*	if-numneighbirth<8	*/
//			if (donek==false) { rg.clearRect(30,25,700,10); rg.drawString("flow-error:  done==false"+" j="+j+" ck="+ck,30+j/14,35); }
//			else { rg.clearRect(30,670,300,10); rg.drawString("ck="+ck+" j="+j,30,680); }
	//			try { t1.sleep(1);
	//				if (this.t2.isInterrupted()==true) { dispose(); System.exit(0); } } catch (InterruptedException e) {}
			if (j%100==0) { tf1.setText("running  .. j = "+j); }
			if (j%5000==0) { rg.setColor(alphaclear); rg.fillRect(0,0,800,700); }	// alpha-Spur
//			}		/*	End 	..while runbool not false		*/						/* wohin? 	*/
//		}		/*	End 		..	for j	*/
//		try { t1.sleep(10000); } catch (InterruptedException e) {}
//		super.update(g);
		} /*  End   .. if runbool true 	  */							/* wohin? 	*/
		try{Thread.sleep(speed);}catch(InterruptedException ie){}
	} /*  End  	.. runstep() 	 */	
	
	public void mouseExited(MouseEvent e) { }
	public void mouseEntered(MouseEvent e) { /*return;*/ }
	public void mouseReleased(MouseEvent e) { }
	public void mousePressed(MouseEvent e) {}
	public void mouseClicked(MouseEvent e) {}
	
	public void actionPerformed(ActionEvent ae) {
		cmd=ae.getActionCommand(); mg=getGraphics();
		if (cmd=="||") { pauserunbutton.setLabel(">" ); pausebool=true; runbool=false; if(growcount<=numpix) { tf1.setText("paused .. growcount = "+growcount); } else { tf1.setText("paused .. j = "+j); } }
		if (cmd==">" ) { pauserunbutton.setLabel("||"); runbool=true; pausebool=false; /**/runstep(getGraphics()); }
		if(ae.getSource()==pres1) { cbd0.setState(true); cbd1.setState(true); cbd2.setState(true); cbd3.setState(true); cbd4.setState(true); cbd5.setState(false); cbd6.setState(false); cbd7.setState(false); cbd8.setState(false); 
											cbb0.setState(true); cbb1.setState(true); cbb2.setState(true); cbb3.setState(true); cbb4.setState(true); cbb5.setState(false); cbb6.setState(false); cbb7.setState(false); cbb8.setState(false); }
		if(ae.getSource()==pres2) { cbd0.setState(true); cbd1.setState(true); cbd2.setState(true); cbd3.setState(true); cbd4.setState(true); cbd5.setState(false); cbd6.setState(false);  cbd7.setState(false); cbd8.setState(false);
											cbb0.setState(false); cbb1.setState(false); cbb2.setState(true); cbb3.setState(true); cbb4.setState(true); cbb5.setState(false); cbb6.setState(false); cbb7.setState(false); cbb8.setState(false); }
		if(ae.getSource()==pres3) { cbd0.setState(true); cbd1.setState(true); cbd2.setState(true); cbd3.setState(false); cbd4.setState(false); cbd5.setState(false); cbd6.setState(true);  cbd7.setState(true); cbd8.setState(true);
											cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(false); cbb4.setState(true); cbb5.setState(true); cbb6.setState(true); cbb7.setState(true); cbb8.setState(false); }
		if(ae.getSource()==pres4) { cbd0.setState(true); cbd1.setState(true); cbd2.setState(true); cbd3.setState(false); cbd4.setState(false); cbd5.setState(true); cbd6.setState(true);  cbd7.setState(false); cbd8.setState(false);
											cbb0.setState(true); cbb1.setState(true); cbb2.setState(true); cbb3.setState(false); cbb4.setState(true); cbb5.setState(false); cbb6.setState(false); cbb7.setState(false); cbb8.setState(false); }
		if(ae.getSource()==pres5) { cbd0.setState(true); cbd1.setState(false); cbd2.setState(true); cbd3.setState(true); cbd4.setState(true); cbd5.setState(true); cbd6.setState(true);  cbd7.setState(true); cbd8.setState(false);
											cbb0.setState(true); cbb1.setState(true); cbb2.setState(true); cbb3.setState(true); cbb4.setState(true); cbb5.setState(true); cbb6.setState(true); cbb7.setState(true); cbb8.setState(false); }
		if(ae.getSource()==pres6) { cbd0.setState(true); cbd1.setState(true); cbd2.setState(true); cbd3.setState(true); cbd4.setState(true); cbd5.setState(false); cbd6.setState(false);  cbd7.setState(false); cbd8.setState(false);
											cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(false); cbb4.setState(true); cbb5.setState(true); cbb6.setState(true); cbb7.setState(true); cbb8.setState(false); }
		if(ae.getSource()==pres7) { cbd0.setState(true); cbd1.setState(true); cbd2.setState(true); cbd3.setState(true); cbd4.setState(true); cbd5.setState(true); cbd6.setState(true);  cbd7.setState(true); cbd8.setState(true);
											cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(false); cbb4.setState(true); cbb5.setState(false); cbb6.setState(false); cbb7.setState(false); cbb8.setState(false); }
		if(ae.getSource()==pres8) { cbd0.setState(true); cbd1.setState(false); cbd2.setState(true); cbd3.setState(true); cbd4.setState(true); cbd5.setState(true); cbd6.setState(true);  cbd7.setState(true); cbd8.setState(false);
											cbb0.setState(false); cbb1.setState(true); cbb2.setState(false); cbb3.setState(false); cbb4.setState(false); cbb5.setState(false); cbb6.setState(true); cbb7.setState(true); cbb8.setState(false); }

		if(ae.getSource()==pres9) { cbd0.setState(false); cbd1.setState(false); cbd2.setState(false); cbd3.setState(true); cbd4.setState(true); cbd5.setState(true); cbd6.setState(false);  cbd7.setState(false); cbd8.setState(false);
											cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(true); cbb4.setState(true); cbb5.setState(true); cbb6.setState(false); cbb7.setState(false); cbb8.setState(false); }
		if(ae.getSource()==pres10) { cbd0.setState(false); cbd1.setState(false); cbd2.setState(true); cbd3.setState(true); cbd4.setState(true); cbd5.setState(true); cbd6.setState(false);  cbd7.setState(false); cbd8.setState(false);
											cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(true); cbb4.setState(true); cbb5.setState(true); cbb6.setState(true); cbb7.setState(false); cbb8.setState(false); }
	//	if(ae.getSource()==pres) { cbd0.setState(false); cbd1.setState(false); cbd2.setState(false); cbd3.setState(false); cbd4.setState(false); cbd5.setState(false); cbd6.setState(false); cbd7.setState(false); cbd8.setState(false);
	//										cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(false); cbb4.setState(false); cbb5.setState(false); cbb6.setState(false); cbb7.setState(false); cbb8.setState(false); }
	//	if(ae.getSource()==pres) { cbd0.setState(false); cbd1.setState(false); cbd2.setState(false); cbd3.setState(false); cbd4.setState(false); cbd5.setState(false); cbb.setState(false); cbd7.setState(false); cbd8.setState(false);
	//										cbb0.setState(false); cbb1.setState(false); cbb2.setState(false); cbb3.setState(false); cbb4.setState(false); cbb5.setState(false); cbb6.setState(false); cbb7.setState(false); cbb8.setState(false); }
		if(cmd=="c") { j=0; num_Mem=numpix; growcount=0/*2*/; growbool=true; numpix=sb_numpix.getValue(); growstep(getGraphics());/* pauserunbutton.setLabel(">" ); pausebool=true; runbool=false; if(growcount<=numpix) { tf1.setText("paused .. growcount = "+growcount); } else { tf1.setText("reset .. j = "+j);*/ }
		if(ae.getSource()==tf_numpix) { sb_numpix.setValue((int)(tf_numpixStringToInteger.valueOf(tf_numpix.getText()).intValue()));  numpix=(int)(tf_numpixStringToInteger.valueOf(tf_numpix.getText()).intValue()); }
	}	/* end..actionperformed() */
		
	public void adjustmentValueChanged(AdjustmentEvent adje) {
		if(adje.getSource()==sb_numpix) {  tf_numpix.setText( ""+sb_numpix.getValue()/*String.valueOf(adje.getValue()*/);  numpix=sb_numpix/*adje?*/.getValue(); } 	/* or: +" "+Integer.toString( (int)((double)(adje.getValue())) )*/
		if(adje.getSource()==sb_speed) { speed=sb_speed.getValue(); }
//		if(adje.getSource()==rndRadius) {  tf4.setText( ""+String.valueOf( (int)(adje.getValue()) ) ); } /* hier Radius in Pixeln */
	}

	public void itemStateChanged(ItemEvent ie) {}

	public void run() { while(true) { if (/*growcount==0 || j==0*/growbool==true || runbool==true /*|| num_Mem!=0*/ ) {  growstep(getGraphics());  runstep(getGraphics());//try { }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){} } 
	} } }
	
//	public Rectangle/**/ framBoundsGetter() {
//			framRect = new Rectangle(Amoebe05GUI.getWidth()); /* 	this	super			.getBounds() 	mainFrame.getBounds() 	 */
//			return framRect;
//	}			/*			USELESS !			*/
	
//	public Rectangle/**/ framRect() {
////			framRect = new Rectangle(Amoebe05GUI.getWidth()); /* 	this	super			.getBounds() 	mainFrame.getBounds() 	 */
//			return framRect;
//	}			/*			USELESS !			*/

	public Amoebe05GUI() {
		addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } } );
/*		addMouseListener(this);*/
/**/		setLayout(null);
		tf1=new TextField(); tf1.setBounds(40,645,300,20); tf1.setBackground(Color.white); tf1.addActionListener(this); add(tf1);
		tf2=new TextField(); tf2.setBounds(40,670,300,20); tf2.setBackground(Color.lightGray); tf2.addActionListener(this); tf2.addMouseListener(this); add(tf2); tf2.setText("[messages]"/*"enter filename here before saving or loading patterns"*/);
		pauserunbutton=new Button(">"); pauserunbutton.setBounds(650,50,30,20); pauserunbutton.setBackground(Color.white); pauserunbutton.addActionListener(this); add(pauserunbutton);
		cbd0=new Checkbox("0",true); cbd0.setBounds(630,460,30,15); cbd0.setBackground(Color.black); cbd0.setForeground(Color.white); add(cbd0);		cbb0=new Checkbox("0",true); cbb0.setBounds(680,460,30,15); cbb0.setBackground(Color.orange); add(cbb0);
		cbd1=new Checkbox("1",true); cbd1.setBounds(630,480,30,15); cbd1.setBackground(Color.black); cbd1.setForeground(Color.white); add(cbd1);		cbb1=new Checkbox("1",true); cbb1.setBounds(680,480,30,15); cbb1.setBackground(Color.orange); add(cbb1);
		cbd2=new Checkbox("2",true); cbd2.setBounds(630,500,30,15); cbd2.setBackground(Color.black); cbd2.setForeground(Color.white); add(cbd2);		cbb2=new Checkbox("2",true); cbb2.setBounds(680,500,30,15); cbb2.setBackground(Color.orange); add(cbb2);
		cbd3=new Checkbox("3",true); cbd3.setBounds(630,520,30,15); cbd3.setBackground(Color.black); cbd3.setForeground(Color.white); add(cbd3); 		cbb3=new Checkbox("3",true); cbb3.setBounds(680,520,30,15); cbb3.setBackground(Color.orange); add(cbb3);
		cbd4=new Checkbox("4",false); cbd4.setBounds(630,540,30,15); cbd4.setBackground(Color.black); cbd4.setForeground(Color.white); add(cbd4);		cbb4=new Checkbox("4",true); cbb4.setBounds(680,540,30,15); cbb4.setBackground(Color.orange); add(cbb4);
		cbd5=new Checkbox("5",true); cbd5.setBounds(630,560,30,15); cbd5.setBackground(Color.black); cbd5.setForeground(Color.white); add(cbd5);		cbb5=new Checkbox("5",false); cbb5.setBounds(680,560,30,15); cbb5.setBackground(Color.orange); add(cbb5);
		cbd6=new Checkbox("6",true); cbd6.setBounds(630,580,30,15); cbd6.setBackground(Color.black); cbd6.setForeground(Color.white); add(cbd6);		cbb6=new Checkbox("6",false); cbb6.setBounds(680,580,30,15); cbb6.setBackground(Color.orange); add(cbb6);
		cbd7=new Checkbox("7",false); cbd7.setBounds(630,600,30,15); cbd7.setBackground(Color.black); cbd7.setForeground(Color.white); add(cbd7);		cbb7=new Checkbox("7",false); cbb7.setBounds(680,600,30,15); cbb7.setBackground(Color.orange); add(cbb7);
		cbd8=new Checkbox("8",false); cbd8.setBounds(630,620,30,15); cbd8.setBackground(Color.black); cbd8.setForeground(Color.white); add(cbd8);		cbb8=new Checkbox("8",false); cbb8.setBounds(680,620,30,15); cbb8.setBackground(Color.orange); add(cbb8);
//		cbd0.addMouseListener(this); cbb0.addMouseListener(this); cbd6.addMouseListener(this); cbb6.addMouseListener(this); /* für tooltip */
		pres1=new Button("d<5 b<5"); pres1.setBounds(725/*-this.framRect.width-30*//*(rect)*/,485,65,15); pres1.setBackground(Color.lightGray); pres1.addActionListener(this); pres1.addMouseListener(this); add(pres1);
		   pres2=new Button("d<5 b234"); pres2.setBounds(725,500,65,15); pres2.setBackground(Color.lightGray); pres2.addActionListener(this); pres2.addMouseListener(this); add(pres2);
		      pres3=new Button("d012678 b4567"); pres3.setBounds(725,515,95,15); pres3.setBackground(Color.lightGray); pres3.addActionListener(this); pres3.addMouseListener(this); add(pres3);
		         pres4=new Button("d01256 b0124"); pres4.setBounds(725,530,90,15); pres4.setBackground(Color.lightGray); pres4.addActionListener(this); pres4.addMouseListener(this); add(pres4);
		            pres5=new Button("d<8!1 b<8"); pres5.setBounds(725,545,75,15); pres5.setBackground(Color.lightGray); pres5.addActionListener(this); pres5.addMouseListener(this); add(pres5);
		               pres6=new Button("d<5 b4567"); pres6.setBounds(725,560,70,15); pres6.setBackground(Color.lightGray); pres6.addActionListener(this); pres6.addMouseListener(this); add(pres6);
		                  pres7=new Button("dall b4"); pres7.setBounds(718,575,75,15); pres7.setBackground(Color.lightGray); pres7.addActionListener(this); pres7.addMouseListener(this); add(pres7);
		                     pres8=new Button("d<8!1 b167"); pres8.setBounds(725,590,70,15); pres8.setBackground(Color.lightGray); pres8.addActionListener(this); pres8.addMouseListener(this); add(pres8);
		                         pres9=new Button("new"); pres9.setBounds(725,605,70,15); pres9.setBackground(Color.lightGray); pres9.addActionListener(this); pres9.addMouseListener(this); add(pres9);
		                            pres10=new Button("new"); pres10.setBounds(718,620,76,15); pres10.setBackground(Color.lightGray); pres10.addActionListener(this); pres10.addMouseListener(this); add(pres10);
		clearbutton=new Button("c"); clearbutton.setBounds(690,50,30,20); clearbutton.setBackground(Color.orange); clearbutton.addActionListener(this); clearbutton.addMouseListener(this); add(clearbutton);
		sb_numpix= new Scrollbar(Scrollbar.HORIZONTAL,5,40,3,1000); sb_numpix.setBounds(750,210,100,15); sb_numpix.setValue(150); sb_numpix.setBackground(new Color(238,220,166)); sb_numpix.setForeground(Color.lightGray); sb_numpix.addAdjustmentListener(this);/**/ sb_numpix.addMouseListener(this); add(sb_numpix);
		tf_numpix=new TextField(); tf_numpix.setBounds(765,190,30,20); tf_numpix.setBackground(new Color(176,247,172)); tf_numpix.addActionListener(this); tf_numpix.addMouseListener(this); add(tf_numpix); tf_numpix.setText("150");
		sb_speed= new Scrollbar(Scrollbar.HORIZONTAL,5,40,0,500); sb_speed.setBounds(750,235,100,15); sb_speed.setValue(150); sb_speed.setBackground(new Color(238,220,166)); sb_speed.setForeground(Color.lightGray); sb_speed.addAdjustmentListener(this);/**/ sb_speed.addMouseListener(this); add(sb_speed);
	}					/* this.WIDTH+Amoebe05GUI.WIDTH-30   mainFrame.getSize().width-50   Amoebe05GUI.getBounds().width&nose
						*		super.getBounds().width-30
						*			!?   		ERRORR		ERRORR			ERRORR		..		!?															*/
	
	public static void main(String args[]) 	throws FileNotFoundException, IOException, EOFException {
		System.out.println("Starting Amoebe05GUI...");
		Amoebe05GUI mainFrame = new Amoebe05GUI();
		mainFrame.setSize(900, 740);
		mainFrame.setTitle("Amoebe05GUI");
		mainFrame.setVisible(true);
////		Rectangle framRect = new Rectangle(rect); /* this	super		Amoebe05GUI		.getWidth() 	mainFrame.getBounds() 	 */
//		Rectangle framRect = mainFrame.getBounds(); /* 	this	super		Amoebe05GUI		.getWidth() 	mainFrame.getBounds() 	 */
////		/*framRect*/rect = mainFrame.getBounds();
		new Thread(mainFrame).start();
	}
	
}	/*	Amoebe05GUI	*/


/*	
 *	****************************Amoebe05GUI		[ ab März 2011, aufsteigend ]
 *
 *										// runbool debuggen .. ?!
 *										// eigenen algo 'entschlüsseln':						[brainstorm!:] 
 *												.. zwei Jahre später versteh' ich meinen eigenen algo nicht wieder .. ?!
 *												.. der 'Clou' war vllt An-Pixel erst nur zu 'setzen', .. dann erst im 
 *														nächsten Schritt zu evaluieren / validieren und malen lassen ?
 *												.. auch fehlt mir jeglicher blasser Schimmer, was ich mit zB:
 *														'' arr[ci][0]+2 == arr[n][0] ''
 *														gemeint hab' .. ?	( Warum '' +2 '' ?  Was ist nochmal '' ci '' ? )
 *													.. offenbar dient   '' [0] '' als An /Aus .. ?
 *											s. algo_learn.java
 *													(Verdacht: escape-Bedingungen bevorzugen jünger generierte Zellen)
 *										// neues Problem mit reset: 	.. wenn bei laufender Moebe ohne Pause
 *													numpix-Schieber ändern -> bleibt hängen ..
 *	o	
 *	o	numpix für reset aus tf_numpix lesen, erlaubt höhere Werte eintippen, als Schieber sb_numpix kann. (in acPef(), cmd ''c'')
 *	o	Vielleicht läßt sich ein bewegliches layout per zusätzlichem   Rectangle   (wg ''.getBounds()'' ) er-
 *			-schließen, das jederzeit auf zB   '' super.getBounds() '' die Maße des Frame abholen kann .. ?
 *			( was in Klassenmethode zB Amoebe05GUI() wg non-static-Kram nicht geht .. )
 *		.. um ein umständliches GridBagLayout zu vermeiden.
 *	o	num, numj, numk    heißen jetzt:    numneighgrow, numneighdie, numneighbirth
 *	//	Problem:		moebe springt gelegentlich nach 0,0 .. (trivial oder ganzer algo betroffen?)
 *						.. ?
 *						.. offenbar sind alle    arr[][]    per default, vor Initiierung    =0   .. ?
 *		Erklärung: 	Es handelt sich wohl um   arr[1][0], arr[1][1]   denn durch das Wachsen per +/=/-2 wird 
 *						dieser nie hinzugewachsen .. (o.ä.?)
 *		--> Lösung: 	zB umwerten zu =351
 *						.. dadurch wird auch das Zurücksetzen des kompletten arr bei reset unnötig (?) (da eh' alle
 *							neu  gefunden und benannt werden, und jene - falls neue Moebe kleiner - unbenutzt bleiben ?)
 *	o	clearbutton   für reset mit    int num_Mem   s. actionPerformed cmd "c"   und   step() if num_Mem!=0
 *		// Problem hier: 	Übergabe funkst nicht richtig: reset funktioniert nur nach run erste Moebe oder kleiner-
 *								gleichem arr, sonst aioobe.
 *								if num_Mem!=0 in run    hilft nicht ..
 *		--> gelöst mit   growbool   .. s.a.  debug_reset.java
 *	o	 erledigt. - wie gehabt aus HexLife1stUpload übernommen und angepasst (cbs..urvive=cbd..eath)
 *				und angepasst zu   deathrule(numneighdie)   und   birthrule(numneighbirth) 
 *		.. das schreit nun danach, die entdeckten rules gleich in presets festzuhalten (möglichst mit screenshots
 *			in einem preview-Fensterchen mit save as preview for this rule)
 *	o	Aus Spaß, und um 'mal zu gucken, ob wenig numpix schneller weit weg laufen, oder nur 'heftiger zappeln'
 *			(ohne letztlich vom Fleck zu kommen) .. numpix 10 probiert:
 *						!!      AMOEBE kann einfrieren     !!
 *									.. 'it can freeze!
 *									(when birthrule not met for having scattered to too few neighbours per cell)	
 *									.. wenn in zuviele Einzelgrüppchen 'zerfetzt' mit zuwenig Nachbarn für birthrule.
 *		.. so, nun am liebsten gleich die rules per CheckBoxes verwirklichen ..
 *	o	erstpixel malen ohne x,y , sondern arr[0][0,1].		'' +150 ''   ersatzlos annihiliert.
 *	o	boolSe initiieren nicht in for-Schleifen (jetzt grow-run- step() ), sondern Klassenkopf (?!)
 *	o	pauserunbutton (mit Drum und Dran, cmd=">", boolSe, entspr. Zeilen) aus HexLife übernommen ..
 *		.. funkst nur run zum Starten, dann in for j-Schleife gefangen, wo eigentlich step() hingehört (?)
 *		.. zusätzlich   '' while (runbool==true) { } ''   nach 'for j' hindert nun nur noch in i-Schleife
 *		.. vllt extra button mit bool für 'grow Moeba' 
 *		.. muß aber auch so irgendswie gehen !
 *		.. nur 'while nach for j' funktioniert einwandfrei, aber nur ab j 
 *		.. dann auch noch   '' while(runbool!=false) .. '' nach   'for i' .. bleibt bei i=1 hängen..
 *			.. flattert bei numpix erreicht. tf1 zeigt zB ''numpix=1000   i=0'' .. wieso '' 0 '' ?
 *			.. es muß an der   'for n' - Schleife liegen ! .. (?)
 *			.. s.o. // '' algo entschlüsseln ''
 *		--> Lösung:								.. ist jetzt:
 *					.. step()								growstep()
 *							for i								runstep()
 *							for j									if runbool true
 *	o	Fenster breiter für vorraussichtlich viele Schieberegler.
 *	o	tf1 und tf3 (hier tf2) aus HexLife1stUpload übernommen.
 *	o	.. erstmal step() und run(), damit das Fenster zugeht + thread1 u. 2-Kram aus v.04 'rausgeschmissen.
 */
 
 
/* o	Farben, Spur an/aus, stark/schwach
 *	ok	Anzahl Startpixel (Größe der Amoebe), ..
 *	o		.. dann shrink/grow-Optionen zur Laufzeit
 *	o	Patterns, mausmalen, speichern, laden (Mem + tofro file mit rule), rnd
 *	o	zoom
 *	ok	rules per cbSe
 *	o	torus! und 'follow'
 *	o	1280 x 1024 - 'skin'
 *	o	
 *	o	..
 *
 *		.. diesmal mit Layout und ausgelagerten Methoden (statt if(bool) )
 *		.. canvas?
 *		.. genügt normal od unod sechseckig?
 *		.. mit Futter!? 'Kampfamoebe' gar!!? (''amoebattle'')
 *
 *	untersuchen:
 *		.. findet verteilte Moebe zueinander?
 *		.. ist ein einzelnes Zufallsweg-Pixel unbedingt schneller, weiter?
 *				Moebe scheint behäbiger, da sie alle Zellen mitschleppt, doch
 *				vllt 'zappelt' ein einzelnes Zufallsweg-pixel gleichermaßen ziellos?
 *		.. welche amoebe entwickelt die größte Fernwirkung!?  ( zB d!1 b01* ? )
 *
 *	Foodmoeba
 *	==============
 *	o	smell mit radius und impact ( zB 'je näher, desto unbedingter Richtung->food' )
 *	o	
 *	o	..
 *
 *	untersuchen Foodmoebe:
 *		.. welche smell algos sind besser / schlechter, als Zufallsalgo ohne smell?
 *
 *	Kampfmoebe
 * ================
 *		.. Haupt-Herausforderung dabei: wie das Aufeinandertreffen 'regeln'?
 *			- 'nur, wo frei'
 *			- 'Angreifer schluckt Zelle'
 *			- 'bei Kontakt blockieren' (so Territorium verteidigen)
 *			- 
 *			Kampfmoebe mit Kern/'Herz'
 *			- Varianten mit Kernüberwältigung
 *			- Kernschutz-algo
 *
 *	o	smell Gegner/Freund
 *	o	
 *	o	..
 *
 *	untersuchen Kampfmoebe:
 *		.. ist verteilte oder kompakte Moebe im Vorteil?
 *		.. ist der Moment des Aufeinandertreffens bereits die unausweichliche Entscheidung?
 *		.. wie wirken sich rules aus? wie bei Moeben mit verschiedenen rules?
 *				welche rule ist 'die beste'!? (Vergleich mit Natur!?)
 * [drüber ab März 2011] */
 
 
 
 
 /* Amoebe04 hatte offenbar genialen (?) algo ( ohne 'Grid'-Array;  neues ci-rnd als 'break;' mißbraucht ),
  *	.. dann wieder grob zusammengemurkst  ( initiieren in Schleifen;  Zahlen, statt 'numpix'-Variable (?!);  alles '+150' ).						 */
  
 
 
 
 /*	****************************amoebe04			[ bis Okt. 2009 ]
 *				
 *	.. fade-alpha, um multimoeben körper besser sichtbar zu machen !? .. = bg-alpha übermalen?
 *	.. b1-amoebe bauen (diagonalen!)
 *	.. bessere ringmoebe entwerfen !?
 *	.. soll Kreisgrenze einhalten (+pass. bgColor) .. einfach an Kreisgrenze nicht mehr malen amoebe soll sich dann selbst 'befreien'.
 *	.. BUTTOOOOOOONS für Pixelmenge, alpha, Spurlänge, Farben, Nachbar-Minimum (-Max. !?).. für alles.
 *			.. copypasten in den MvL-paintStep()-Block ?! .. musterbutton ? .. beides ??
 *			.. beim tutorial: WindowEvent von Null anfangen ?
 *	..version mit begrenzter Spurlänge.
 *	..version mit verschieben von outline zu freiem Nachbarfeld (statt woanders per rnd() eins weg)
 *
 *	- kohärente Amoebe soweit gelungen !
 *	- start-Formen selber malen (statt rnd()-wachsen .. (mouseevents vonnöten..?!)
 *	- Wachsen und Schrumpfen von Amoebe (per rnd(), per if .. ?) kann erreicht werden , wenn if in Zeilen 122 bzw 152 Fälle ausschließt,
 *		die im vorangegangenen scan-q- oder r-for nicht ausgeschlossen sind, i wächst dann über numpix hinaus (bei Benennung von cj od. ck)
 *		.. oder - einfacher - den Faktor in  cj=rnd * [Faktor]  größer / kleiner als numpix wählen .. (?) (Z.106, 116 bzw 135, 145)
 *
 *
 *
 *					********* Regeln ******** (bezogen auf Nachbarn) ********	 (Freistellen?)
 *					*
 *			m		*	b<3 d<8 - frizzelig, fast keine Innenpixel, 
 *					*					trotzdem regionaler Zusammenhalt !?  (bleibt manchmal im Ansatz stecken)
 *			.		*	b<2		 - friert fast sofort ein.
 *			z		*	12	- zersetzte multimoebe
 *			.		*		d<4 - friert meistens ein (alle Randpixel haben dann 4 oder mehr Nachbarn)
 *					*	b<4 d<4 - hat wenig chancen, ein sehr kleiner Ableger kann überleben (keine Rand=5-Struktur möglich),darf
 *					*				aber auch dann nicht dem statischen Moloch begegnen, sonst wird er 'assimiliert'.
 *		g?	k		*	36 - ähnlich d8 - wenn Pixelmenge groß genug gewählt (genug Innenpixel verfügbar), bläht sich solange auf,
 *					*				 bis soviel Innenfreistellen vereinzelt sind, daß wieder keine Innenpixel 7 od. 8 Nachbarn haben ..
 *			iMB		*	(35 - GoL zum verwechseln ähnliche Innenmoebe. .. ordnet die amoebe zu Balken an .. kristallisiert sie
 *					*				regelrecht von anfangs vereinzelten Freistellen über Mäander, zu Balken, während sie sich aufbläht. 
 *		g?	iaEBM	*	(35 || d=1 - b4567/d1678 - mehr Innenmoebe, balken-, mäanderhaft. ARME MÖGLICH.
 *	!?	g?	pmEA	*	(35 || d<3 - b4567/d012678 - poröse amoebe, streckt sich, bäumt sich, wölbt sich, tritt aus, teilt sich,
 *					*				 stat. Ableger.
 *		g?	z		*	b<8 d<6 - ähnlich 3 sehr
 *					*					lebendig u. verformbar, aber am Rechteck orientiert. Einschnitt, 'Fluß' beobachtet.
 *			m		*	b<8 |d| - normale ('ausgewogene') multimoebe
 *					*designversuche gmoebe:
 *			i(a)L	*	b<8 5 n=-1   (nicht  n==0 _! )
 *	- cj = rnd() * j   .. falsch!   sonst erstes   cj=0   richtig:   cj = rnd() * 1001
 *	- .. dito auch in for-Anweisungen für r + q:   r<=j   .. falsch!  richtig:   r<1001
 *
 *	.. so, nun Ganzkreis und laufen lassen, das Viech ..
 *
 *	..version mit verschieben von outline zu freiem Nachbarfeld (statt woanders per rnd() eins weg)
 *	..versionen mit null Nachbarn möglich bzw nicht möglich ( 1 < num < 8 )
 *
 *	dabei abgefallen (aufsteigend):
 *		***WucherMoebe
 *		***FledderMoebe
 *		***amoebe_SchimmelOrakel
 *		[alle in "amoebe"]
 *
 *	***************************amoebe02
 *
 *	- zwei opti-Hänger:
 *		ci = rnd() * i   kann beliebig lange   num==8   liefern ..
 *		sc = rnd() * (8-num)   ebenso   case==true   ..
 *		.. das verlangsamt (bremst) zwar, gibt aber einen urig-lebendigen Bewegungs-Rythmus, hoffentlich ..
 *	- ein weiterer Gedankenfehler:
 *		wenn   num=5   , dann   maximal   sc=(rnd()*(8-num)+1=3      .. sind nun   case1-3==true    bleibt   done==false
 *		richtig:   sc=(rnd()*8)+1
 *
 *	***************************amoebe
 *
 *	- n-Schleife darf while done==false nicht umschließen, sonst immer   n=0   und case==false
 *		n_schleife muß für alle (!) n vorher ausgewertet sein ( num< oder ==8 )
 *
 *	**************************************************************** Projekt:
 *
 *	erst wachsen lassen:
 *		neue Pixel müssen mindestens einen Nachbarn haben.
 *	.. dann:
 *		irgendein rnd()-Pixel, das mindestens eine freie Nachbar-Stelle hat
 *		(höchstens acht Nachbarn, wenn Mittelpixel=Aus), theoretisch ) bekommt einen neuen Nachbarn.
 *	.. dafür verschwindet ein Pixel, das mindestens eine freie Nachbar-Stelle hat.
 *	fertig.
 *
 *	es kann der genommene Weg markiert werden mit einer dritten Farbe	 ..
 *	.. die Auswirkung von Hindernissen getestet werden ..
 *	.. verschiedenfarbige, mehrere amoebe02n probiert werden ..
 *	.. das Universum begrenzt oder ein Torus oder unendlich sein ..
 *		.. dann mit Zoom-Fenter für den Weg
 *	.. version mit vier Nachbarn (ohne diagonal) ..
 */