/* Conway's Life Generator for Java. Copyright 1996 by Paul B. Callahan, callahan@cs.jhu.edu */ import java.util.*; import java.awt.*; import java.awt.image.ImageObserver; import java.awt.image.PixelGrabber; class LifeGenerator { int CellList[], n; int a[]; int b[]; int c[]; int generations; Color background; Color foreground; Color livecell; Color deadcell; Color border; int statusheight; int displaywidth; int displayheight; int originx; int originy; int maxcells; static int countmsk=0x1f; static int posmsk=0x7fffffe0; static int maxval=0x7fffffff; String statusLine; String loading; int scroll; static boolean rules[]={ false, false, false, false, false, true, true, true, false, false, false, false, false, false, false, false, false, false }; public LifeGenerator() { n=0; generations=0; maxcells=0; background=Color.white; foreground=Color.black; originx=0; originy=0; loading=null; scroll=10; statusLine=new String(""); } public void loading(String init_loading) { loading=init_loading; } public void setScroll(int init_scroll) { scroll=init_scroll; } public void setColors(Color init_background, Color init_foreground, Color init_border) { background=init_background; foreground=init_foreground; border=init_border; } public void setCellColors(Color init_deadcell, Color init_livecell) { deadcell=init_deadcell; livecell=init_livecell; } public void setDisplaySize(int width, int height) { statusheight=35; displaywidth=width; displayheight=height-statusheight; } public void translate(int dx, int dy) { originx+=dx; originy+=dy; } public void recenter(int x, int y) { translate(displaywidth/2-x, displayheight/2-y); } public void approachcenter(int x, int y) { translate((displaywidth/2-x)/scroll, (displayheight/2-y)/scroll); } public void findPattern() { if (n>0) { int packed=CellList[n/2]; int plotx=(((packed>>5)&0x1fff)-(1<<12))*2+originx; int ploty=((packed>>18)-(1<<12))*2+originy; recenter(plotx, ploty); } } public void updateStatusLine(Graphics g) { g.setColor(background); g.drawString(statusLine,0,displayheight+15); if (loading!=null) { statusLine="Loading: " + loading; } else { statusLine="Generations: " + generations + " Cells: " + n; } g.setColor(foreground); g.drawString(statusLine,0,displayheight+15); } void resizeIfNeeded(int cellcount) { int tmp[]; int i; if (cellcount>maxcells) { int newsize=2*cellcount; tmp=new int[newsize]; for (i=0; i>5)&0x1fff)-(1<<12))*2+originx; int ploty=((packed>>18)-(1<<12))*2+originy; if (plotx > 3 && plotx < displaywidth-5 && ploty > 3 && ploty < displayheight-5 ) { g.fillRect(plotx, ploty, 2, 2); } } public void paintAll(Graphics g) { g.clearRect(0,0,displaywidth, displayheight+statusheight); g.setColor(deadcell); g.fillRect(0,0,displaywidth, displayheight); g.setColor(border); g.drawRect(0,0,displaywidth-1, displayheight-1); g.setColor(livecell); for (int i=0; i w*h-count1) { pix1=pix0; count1=w*h-count1; } resizeIfNeeded(count1); n=0; for (i=0; i 0) { LifeList.generate(g); LifeList.updateStatusLine(g); } } }