Glife1
Allikas: Lambda
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/*
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.Timer;
*/
public class Glife1 {
// creates a small window with a text and a button in it
public static void main(String[] args) {
// create new frame
JFrame frame = new GLifeFrame();
// react to window close, pack stuff, show out
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
frame.setLocation(200,200);
//frame.pack(); // give a suitable size to window automatically
frame.setVisible(true); // make window visible
//panel.updateState(); // refresh panel
}
}
class GLifeFrame extends JFrame {
boolean debug=false;
GLifeFrame frame;
JPanel toppanel;
JPanel buttonpanel;
DrawPanel drawpanel;
JTextField textfield1, textfield2;
JButton mybutton;
JButton timerbutton;
GLifeFrame() {
// create a new window and panels
toppanel = new JPanel();
buttonpanel = new JPanel();
drawpanel = new DrawPanel();
// set layouts and colors of panels
buttonpanel.setLayout(new FlowLayout());
buttonpanel.setBackground(Color.yellow);
toppanel.setLayout(new BorderLayout());
toppanel.setBackground(Color.black);
drawpanel.setBackground(Color.red);
// create and add components
// create a label widget with text, put on button panel
//JLabel label = new JLabel("Life");
//buttonpanel.add(label);
// Create and add a button to button panel
mybutton = new JButton("Do next step");
buttonpanel.add(mybutton);
timerbutton = new JButton("Start/stop timer");
buttonpanel.add(timerbutton);
mybutton.addActionListener(drawpanel);
timerbutton.addActionListener(drawpanel);
drawpanel.addMouseListener(drawpanel);
Timer timer = new Timer(1000,drawpanel);
timer.start();
// add button and drawpanels to toppanel
toppanel.add(BorderLayout.NORTH,buttonpanel);
//ppanel.add(BorderLayout.WEST,buttonpanel1);
//toppanel.add(BorderLayout.SOUTH,buttonpanel2);
toppanel.add(BorderLayout.CENTER,drawpanel);
// add toppanel to the window
this.getContentPane().add(toppanel);
}
// Here starts the INTERNAL drawing panel class
class DrawPanel extends JPanel
implements ActionListener, MouseListener {
int drawwidth;
int drawheight;
int cellsize=10;
int cellareadim=200;
int steps;
int[][] cells;
int[][] newcells;
int[][] tmpcells; // temporary array pointer, not allocated
int count;
// Class constructor function: called when class is created
DrawPanel() {
init();
}
// mouse stuff
public void mousePressed(MouseEvent evt) {
int x,y;
int i,j;
if (debug) System.out.print("mouse button was pressed");
x=evt.getX();
y=evt.getY();
if (debug) System.out.println(" coords "+x+" and "+y);
i=(int)(x/cellsize); // x=12 then i=1
j=(int)(y/cellsize);
if (i<cellareadim && j<cellareadim) {
if (cells[i][j]==0) cells[i][j]=1;
else cells[i][j]=0;
//this.repaint();
toppanel.repaint();
}
//Component source = (Component)evt.getSource();
//source.repaint(); // Call repaint() on the Component that was clicked.
}
public void mouseClicked(MouseEvent evt) { }
public void mouseReleased(MouseEvent evt) { }
public void mouseEntered(MouseEvent evt) { }
public void mouseExited(MouseEvent evt) { }
// button stuff
public void actionPerformed(ActionEvent e) {
if (debug) System.out.println("button was pressed");
steps++;
if (debug) System.out.println("Step nr: "+steps);
if (debug) printCells(cells);
count=countCells(cells);
if (count==0) {
if (debug) System.out.println("Everybody dead at step nr: "+steps);
return;
}
compNextGen(cells,newcells);
// swap two arrays: cells will become newcells, and vice versa
tmpcells=cells;
cells=newcells;
newcells=tmpcells;
// just draw the new situation
toppanel.repaint();
}
// "reading" initialisation function
void init() {
if (debug) System.out.println("Init called");
cells=new int[cellareadim][cellareadim];
newcells=new int[cellareadim][cellareadim];
initCells(cells);
}
// Drawing function
public void paintComponent(Graphics g) {
int i,j;
g.setColor(Color.GREEN);
for(i=0;i<cellareadim;i++) {
for(j=0;j<cellareadim;j++) {
// if cells[i][j]==1 then draw dot
if (cells[i][j]==1) {
g.fillRect(i*cellsize,j*cellsize,
cellsize,cellsize);
}
}
}
}
// compute next generation of cells:
// old: cells as they were before, will not be changed
// next: next generation of cells, written anew
void compNextGen(int[][] old,int[][] next) {
int row,col;
int n;
for(row=0;row<old.length;row++) {
for(col=0;col<old[row].length;col++) {
// compute nr of neighbours of one cell
n=cval(old,row-1,col-1)+cval(old,row-1,col)+
cval(old,row-1,col+1);
n=n+cval(old,row,col-1)+cval(old,row,col+1);
n=n+cval(old,row+1,col-1)+cval(old,row+1,col)+
cval(old,row+1,col+1);
// compute next gen cell: dead or alive
if (old[row][col]==1 && n<2) next[row][col]=0;
else if (old[row][col]==1 && n>3) next[row][col]=0;
else if (old[row][col]==1 && (n==2 || n==3)) next[row][col]=1;
else if (old[row][col]==0 && n==3) next[row][col]=1;
else next[row][col]=0;
}
}
}
// allows to calc neigbour values for cells on borders
int cval(int[][] cells,int r, int c) {
if (r<0 || r>=cells.length) return 0;
if (c<0 || c>=cells[0].length) return 0;
return cells[r][c];
}
// give initial position
void initCells(int[][] cells) {
initCells2(cells);
}
void initCells1(int[][] cells) {
cells[1][1]=1;
cells[3][1]=1;
cells[3][2]=1;
cells[4][1]=1;
cells[4][2]=1;
cells[5][1]=1;
}
void initCells2(int[][] cells) {
cells[1][1]=1;
cells[1][2]=1;
cells[1][3]=1;
}
// just print current cells
void printCells(int[][] cells) {
int row,col;
for(row=0;row<cells.length;row++) {
for(col=0;col<cells[row].length;col++) {
if (cells[row][col]==1) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
// just count current cells
int countCells(int[][] cells) {
int row,col,count=0;
for(row=0;row<cells.length;row++) {
for(col=0;col<cells[row].length;col++) {
count=count+cells[row][col];
}
}
return count;
}
}
}