import java.awt.*;
import java.applet.*;

public class Life extends Applet implements Runnable{
	Field myField = new Field();
	Field stackField = new Field();
	
	public void init(){
		myField.init();
		//die hard
		myField.setValue(5, 5, true);
		myField.setValue(6, 5, true);
		myField.setValue(6, 6, true);
		myField.setValue(10, 6, true);
		myField.setValue(11, 6, true);
		myField.setValue(12, 6, true);
		myField.setValue(11, 4, true);
		
		//glider
		/*myField.setValue(23, 23, true);
		myField.setValue(24, 23, true);
		myField.setValue(25, 23, true);
		myField.setValue(23, 24, true);
		myField.setValue(24, 25, true);
		*/
		/*
		// Blinker 
		myField.setValue(3, 1, true);
		myField.setValue(3, 2, true);
		myField.setValue(3, 3, true);
		
		// Block
		myField.setValue(7, 3, true);
		myField.setValue(7, 2, true);
		myField.setValue(6, 3, true);
		myField.setValue(6, 2, true);
		*/
		System.out.println(myField.countNeighbours(2, 3));
		new Thread(this).start();
	}
	
	public void run(){
		while(true){
			try {
				Thread.currentThread().sleep(100);
				this.update();
			} catch (InterruptedException e) {}
		}
	}

	public void equalize(){
		int x;
		int y;
		for (y=0;y<myField.HEIGHT;y++){
			for(x=0;x<myField.WIDTH;x++){
				stackField.setValue(x, y, myField.getValue(x, y));
			}
		}
	}
	
	public void update(){
		int x;
		int y;
		int neighbours;
		this.equalize(); // stackField = myField;
		for (y=0;y<myField.HEIGHT;y++){
			for(x=0;x<myField.WIDTH;x++){
				neighbours = stackField.countNeighbours(x, y);
				if (neighbours < 2 || neighbours > 3) {
					myField.setValue(x, y, false);
				} else if (neighbours == 3 || neighbours == 4 || neighbours == 5){
					myField.setValue(x, y, true);
				}
			}
		}
		repaint();
	}
	
	public void paint(Graphics g){

		int x;
		int y;
		int diameter=10;		
		g.setColor(Color.WHITE);
		g.fillRect(0,0,myField.WIDTH*diameter,myField.HEIGHT*diameter);
		for (y=0;y<myField.HEIGHT;y++){
			for(x=0;x<myField.WIDTH;x++){
				if (myField.getValue(x, y)){
					g.setColor(Color.MAGENTA);
					g.fillRect(x*diameter+1, y*diameter+1, diameter-1, diameter-1);
					//g.setColor(Color.white);
					//g.drawString(""+myField.countNeighbours(x, y), x*diameter+8, y*diameter+18);
				}else{
					g.setColor(Color.GRAY);
					g.drawRect(x*diameter, y*diameter, diameter, diameter);
					//g.drawString(""+myField.countNeighbours(x, y), x*diameter+8, y*diameter+18);
				}
			}
		}
	}
}
