Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.Point;
- import java.util.ArrayList;
- public class Forest {
- private static Tree[][] trees;
- private static Lumberjack[][] lumberjacks;
- private static Bear[][] bears;
- private static char[][] forest;
- private static int lumberCollected;
- private static int monthCount;
- private static int lumberMod = -10; //The higher the number, the more of a disadvantage the lumberjacks have
- private static int N;
- private static double treePercentage = 50;
- private static double lumberjackPercentage = 10;
- private static double bearPercentage = 2;
- //S = Sapling
- //T = Tree
- //E = Elder Tree
- //L = Lumberjack
- //B = Bear
- public Forest(int size) {
- this.N = size;
- trees = new Tree[size][size];
- lumberjacks = new Lumberjack[size][size];
- bears = new Bear[size][size];
- forest = spawnForest();
- lumberCollected = 0;
- }
- public static void nextMonth(){
- //Spawn a new sapling, 10-20% chance
- spawnSaplings();
- //Check for plants maturing
- maturePlants();
- //Lumberjacks are to cut trees each month
- chopTrees();
- //Check if lumberjacks have enough lumber
- lumberCheck();
- //Bears need to hunt lumberjacks
- huntLumberjacks();
- //Check if bears need killing or spawning
- bearCheck();
- }
- private static void spawnSaplings(){
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(trees[i][j] != null){
- if((int)(Math.random()*100) <= trees[i][j].getSpawnPower()){
- Point p = getTreeNeighbour(i, j);
- if(p != null){
- trees[(int)p.getX()][(int)p.getY()] = new Tree();
- forest[(int)p.getX()][(int)p.getY()] = trees[(int)p.getX()][(int)p.getY()].getChar();
- }
- }
- }
- }
- }
- }
- private static void maturePlants(){
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(trees[i][j] != null){
- trees[i][j].increaseAge();
- forest[i][j] = trees[i][j].getChar();
- }
- }
- }
- }
- private static void chopTrees(){
- int w;
- Point p;
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(lumberjacks[i][j] != null){
- w = (int)(Math.random()*3)+1;
- //Lumberjack will wander UP TO 3 times. That means 1, 2 or 3 times.
- //0 wanders would put the lumberjacks at too much of a disadvantage.
- //Also assumes that lumberjacks will not even go to where a sapling is. They will just ignore the spot.
- for(int k = 0; k < w; k++){
- p = getLumberNeighbour(i, j);
- if(p != null){
- if(forest[(int)p.getX()][(int)p.getY()] == 'T' || forest[(int)p.getX()][(int)p.getY()] == 'E'){
- lumberjacks[i][j].addLumber(trees[(int)p.getX()][(int)p.getY()].getTreeType());
- trees[(int)p.getX()][(int)p.getY()] = null;
- lumberjacks[(int)p.getX()][(int)p.getY()] = lumberjacks[i][j];
- forest[(int)p.getX()][(int)p.getY()] = 'L';
- lumberjacks[i][j] = null;
- forest[i][j] = '#';
- lumberCollected++;
- break;
- }
- }
- }
- }
- }
- }
- }
- private static void lumberCheck(){
- if(monthCount == 12){
- int lumberjackCount = 0;
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(lumberjacks[i][j] != null){
- lumberjackCount++;
- }
- }
- }
- if(lumberjackCount != 0){
- int hireCount = lumberCollected/lumberjackCount;
- if(lumberCollected-lumberMod > lumberjackCount){
- ArrayList<Point> lumJacks = new ArrayList<>();
- //Hire a new lumberjack
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(forest[i][j] == '#'){
- lumJacks.add(new Point(i, j));
- }
- }
- }
- for(int i = 0; i < hireCount; i++){
- Point p = lumJacks.get((int)(Math.random()*lumJacks.size()));
- forest[(int)(p.getX())][(int)(p.getY())] = 'L';
- lumberjacks[(int)(p.getX())][(int)(p.getY())] = new Lumberjack();
- }
- } else{
- ArrayList<Point> lumJacks = new ArrayList<>();
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(forest[i][j] == 'L'){
- lumJacks.add(new Point(i, j));
- }
- }
- }
- try{
- int randPoint = (int)(Math.random()*lumJacks.size());
- forest[(int)lumJacks.get(randPoint).getX()][(int)lumJacks.get(randPoint).getY()] = '#';
- lumberjacks[(int)lumJacks.get(randPoint).getX()][(int)lumJacks.get(randPoint).getY()] = null;
- } catch(Exception e){
- }
- }
- }
- monthCount = 0;
- lumberCollected = 0;
- }
- monthCount++;
- }
- private static void huntLumberjacks(){
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(forest[i][j] == 'B' && bears[i][j] != null){
- Point p = getBearNeighbour(i, j);
- if(getBearNeighbour(i, j) != null){ //Found a lumberjack!
- System.out.println("Lumberjack found \n");
- bears[i][j].addMaw();
- lumberjacks[(int)p.getX()][(int)p.getY()] = null;
- forest[(int)p.getX()][(int)p.getY()] = 'B';
- bears[(int)p.getX()][(int)p.getY()] = bears[i][j];
- bears[i][j] = null;
- } else{
- Point pN = getTreeNeighbour(i, j);
- if(pN != null){
- //Go here
- forest[(int)pN.getX()][(int)pN.getY()] = 'B';
- forest[i][j] = '#';
- bears[(int)pN.getX()][(int)pN.getY()] = bears[i][j];
- bears[i][j] = null;
- }
- }
- }
- }
- }
- }
- private static void bearCheck(){
- if(monthCount == 12){
- int bearCount = 0;
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(bears[i][j] != null){
- bearCount++;
- }
- }
- }
- if(bearCount != 0){
- int mawCount = lumberCollected/bearCount;
- if(lumberCollected-lumberMod > bearCount){
- ArrayList<Point> brs = new ArrayList<>();
- //spawn a new bear
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(forest[i][j] == '#'){
- brs.add(new Point(i, j));
- }
- }
- }
- for(int i = 0; i < mawCount; i++){
- Point p = brs.get((int)(Math.random()*brs.size()));
- forest[(int)(p.getX())][(int)(p.getY())] = 'L';
- bears[(int)(p.getX())][(int)(p.getY())] = new Bear();
- }
- } else{
- ArrayList<Point> brs = new ArrayList<>();
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(forest[i][j] == 'L'){
- brs.add(new Point(i, j));
- }
- }
- }
- int randPoint = (int)(Math.random()*brs.size());
- forest[(int)brs.get(randPoint).getX()][(int)brs.get(randPoint).getY()] = '#';
- bears[(int)brs.get(randPoint).getX()][(int)brs.get(randPoint).getY()] = null;
- }
- }
- monthCount = 0;
- lumberCollected = 0;
- }
- monthCount++;
- }
- private static Point getBearNeighbour(int row, int col){
- ArrayList<Point> list = new ArrayList<>();
- try {
- for (int rowMod = -1; rowMod <= 1; rowMod++ ) {
- for (int colMod = -1; colMod <= 1; colMod++) {
- if (forest[row+rowMod][col+colMod] == 'L') {
- list.add(new Point(row+rowMod, col+colMod));
- }
- }
- }
- } catch ( ArrayIndexOutOfBoundsException e ) {
- }
- if(list.size() == 0) return null;
- return list.get((int)(Math.random()*list.size()));
- }
- private static Point getTreeNeighbour(int row, int col){
- ArrayList<Point> list = new ArrayList<>();
- try {
- for (int rowMod = -1; rowMod <= 1; rowMod++ ) {
- for (int colMod = -1; colMod <= 1; colMod++) {
- if (forest[row+rowMod][col+colMod] == '#') {
- list.add(new Point(row+rowMod, col+colMod));
- }
- }
- }
- } catch ( ArrayIndexOutOfBoundsException e ) {
- }
- if(list.size() == 0) return null;
- return list.get((int)(Math.random()*list.size()));
- }
- private static Point getLumberNeighbour(int row, int col){
- ArrayList<Point> list = new ArrayList<>();
- try {
- for (int rowMod = -1; rowMod <= 1; rowMod++ ) {
- for (int colMod = -1; colMod <= 1; colMod++) {
- if (forest[row+rowMod][col+colMod] == 'T' || forest[row+rowMod][col+colMod] == 'E') {
- list.add(new Point(row+rowMod, col+colMod));
- }
- }
- }
- } catch ( ArrayIndexOutOfBoundsException e ) {
- }
- if(list.size() == 0) return null;
- return list.get((int)(Math.random()*list.size()));
- }
- private static char[][] spawnForest(){
- char[][] tempForest = new char[N][N];
- int t = (int)(((N*N)/100)*treePercentage), l = (int)(((N*N)/100)*lumberjackPercentage), b = (int)(((N*N)/100)*bearPercentage);
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- if(t > 0){
- tempForest[i][j] = 'S';
- trees[i][j] = new Tree();
- t--;
- } else if(l > 0){
- tempForest[i][j] = 'L';
- lumberjacks[i][j] = new Lumberjack();
- l--;
- } else if(b > 0){
- tempForest[i][j] = 'B';
- bears[i][j] = new Bear();
- b--;
- } else{
- tempForest[i][j] = '#';
- }
- }
- }
- //Shuffle the contents of the forest
- char temp;
- for(int i = 0; i < N; i++){
- for(int j = 0; j < N; j++){
- int m = (int)(Math.random()*N), n = (int)(Math.random()*N);
- temp = tempForest[i][j];
- tempForest[i][j] = tempForest[m][n];
- tempForest[m][n] = temp;
- }
- }
- return tempForest;
- }
- public char getTileAt(int i, int j){
- return forest[i][j];
- }
- public int getTreeCount(){
- return 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement