//------------ // Introduction to Programming Using Java: An Object-Oriented Approach //Arnow/Weiss //------------ import java.awt.*; import java.awt.event.*; import java.applet.*; class LifeThread extends Thread { public LifeThread(LifeDisplay lifeDisplay, int size) { this.lifeDisplay = lifeDisplay; world = new boolean[size][size]; for (int i = world.length*4/10; i < world.length*6/10; i++) for (int j = world.length*4/10; j < world[i].length*6/10; j++) world[i][j] = true; } public void run() { // was doGenerations amRunning = true; amStopped = false; lifeDisplay.displayWorld(world); while (!amStopped && !lifeIsExtinct()) { try { Thread.sleep(25); } catch (Exception e) {} if (!amStopped && amRunning) nextGeneration(); if (!amStopped && amRunning) lifeDisplay.displayWorld(world); } } public void ourStop() { amStopped = true; } public void ourSuspend() { amRunning = false; } public void ourResume() { amRunning = true; } private boolean lifeIsExtinct() { for (int i = 0; i < world.length; i++) for (int j = 0; j < world[i].length; j++) if (world[i][j]) return false; return true; } private void nextGeneration() { boolean[][] newWorld = new boolean[world.length][world.length]; for (int i = 0; i < world.length; i++) for (int j = 0; j < world[i].length; j++) { int x = livingNeighbors(i, j); newWorld[i][j] = MinNeighbors <= x && x <= MaxNeighbors; } world = newWorld; } private int livingNeighbors(int i, int j) { int result = 0; if (isAlive(i-1, j-1)) result++; if (isAlive(i-1, j)) result++; if (isAlive(i-1, j+1)) result++; if (isAlive(i, j-1)) result++; if (isAlive(i, j+1)) result++; if (isAlive(i+1, j-1)) result++; if (isAlive(i+1, j)) result++; if (isAlive(i+1, j+1)) result++; return result; } boolean isAlive(int i, int j) { if (i >= 0 && i < world.length && j >= 0 && j < world[i].length && world[i][j]) return true; else return false; } boolean amRunning, amStopped; boolean[][] world; LifeDisplay lifeDisplay; static final int MinNeighbors = 2, MaxNeighbors = 3; }