/* Life * * Conway's "Game of Life" using the StdLib Draw class. * * % javac Life.java * * x | y | rolldice% * % java 50 50 .5 * * * CIS 201-L UAB Dr. Sloan * * @author * Dan Latham * * @version 0.0.1 * */ public class Life { //other dir 2 public static boolean[][] checklifeB2(boolean[][] map) { for (int x = map[0].length-1; x >= 0; x -= 1) { for (int y = map.length-1; y >= 0; y -= 1) { int livecells = 0; //try to get values, unless indexOOB problems //top 3 try { //top left corner livecells += (map[y-1][x-1]) ? 1 : 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //top middle livecells += (map[y-1][x]) ? 1: 0; } catch (IndexOutOfBoundsException a2) { livecells += 0; } try { //top right corner livecells += (map[y-1][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException a3) { livecells += 0; } //middle 2 sides try { //left side livecells += (map[y][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException b1) { livecells += 0; } try { //right side livecells += (map[y][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException b3) { livecells += 0; } //bottom 3 try { //bottom left corner livecells += (map[y+1][x-1]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //bottom middle livecells += (map[y+1][x]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //bottom right corner livecells += (map[y+1][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } //check dead cells first if (map[y][x] == false && livecells == 3) { map[y][x] = true; //dead to alive } //check alives else if (map[y][x] == true && livecells <= 1) { map[y][x] = false; //alive to dead } else if (map[y][x] == true && livecells > 3) { map[y][x] = false; //alive to dead } else { map[y][x] = map[y][x]; } } } return map; } //other dir 1 public static boolean[][] checklifeB1(boolean[][] map) { for (int x = 0; x < map[0].length; x += 1) { for (int y = 0; y < map.length; y += 1) { int livecells = 0; //try to get values, unless indexOOB problems //top 3 try { //top left corner livecells += (map[y-1][x-1]) ? 1 : 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //top middle livecells += (map[y-1][x]) ? 1: 0; } catch (IndexOutOfBoundsException a2) { livecells += 0; } try { //top right corner livecells += (map[y-1][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException a3) { livecells += 0; } //middle 2 sides try { //left side livecells += (map[y][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException b1) { livecells += 0; } try { //right side livecells += (map[y][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException b3) { livecells += 0; } //bottom 3 try { //bottom left corner livecells += (map[y+1][x-1]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //bottom middle livecells += (map[y+1][x]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //bottom right corner livecells += (map[y+1][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } //check dead cells first if (map[y][x] == false && livecells == 3) { map[y][x] = true; //dead to alive } //check alives else if (map[y][x] == true && livecells <= 1) { map[y][x] = false; //alive to dead } else if (map[y][x] == true && livecells > 3) { map[y][x] = false; //alive to dead } else { map[y][x] = map[y][x]; } } } return map; } //backwards loop public static boolean[][] checklifeB(boolean[][] map) { for (int y = map.length-1; y >= 0; y -= 1) { for (int x = map[0].length-1; x >= 0; x -= 1) { int livecells = 0; //try to get values, unless indexOOB problems //top 3 try { //top left corner livecells += (map[y-1][x-1]) ? 1 : 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //top middle livecells += (map[y-1][x]) ? 1: 0; } catch (IndexOutOfBoundsException a2) { livecells += 0; } try { //top right corner livecells += (map[y-1][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException a3) { livecells += 0; } //middle 2 sides try { //left side livecells += (map[y][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException b1) { livecells += 0; } try { //right side livecells += (map[y][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException b3) { livecells += 0; } //bottom 3 try { //bottom left corner livecells += (map[y+1][x-1]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //bottom middle livecells += (map[y+1][x]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //bottom right corner livecells += (map[y+1][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } //check dead cells first if (map[y][x] == false && livecells == 3) { map[y][x] = true; //dead to alive } //check alives else if (map[y][x] == true && livecells <= 1) { map[y][x] = false; //alive to dead } else if (map[y][x] == true && livecells > 3) { map[y][x] = false; //alive to dead } else { map[y][x] = map[y][x]; } } } return map; } public static boolean[][] checklife(boolean[][] map) { for (int y = 0; y < map.length; y += 1) { for (int x = 0; x < map[0].length; x += 1) { int livecells = 0; //try to get values, unless indexOOB problems //top 3 try { //top left corner livecells += (map[y-1][x-1]) ? 1 : 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //top middle livecells += (map[y-1][x]) ? 1: 0; } catch (IndexOutOfBoundsException a2) { livecells += 0; } try { //top right corner livecells += (map[y-1][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException a3) { livecells += 0; } //middle 2 sides try { //left side livecells += (map[y][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException b1) { livecells += 0; } try { //right side livecells += (map[y][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException b3) { livecells += 0; } //bottom 3 try { //bottom left corner livecells += (map[y+1][x-1]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //bottom middle livecells += (map[y+1][x]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } try { //bottom right corner livecells += (map[y+1][x+1]) ? 1: 0; } catch (IndexOutOfBoundsException a1) { livecells += 0; } //check dead cells first if (map[y][x] == false && livecells == 3) { map[y][x] = true; //dead to alive } //check alives else if (map[y][x] == true && livecells <= 1) { map[y][x] = false; //alive to dead } else if (map[y][x] == true && livecells > 3) { map[y][x] = false; //alive to dead } else { map[y][x] = map[y][x]; } } } return map; } public static void life(boolean[][] map, Draw Map) { Map.clear(); for (int y = 0; y < map.length; y += 1) { for (int x = 0; x < map[0].length; x += 1) { if (map[y][x] == true) { Map.filledSquare(x/10.0,y/10.0,.05); } } } Map.show(750); } public static boolean[][] random(boolean[][] map, double chance) { //iterate through all x's of all y's for (int y = 0; y < map.length; y+=1) { for (int x = 0; x < map[0].length; x+=1) { double a = Math.random(); if (a >= (1-chance)) { map[y][x] = true; } } } return map; } public static void main(String[] args) { //x and y dimensions int x = Integer.parseInt(args[0]); int y = Integer.parseInt(args[1]); //initial chance of map[y][x] being alive double chance = Double.parseDouble(args[2]); //new clean map of array[y][x] for game boolean[][] map = new boolean[y][x]; //calls random to set up map map = random(map, chance); //StdArrayIO.print(map); //Create Draw object Draw Map = new Draw(); Map.setXscale(0, map[0].length/10.0); Map.setYscale(0, map.length/10.0); while (true) { life(map, Map); //update map, loop back map = checklife(map); life(map, Map); //now backwards map = checklifeB(map); life(map, Map); //now other dir 1 map = checklifeB1(map); life(map, Map); //now orther dir 2 map = checklifeB2(map); } } }