138 lines
3.7 KiB
Java
138 lines
3.7 KiB
Java
import java.util.Arrays;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
|
|
public class Fire {
|
|
private static final char BURNING = 'w'; //w looks like fire, right?
|
|
private static final char TREE = 'T';
|
|
private static final char EMPTY = '.';
|
|
private static final double F = 0.2;
|
|
private static final double P = 0.4;
|
|
private static final double TREE_PROB = 0.5;
|
|
|
|
private static List<String> process(List<String> land){
|
|
List<String> newLand = new LinkedList<String>();
|
|
for(int i = 0; i < land.size(); i++){
|
|
String rowAbove, thisRow = land.get(i), rowBelow;
|
|
if(i == 0){//first row
|
|
rowAbove = null;
|
|
rowBelow = land.get(i + 1);
|
|
}else if(i == land.size() - 1){//last row
|
|
rowBelow = null;
|
|
rowAbove = land.get(i - 1);
|
|
}else{//middle
|
|
rowBelow = land.get(i + 1);
|
|
rowAbove = land.get(i - 1);
|
|
}
|
|
newLand.add(processRows(rowAbove, thisRow, rowBelow));
|
|
}
|
|
return newLand;
|
|
}
|
|
|
|
private static String processRows(String rowAbove, String thisRow,
|
|
String rowBelow){
|
|
String newRow = "";
|
|
for(int i = 0; i < thisRow.length();i++){
|
|
switch(thisRow.charAt(i)){
|
|
case BURNING:
|
|
newRow+= EMPTY;
|
|
break;
|
|
case EMPTY:
|
|
newRow+= Math.random() < P ? TREE : EMPTY;
|
|
break;
|
|
case TREE:
|
|
String neighbors = "";
|
|
if(i == 0){//first char
|
|
neighbors+= rowAbove == null ? "" : rowAbove.substring(i, i + 2);
|
|
neighbors+= thisRow.charAt(i + 1);
|
|
neighbors+= rowBelow == null ? "" : rowBelow.substring(i, i + 2);
|
|
if(neighbors.contains(Character.toString(BURNING))){
|
|
newRow+= BURNING;
|
|
break;
|
|
}
|
|
}else if(i == thisRow.length() - 1){//last char
|
|
neighbors+= rowAbove == null ? "" : rowAbove.substring(i - 1, i + 1);
|
|
neighbors+= thisRow.charAt(i - 1);
|
|
neighbors+= rowBelow == null ? "" : rowBelow.substring(i - 1, i + 1);
|
|
if(neighbors.contains(Character.toString(BURNING))){
|
|
newRow+= BURNING;
|
|
break;
|
|
}
|
|
}else{//middle
|
|
neighbors+= rowAbove == null ? "" : rowAbove.substring(i - 1, i + 2);
|
|
neighbors+= thisRow.charAt(i + 1);
|
|
neighbors+= thisRow.charAt(i - 1);
|
|
neighbors+= rowBelow == null ? "" : rowBelow.substring(i - 1, i + 2);
|
|
if(neighbors.contains(Character.toString(BURNING))){
|
|
newRow+= BURNING;
|
|
break;
|
|
}
|
|
}
|
|
newRow+= Math.random() < F ? BURNING : TREE;
|
|
}
|
|
}
|
|
return newRow;
|
|
}
|
|
|
|
public static List<String> populate(int width, int height){
|
|
List<String> land = new LinkedList<String>();
|
|
for(;height > 0; height--){//height is just a copy anyway
|
|
StringBuilder line = new StringBuilder(width);
|
|
for(int i = width; i > 0; i--){
|
|
line.append((Math.random() < TREE_PROB) ? TREE : EMPTY);
|
|
}
|
|
land.add(line.toString());
|
|
}
|
|
return land;
|
|
}
|
|
|
|
//process the land n times
|
|
public static void processN(List<String> land, int n){
|
|
for(int i = 0;i < n; i++){
|
|
land = process(land);
|
|
}
|
|
}
|
|
|
|
//process the land n times and print each step along the way
|
|
public static void processNPrint(List<String> land, int n){
|
|
for(int i = 0;i < n; i++){
|
|
land = process(land);
|
|
print(land);
|
|
}
|
|
}
|
|
|
|
//print the land
|
|
public static void print(List<String> land){
|
|
for(String row: land){
|
|
System.out.println(row);
|
|
}
|
|
System.out.println();
|
|
}
|
|
|
|
public static void main(String[] args){
|
|
List<String> land = Arrays.asList(".TTT.T.T.TTTT.T",
|
|
"T.T.T.TT..T.T..",
|
|
"TT.TTTT...T.TT.",
|
|
"TTT..TTTTT.T..T",
|
|
".T.TTT....TT.TT",
|
|
"...T..TTT.TT.T.",
|
|
".TT.TT...TT..TT",
|
|
".TT.T.T..T.T.T.",
|
|
"..TTT.TT.T..T..",
|
|
".T....T.....TTT",
|
|
"T..TTT..T..T...",
|
|
"TTT....TTTTTT.T",
|
|
"......TwTTT...T",
|
|
"..T....TTTTTTTT",
|
|
".T.T.T....TT...");
|
|
print(land);
|
|
processNPrint(land, 10);
|
|
|
|
System.out.println("Random land test:");
|
|
|
|
land = populate(10, 10);
|
|
print(land);
|
|
processNPrint(land, 10);
|
|
}
|
|
}
|