Tugas 13 - Abstract Class

 Source Code: https://github.com/rsthopaz/Abstract-Class-PBO.git

   Makhluk Hidup
Explanation:

1). Manusia

public abstract class MakhlukHidup {
   
    public abstract void berdiri ();
   
    public void oksigen(){
        System.out.println("- butuh Makanan");
        System.out.println("- butuh oksigen");
        System.out.println("- butuh air");
    }    
}

Kelas MakhlukHidup adalah kelas abstrak yang mendefinisikan ciri umum makhluk hidup

Metode Abstrak berdiri() : Harus diimplementasikan oleh kelas turunan (Manusia, Hewan, Tumbuhan).

Metode oksigen() : Mencetak kebutuhan dasar semua makhluk hidup: makanan, oksigen, dan air.

Kelas ini digunakan sebagai dasar untuk kelas turunan yang mewakili berbagai jenis makhluk hidup.


2). Manusia

public class Manusia extends MakhlukHidup {
    private String duaKaki;
    public Manusia(String duaKaki){
        this.duaKaki = duaKaki;
    }
    public void berdiri (){
        System.out.println("Manusia berdiri menggunakan :  "+duaKaki);
    }
}

Extends MakhlukHidup : Kelas Manusia adalah turunan dari kelas abstrak MakhlukHidup, sehingga wajib mengimplementasikan metode abstrak berdiri().

Atribut duaKaki : Atribut duaKaki adalah variabel bertipe String yang merepresentasikan cara berdiri manusia (menggunakan dua kaki).

Konstruktor : Konstruktor menerima parameter duaKaki untuk menginisialisasi atribut duaKaki.

Metode berdiri() : Mengimplementasikan metode abstrak berdiri() dari kelas MakhlukHidup dengan mencetak cara berdiri manusia


3). Hewan

public class Hewan extends MakhlukHidup {
    private String kakiEmpat, kakiDua ;
    public Hewan(String kakiEmpat, String kakiDua){
        this.kakiEmpat = kakiEmpat;
        this.kakiDua   = kakiDua;
    }
   
    public void berdiri (){
        System.out.println("Kambing berdiri menggunakan :  " +kakiEmpat);
        System.out.println("Ayam berdiri menggunakan    :  " + kakiDua);
    }    
}

Extends MakhlukHidup : Kelas Hewan adalah turunan dari kelas abstrak MakhlukHidup, sehingga wajib mengimplementasikan metode abstrak berdiri().

Atribut kakiEmpat dan kakiDua : kakiEmpat dan kakiDua adalah atribut bertipe String yang digunakan untuk merepresentasikan jenis kaki hewan, misalnya hewan berkaki empat (kambing) dan berkaki dua (ayam).

Konstruktor : Konstruktor menerima dua parameter, yaitu kakiEmpat dan kakiDua, untuk menginisialisasi atribut tersebut.

Metode berdiri() : Mengimplementasikan metode abstrak berdiri() dari kelas MakhlukHidup dengan mencetak cara berdiri dua jenis hewan


4). Tumbuhan

public class Tumbuhan extends MakhlukHidup {
    private String Akar;
    public Tumbuhan (String Akar){
        this.Akar = Akar;
    }
    public void berdiri (){
        System.out.println("Tumbuhan berdiri dengan :  "+Akar);
    }
}

Extends MakhlukHidup : Kelas Tumbuhan merupakan turunan dari kelas abstrak MakhlukHidup, sehingga wajib mengimplementasikan metode abstrak berdiri().

Atribut Akar : Atribut Akar adalah variabel bertipe String yang merepresentasikan cara tumbuhan berdiri (menggunakan akar).

Konstruktor : Konstruktor menerima parameter Akar untuk menginisialisasi atribut Akar.

Metode berdiri() : Mengimplementasikan metode abstrak berdiri() dengan mencetak cara tumbuhan berdiri, yaitu menggunakan akar


5). MainMakhlukHidup

public class MainMakhlukHidup {
    public void cekMakhlukHidup (MakhlukHidup mHidup){
        mHidup.berdiri();
        mHidup.oksigen();
    }
   
    public static void main(String[] args) {
        MainMakhlukHidup tMakhlukHidup = new MainMakhlukHidup();        
       
        tMakhlukHidup.cekMakhlukHidup(new Manusia("Dua Kaki"));      
       
        System.out.println("-----------------------------------------");                              
        tMakhlukHidup.cekMakhlukHidup(new Hewan ("Empat Kaki","Dua Kaki"));
       
        System.out.println("-----------------------------------------");        
        tMakhlukHidup.cekMakhlukHidup(new Tumbuhan ("Akar"));
       
    }
}

Metode cekMakhlukHidup : Metode ini menerima parameter bertipe MakhlukHidup dan memanggil dua metode pada objek tersebut :

berdiri() : Menampilkan cara berdiri dari objek yang diberikan.

oksigen() : Menampilkan kebutuhan dasar makhluk hidup (makanan, oksigen, air).

Metode main : Membuat objek MainMakhlukHidup untuk memanggil metode cekMakhlukHidup. Menguji metode cekMakhlukHidup dengan tiga objek turunan dari MakhlukHidup :

Manusia : Menampilkan cara berdiri manusia (dua kaki) dan kebutuhan oksigen.

Hewan : Menampilkan cara berdiri hewan (kambing dengan empat kaki, ayam dengan dua kaki) dan kebutuhan oksigen.

Tumbuhan : Menampilkan cara berdiri tumbuhan (dengan akar) dan kebutuhan oksigen.


Diagram Class

Implementasi


Foxes and Rabbit

1). Animal
import java.util.List;

public abstract class Animal {
    private int age;
    private boolean alive;
    private Field field;
    private Location location;

    public Animal(Field field, Location location) {
        this.age = 0;
        this.alive = true;
        this.field = field;
        setLocation(location);
    }

    public boolean isAlive() {
        return alive;
    }

    public void setDead() {
        alive = false;
        if (location != null) {
            field.clear(location);
            location = null;
            field = null;
        }
    }

    public Location getLocation() {
        return location;
    }

    public Field getField() {
        return field;
    }

    public void setLocation(Location newLocation) {
        if (location != null) {
            field.clear(location);
        }
        location = newLocation;
        field.place(this, newLocation);
    }

    public abstract void act(List<Animal> newAnimals);
}

2). Field
import java.util.List;
import java.util.ArrayList;
public class Field {
    private Object[][] field;

    public Field(int depth, int width) {
        field = new Object[depth][width];
    }

    public void clear(Location location) {
        field[location.getRow()][location.getCol()] = null;
    }

    public void place(Object object, Location location) {
        field[location.getRow()][location.getCol()] = object;
    }

    public Object getObjectAt(Location location) {
        return field[location.getRow()][location.getCol()];
    }

    public Location freeAdjacentLocation(Location location) {
        List<Location> free = new ArrayList<>();
        List<Location> adjacent = adjacentLocations(location);
        for (Location loc : adjacent) {
            if (getObjectAt(loc) == null) {
                free.add(loc);
            }
        }
        return free.isEmpty() ? null : free.get(0);
    }

    public List<Location> adjacentLocations(Location location) {
        List<Location> locations = new ArrayList<>();
        // Add logic to calculate adjacent locations
        return locations;
    }

    // Menambahkan metode getDepth() dan getWidth()
    public int getDepth() {
        return field.length; // Mengembalikan jumlah baris
    }

    public int getWidth() {
        return field[0].length; // Mengembalikan jumlah kolom
    }
}

3). Location
public class Location {
    private int row;
    private int col;

    public Location(int row, int col) {
        this.row = row;
        this.col = col;
    }

    public int getRow() {
        return row;
    }

    public int getCol() {
        return col;
    }
}


4). Rabbit
import java.util.List;

public class Rabbit extends Animal {
    public Rabbit(Field field, Location location) {
        super(field, location);
    }

    @Override
    public void act(List<Animal> newAnimals) {
        if (isAlive()) {
            Location newLocation = getField().freeAdjacentLocation(getLocation());
            if (newLocation != null) {
                setLocation(newLocation);
            } else {
                setDead();
            }
        }
    }
}



5). Fox
import java.util.List;

public class Fox extends Animal {
    public Fox(Field field, Location location) {
        super(field, location);
    }

    @Override
    public void act(List<Animal> newAnimals) {
        if (isAlive()) {
            Location newLocation = findFood();
            if (newLocation == null) {
                newLocation = getField().freeAdjacentLocation(getLocation());
            }
            if (newLocation != null) {
                setLocation(newLocation);
                System.out.println("Fox moved to: " + newLocation.getRow() + ", " + newLocation.getCol());
            } else {
                setDead();
                System.out.println("Fox died.");
            }
        }
    }

    private Location findFood() {
        List<Location> adjacent = getField().adjacentLocations(getLocation());
        for (Location loc : adjacent) {
            Object animal = getField().getObjectAt(loc);
            if (animal instanceof Rabbit) {
                Rabbit rabbit = (Rabbit) animal;
                rabbit.setDead();
                return loc;
            }
        }
        return null;
    }
}

6). Simulator

import java.util.ArrayList;
import java.util.List;

public class Simulator {
    private Field field;
    private List<Animal> animals;
    public Simulator(int depth, int width) {
        field = new Field(depth, width);
        animals = new ArrayList<>();
        populate();
    }

    public void simulate(int steps) {
        for (int step = 0; step < steps; step++) {
            System.out.println("Step " + step);  // Menampilkan langkah simulasi
            List<Animal> newAnimals = new ArrayList<>();
            for (Animal animal : animals) {
                animal.act(newAnimals);
            }
            animals.addAll(newAnimals);
   
            // Tambahkan juga output untuk melihat keadaan hewan setelah setiap langkah
            System.out.println("Jumlah hewan saat ini: " + animals.size());
        }
    }
   

    private void populate() {
        int numberOfFoxes = 5;
        int numberOfRabbits = 10;
   
        // Tambahkan foxes ke field
        for (int i = 0; i < numberOfFoxes; i++) {
            Location location = getRandomLocation();
            Fox fox = new Fox(field, location);
            animals.add(fox);
            field.place(fox, location);
        }
   
        // Tambahkan rabbits ke field
        for (int i = 0; i < numberOfRabbits; i++) {
            Location location = getRandomLocation();
            Rabbit rabbit = new Rabbit(field, location);
            animals.add(rabbit);
            field.place(rabbit, location);
        }
   
        // Cetak jumlah hewan yang ditambahkan
        System.out.println("Jumlah foxes: " + numberOfFoxes);
        System.out.println("Jumlah rabbits: " + numberOfRabbits);
    }
   
   
    private Location getRandomLocation() {
        // Menghasilkan lokasi acak di dalam medan
        int row = (int) (Math.random() * field.getDepth());
        int col = (int) (Math.random() * field.getWidth());
        Location location = new Location(row, col);
       
        // Pastikan lokasi ini kosong
        while (field.getObjectAt(location) != null) {
            row = (int) (Math.random() * field.getDepth());
            col = (int) (Math.random() * field.getWidth());
            location = new Location(row, col);
        }
       
        return location;
    }
}


Diagram Class
Implementasi






Komentar

Postingan populer dari blog ini

The Busy Beaver Problem

Tugas 15 - Final Project

Church-Turing Thesis dan Kaitannya dengan Bahasa Pemrograman