Skip to main content

Java The World of Zuul

Post kali ini membahas tentang The World of Zuul dengan menggunakan bahasa Pemrograman Java dan BlueJ. The World of Zuul adalah game petualangan berbasis teks yang sangat sederhana. Pengguna bisa berjalan di sekitar tempat yang ada.

Project ini berkaitan dengan bagaimana mendesain class yang bagus. Sebuah istilah yang terkait dengan kualitas desain suatu class adalah cohesion dan coupling. Berikut ini adalah pengertian cohesion dan coupling.

Cohesion adalah tingkat sejauh mana elemen-elemen dari sebuah class terkait bersama, disarankan untuk kode-kode di dalam class tersebut sedekat mungkin satu sama lainnya, karena itulah disebut high cohesion. Cohesion ini berhubungan dengan elemen-elemen di dalam class.

Coupling adalah tingkat sejauh mana class yang berbeda bergantung satu sama lain, disarankan semua class harus independen satu sama lain, karena itulah disebut loosely couping. Coupling ini berhubungan dengan elemen di antara class.

High cohesion dan loosely coupling memberikan kita desain kode yang lebih baik dan mudah untuk diurus.

The World of Zuul terdiri dari kelas-kelas sebagai berikut:

  • The CommandWords class
  • The Parser class
  • The Command class
  • The Room class
  • The Game class

Berikut ini adalah gambar diagram kelas dari The World of Zuul.


The CommandWords class

Kelas CommandWords mendefinisikan semua command yang valid di dalam game. Kelas ini melakukannya dengan memegang sebuah array dari object String merepresentasikan kata-kata command.

Implementation of the CommandWords class

/**
 * Kelas ini adalah bagian dari aplikasi "World of Zuul".
 * "World of Zuul" adalah game petualangan berbasis teks yang sangat sederhana.
 * 
 * Kelas ini menangani daftar enumerasi dari semua kata-kata instruksi yang diketahui pada game ini.
 * Kelas ini digunakan untuk mengenali instruksi seperti yang diketik.
 * 
 *
 * @author  Ramadhan Arif Hardijansyah
 * @version 2020.11.19
 */

public class CommandWords
{
    // sebuah constant array yang menangani semua kata instruksi yang valid
    private static final String[] validCommands = {
        "go", "quit", "help"
    };

    /**
     * Constructor - menginisialisasi kata-kata instruksi.
     */
    public CommandWords()
    {
       // tidak ada yang dilakukan untuk saat ini ...
    }

    /**
     * Memeriksa apakah String yang diberikan adalah kata instruksi yang valid.
     * @return true jika string yang diberikan adalah instruksi yang valid,
     * false jika tidak.
     */
    public boolean isCommand(String aString)
    {
        for(int i = 0; i < validCommands.length; i++) {
            if(validCommands[i].equals(aString))
                return true;
        }
        // jika eksekusi sampai di sini, maka string tersebut tidak ditemukan pada
        // daftar instruksi
        return false;
    }
}

The Parser class

Kelas Parser membaca baris-baris input dari terminal dan mencoba untuk menginterpretasikannya sebagai sebuah command. Kelas ini membuat objek-objek dari kelas Command yang merepresentasikan command yang telah dimasukkan.

Implementation of the Parser class

import java.util.Scanner;

/**
 * Kelas ini adalah bagian dari aplikasi "World of Zuul".
 * "World of Zuul" adalah game petualangan berbasis teks yang sangat sederhana.
 * 
 * Parser ini membaca masukan pengguna dan mencoba menginterpretasikannya sebagai
 * instruksi "Petualangan".
 * Setiap kali dipanggil, kelas ini membaca baris dari terminal dan mencoba menafsirkan
 * baris tersebut sebagai instruksi dua kata. Kelas ini mengembalikan instruksi
 * sebagai sebuah objek dari kelas Command.
 *
 * Parser memiliki sekumpulan kata instruksi yang diketahui. Parser ini memeriksa
 * masukan pengguna dengan daftar instruksi yang diketahui, dan jika masukan tersebut bukan
 * bukan salah satu dari instruksi yang diketahui, ia mengembalikan objek command yang
 * ditandai sebagai instruksi yang tidak diketahui.
 * 
 * @author  Ramadhan Arif Hardijansyah
 * @version 2020.11.19
 */
public class Parser 
{
    private CommandWords commands;  // menampung semua kata instruksi yang valid
    private Scanner reader;         // sumber input instruksi

    /**
     * Membuat sebuah parser untuk membaca dari terminal window.
     */
    public Parser() 
    {
        commands = new CommandWords();
        reader = new Scanner(System.in);
    }

    /**
     * @return Instruksi selanjutnya dari pengguna.
     */
    public Command getCommand() 
    {
        String inputLine;   // akan menampung baris input yang lengkap
        String word1 = null;
        String word2 = null;

        System.out.print("> ");     // mencetak prompt

        inputLine = reader.nextLine();

        // Menemukan hingga dua kata pada baris yang telah ditampung.
        Scanner tokenizer = new Scanner(inputLine);
        if(tokenizer.hasNext()) {
            word1 = tokenizer.next();      // mendapatkan kata pertama
            if(tokenizer.hasNext()) {
                word2 = tokenizer.next();      // mendapatkan kata kedua
                // catatan: kita mengabaikan sisa dari baris input.
            }
        }

        // Sekarang periksa apakah kata ini dikenal. Jika demikian, buat instruksi
        // dengannya. Jika tidak, buat instruksi "null" (untuk instruksi yang tidak
        // diketahui).
        if(commands.isCommand(word1)) {
            return new Command(word1, word2);
        }
        else {
            return new Command(null, word2); 
        }
    }
}

The Command class

Sebuah objek Command merepresentasikan sebuah command yang dimasukkan oleh pengguna. Kelas ini memiliki bermacam method yang membuatnya kita menjadi mudah untuk mengecek apakah suatu command merupakan command yang valid, serta untuk membuat kata pertama dan kata kedua dari suatu command menjadi string yang terpisah.

Implementation of the Command class

/**
 * Kelas ini adalah bagian dari aplikasi "World of Zuul".
 * "World of Zuul" adalah game petualangan berbasis teks yang sangat sederhana.
 *
 * Kelas ini menyimpan informasi tentang instruksi yang diberikan oleh pengguna..
 * Sebuah instruksi saat ini terdiri dari dua string: kata instruksi dan kata kedua
 * (misalnya, jika instruksinya adalah "take map", maka dua string tersebut
 * jelas adalah "take" dan "map").
 * 
 * Cara penggunaannya adalah: Instruksi-instruksi telah diperiksa untuk menjadi
 * kata-kata instruksi yang valid.
 * Jika pengguna memasukkan instruksi yang tidak valid (kata yang tidak dikenal)
 * maka kata instruksinya adalah <null>.
 *
 * Jika instruksi hanya memiliki satu kata, maka kata kedua adalah <null>.
 * 
 * @author  Ramadhan Arif Hardijansyah
 * @version 2020.11.19
 */

public class Command
{
    private String commandWord;
    private String secondWord;

    /**
     * Buat objek command. Kata pertama dan kedua harus diberikan, tetapi
     * salah satu (atau keduanya) bisa kosong.
     * @param firstWord Kata pertama dari instruksi. Null jika perintahnya
     *                  tidak dikenali.
     * @param secondWord Kata kedua dari instruksi tersebut.
     */
    public Command(String firstWord, String secondWord)
    {
        commandWord = firstWord;
        this.secondWord = secondWord;
    }

    /**
     * Mengembalikan commandWord (kata pertama) dari instruksi ini. Jika
     * instruksi tidak dimengerti, hasilnya null.
     * @return commandWord.
     */
    public String getCommandWord()
    {
        return commandWord;
    }

    /**
     * @return Kata kedua dari instruksi ini. Mengembalikan null jika tidak ada
     * kata kedua.
     */
    public String getSecondWord()
    {
        return secondWord;
    }

    /**
     * @return true jika instruksi ini tidak dipahami.
     */
    public boolean isUnknown()
    {
        return (commandWord == null);
    }

    /**
     * @return true jika instruksi memiliki kata kedua.
     */
    public boolean hasSecondWord()
    {
        return (secondWord != null);
    }
}


The Room class

Sebuah objek Room merepresentasikan sebuah lokasi di dalam game. Ruangan-ruangan bisa memiliki pintu keluar yang mengarah ke ruangan lainnya.

Implementation of the Room class

/**
 * Class Room - sebuah ruangan dalam game petualangan.
 *
 * Kelas ini adalah bagian dari aplikasi "World of Zuul".
 * "World of Zuul" adalah game petualangan berbasis teks yang sangat sederhana.
 *
 * Sebuah "Ruangan" merepresentasikan satu lokasi dalam pemandangan dalam game. Ruangan
 * ini terhubung ke ruangan lain melalui pintu keluar. Pintu keluarnya diberi label
 * utara, timur, selatan, barat. Untuk setiap arah, ruangan menyimpan referensi
 * ke ruang tetangga, atau nol jika tidak ada jalan keluar ke arah itu.
 * 
 * @author  Ramadhan Arif Hardijansyah
 * @version 2020.11.19
 */
public class Room 
{
    public String description;
    public Room northExit;
    public Room southExit;
    public Room eastExit;
    public Room westExit;

    /**
     * Buat ruang dengan deskripsi "description". Awalnya, memang tidak ada
     * jalan keluar. "description" adalah sesuatu seperti "dapur" atau
     * "halaman terbuka".
     * @param description Deskripsi ruangan.
     */
    public Room(String description) 
    {
        this.description = description;
    }

    /**
     * Tentukan pintu keluar ruangan ini. Setiap arah mengarah
     * ke ruangan lain atau null (tidak ada pintu keluar).
     * @param north Pintu keluar utara.
     * @param east Pintu keluar timur.
     * @param south Pintu keluar selatan.
     * @param west Pintu keluar barat.
     */
    public void setExits(Room north, Room east, Room south, Room west) 
    {
        if(north != null) {
            northExit = north;
        }
        if(east != null) {
            eastExit = east;
        }
        if(south != null) {
            southExit = south;
        }
        if(west != null) {
            westExit = west;
        }
    }

    /**
     * @return Deskripsi ruangan.
     */
    public String getDescription()
    {
        return description;
    }

}

The Game class

Kelas Game ini merupakan kelas utama dari game ini. Kelas ini mempersiapkan game dan kemudian memasuki loop/perulangan untuk membaca dan mengeksekusi command-command. Kelas ini juga berisi kode yang mengimplementsikan setiap command yang dimasukkan pengguna.

Implementation of the Game class

/**
 *  Kelas ini adalah kelas utama dari aplikasi "World of Zuul".
 *  "World of Zuul" adalah game petualangan berbasis teks yang sangat sederhana.
 *  Pengguna bisa berjalan di sekitar pemandangan. Itu saja.
 *  Game ini benar-benar harus dikembangkan agar lebih menarik!
 * 
 *  Untuk memainkan game ini, buat instance dari kelas ini dan panggil "play"
 *  method.
 * 
 *  Kelas utama ini membuat dan menginisialisasi semua hal: kelas ini membuat semua
 *  ruangan, membuat parser dan memulai permainan. Kelas ini juga mengevaluasi dan
 *  menjalankan perintah yang dikembalikan parser.
 * 
 * @author  Ramadhan Arif Hardijansyah
 * @version 2020.11.19
 */

public class Game 
{
    private Parser parser;
    private Room currentRoom;
        
    /**
     * Buat game dan inisialisasi map internalnya.
     */
    public Game() 
    {
        createRooms();
        parser = new Parser();
    }

    /**
     * Buat semua kamar dan hubungkan pintu keluarnya bersama-sama.
     */
    private void createRooms()
    {
        Room outside, theater, pub, lab, office;
      
        // buat ruangan
        outside = new Room("outside the main entrance of the university");
        theater = new Room("in a lecture theater");
        pub = new Room("in the campus pub");
        lab = new Room("in a computing lab");
        office = new Room("in the computing admin office");
        
        // menginisialisasi pintu keluar ruangan
        outside.setExits(null, theater, lab, pub);
        theater.setExits(null, null, null, outside);
        pub.setExits(null, outside, null, null);
        lab.setExits(outside, office, null, null);
        office.setExits(null, null, null, lab);

        currentRoom = outside;  // memulai game dari luar
    }

    /**
     *  Main play routine.  Loop sampai akhir permainan.
     */
    public void play() 
    {            
        printWelcome();

        // Masuk ke loop perintah utama.  Di sini kita berulang kali membaca instruksi
        // dan mengeksekusinya sampai permainan selesai.
        
        boolean finished = false;
        while (! finished) {
            Command command = parser.getCommand();
            finished = processCommand(command);
        }
        System.out.println("Thank you for playing.  Good bye.");
    }

    /**
     * Cetak pesan pembuka untuk pemain tersebut.
     */
    private void printWelcome()
    {
        System.out.println();
        System.out.println("Welcome to the World of Zuul!");
        System.out.println("World of Zuul is a new, incredibly boring adventure game.");
        System.out.println("Type 'help' if you need help.");
        System.out.println();
        System.out.println("You are " + currentRoom.getDescription());
        System.out.print("Exits: ");
        if(currentRoom.northExit != null) {
            System.out.print("north ");
        }
        if(currentRoom.eastExit != null) {
            System.out.print("east ");
        }
        if(currentRoom.southExit != null) {
            System.out.print("south ");
        }
        if(currentRoom.westExit != null) {
            System.out.print("west ");
        }
        System.out.println();
    }

    /**
     * Diberikan sebuah instruksi, proses (atau: eksekusi) perintah tersebut.
     * @param command Instruksi yang akan diproses.
     * @return true Jika instruksi mengakhiri permainan, salah jika sebaliknya.
     */
    private boolean processCommand(Command command) 
    {
        boolean wantToQuit = false;

        if(command.isUnknown()) {
            System.out.println("I don't know what you mean...");
            return false;
        }

        String commandWord = command.getCommandWord();
        if (commandWord.equals("help")) {
            printHelp();
        }
        else if (commandWord.equals("go")) {
            goRoom(command);
        }
        else if (commandWord.equals("quit")) {
            wantToQuit = quit(command);
        }

        return wantToQuit;
    }

    // implementasi instruksi pengguna:

    /**
     * Cetak beberapa informasi bantuan.
     * Di sini kita mencetak beberapa pesan yang bodoh dan samar serta daftar
     * kata instruksi.
     */
    private void printHelp() 
    {
        System.out.println("You are lost. You are alone. You wander");
        System.out.println("around at the university.");
        System.out.println();
        System.out.println("Your command words are:");
        System.out.println("   go quit help");
    }

    /** 
     * Cobalah untuk pergi ke satu arah. Jika ada jalan keluar, masuk ke
     * ruang baru tersebut, jika tidak cetak pesan kesalahan.
     */
    private void goRoom(Command command) 
    {
        if(!command.hasSecondWord()) {
            // jika tidak ada kata kedua, kita tidak tahu ke mana harus pergi ...
            System.out.println("Go where?");
            return;
        }

        String direction = command.getSecondWord();

        // Mencoba meninggalkan ruangan saat ini.
        Room nextRoom = null;
        if(direction.equals("north")) {
            nextRoom = currentRoom.northExit;
        }
        if(direction.equals("east")) {
            nextRoom = currentRoom.eastExit;
        }
        if(direction.equals("south")) {
            nextRoom = currentRoom.southExit;
        }
        if(direction.equals("west")) {
            nextRoom = currentRoom.westExit;
        }

        if (nextRoom == null) {
            System.out.println("There is no door!");
        }
        else {
            currentRoom = nextRoom;
            System.out.println("You are " + currentRoom.getDescription());
            System.out.print("Exits: ");
            if(currentRoom.northExit != null) {
                System.out.print("north ");
            }
            if(currentRoom.eastExit != null) {
                System.out.print("east ");
            }
            if(currentRoom.southExit != null) {
                System.out.print("south ");
            }
            if(currentRoom.westExit != null) {
                System.out.print("west ");
            }
            System.out.println();
        }
    }

    /** 
     * Instruksi "Quit" dimasukkan. Periksa sisa instruksi untuk melihat
     * apakah kita benar-benar keluar dari permainan.
     * @return true, jika instruksi ini menghentikan permainan, false jika tidak.
     */
    private boolean quit(Command command) 
    {
        if(command.hasSecondWord()) {
            System.out.println("Quit what?");
            return false;
        }
        else {
            return true;  // memberi tanda bahwa kita ingin keluar
        }
    }
}

Berikut ini adalah langkah-langkah untuk mencoba World of Zuul.

1. Buat objek dari kelas game.

2. Klik kanan pada objek game1, panggil void start() method.

3. Cobalah untuk mengetik teks di terminal dan tekan enter untuk mencoba game. Lihatlah bagaimana hal tersebut berjalan.

4. Ketik "quit" ketika sudah selesai.

Sekian post tentang World of Zuul. Semoga bermanfaat.

Comments

Popular posts from this blog

Java Exception Handling

Postingan ini membahas sebuah program tambahan tentang exception handling . Disini seolah-olah bertindak sebagai tester. Dan program yang akan dimodifikasi adalah program SimpleCalculator . Program SimpleCalculator adalah sebuah program kalkulator sederhana yang menggunakan switch..case dalam Java. Program bisa melakukan operasi pertambahan, pengurangan, perkalian, dan pembagian. Program SimpleCalculator ini dibuat menggunakan bahasa pemrograman Java dan bisa di-compile menggunakan IDE BlueJ. Dalam aplikasi ini, dicoba untuk ditambahkan catch exception untuk mengetes bagimana pembagian suatu angka dengan angka nol. Dicari modul kelas yang merupakan operasi pembagian dan dimodifikasi agar bisa mengetes operasi pembagian dengan penyebut angka nol. Exception Handling Exception Handling adalah sebuah proses menanggapi terjadinya exception, menangani runtime error seperti ClassNotFound, IO, SQL, Remote , dsb.  Exception adalah suatu kondisi tidak normal yang membutuhkan pemrosesan khu

Website Registrasi Kuliah Tatap Muka

  Postingan berikut menjelaskan dokumentasi proses pembuatan website registrasi kuliah tatap muka. Website di-hosting menggunakan github pages yang dapat meng-host  static webpages . Link Website Catalog Product:  https://dani-ramadhan7.github.io/registrasi/index.html Langkah-Langkah Pembuatan Website Registrasi Kuliah Tatap Muka 1. Ikuti langkah-langkah pada website pembelajaran. Salah satu website yang cukup bagus untuk dipelajari adalah  belajarphp.net/tutorial-validasi-form-menggunakan-html-dan-javascript/ . Coba untuk menulis ulang contoh kode pada modul pembelajaran atau langsung memilih bagian-bagian kode yang diinginkan untuk digunakan. 2. Buat file html baru, buat page html dengan acuan modul pembelajaran. Lakukan modifikasi dan penambahan. HTML JavaScript 3. Untuk desain, digunakan file css sebagaimana yang digunakan pada website, yakni menggunakan  https://stackpath.bootstrapcdn.com/bootstrap/

Website Pendaftaran Siswa Baru

Postingan berikut menjelaskan dokumentasi website Pendaftaran Siswa Baru. Website di-hosting di local PC menggunakan XAMPP serta menggunakan MySQL untuk menangani database dari para pendaftarnya. Halaman Utama Pendaftar dapat melakukan pendaftaran pada menu Daftar Baru atau melihat list pendaftar pada bagian Pendaftar. Formulir Pendaftaran Siswa Baru Disini, siswa dapat mengisikan formulir pendaftaran dan men-submit. Menu Pendaftar Menu Pendaftar isi menyajikan tabel yang berisi siswa yang telah mendaftar. Dapat dilakukan tindakan Edit atau Hapus pada setiap baris. Formulir Edit Siswa Formulir Edit Siswa menyajikan formulir untuk mengedit data siswa yang telah mendaftar. Setelah melakukan edit, dapat menekan tombol Simpan untuk menyimpan data siswa yang telah diperbarui. Source Code Untuk source code dari website Pendaftaran Siswa Baru ini adalah sebagai berikut. Link GitHub Gist:  https://gist.github.com/dani-ramadhan7/7838e42982a0488fcc170