Selasa, 21 Oktober 2025

Pertemuan 8 - Implementasi World of Zuul

 Nama    : Safa Mashita

 NRP      : 5025241022

Pertemuan 8 - Implementasi World of Zuul

Hari ini saya mempelajari bagaimana membangun sebuah text-based adventure game sederhana bernama World of Zuul menggunakan konsep Object-Oriented Programming (OOP) di Java. Game ini memungkinkan pemain untuk menjelajahi berbagai ruangan, berpindah arah (seperti ke utara, selatan, timur, barat), dan memahami bagaimana objek saling berinteraksi dalam sebuah dunia virtual berbasis teks. 

Dalam proyek ini, sistem dibangun dengan beberapa kelas utama, yaitu:

  • Game

  • Parser

  • Command

  • CommandWords

  • Room

  • Player (opsional tambahan)

Setiap kelas memiliki peran tertentu untuk membentuk dunia permainan yang dinamis dan terstruktur.


A. Visualisasi Hubungan Antar Kelas

Hubungan antar kelas pada World of Zuul dapat dijelaskan sebagai berikut:

  1. Main : Titik awal program. Membuat objek Game dan memanggil method play() untuk memulai permainan.

  2. Game : Mengatur jalannya permainan, menampilkan pesan, memproses input, serta menyimpan posisi pemain saat ini (currentRoom).

  3. Parser : Membaca input dari pemain dan mengubahnya menjadi objek Command.

  4. Command : Menyimpan kata perintah utama (seperti go, help, quit, look) serta argumen tambahan (misalnya arah tujuan).

  5. CommandWords : Menyimpan daftar perintah valid dan membantu Parser memverifikasi apakah input pemain dikenali oleh sistem.

  6. Room : Mewakili lokasi dalam dunia permainan yang dapat saling terhubung melalui arah (north, south, east, west).


B. Alur Permainan
  1. Pemain menjalankan program Game.

  2. Sistem menampilkan sambutan dan menjelaskan cara bermain.

  3. Pemain mengetik perintah (misalnya “go east” atau “help”).

  4. Parser membaca input pemain dan membuat objek Command.

  5. Game memproses perintah tersebut:

    • Jika perintah valid, pemain akan berpindah ke ruangan yang sesuai.

    • Jika tidak, sistem menampilkan pesan kesalahan.

  6. Permainan berlanjut hingga pemain mengetik quit untuk keluar.



C. Code dan Penjelasan

1. Class Room

public class Room {
    private String description;
    private Room northExit, southExit, eastExit, westExit;

    public Room(String description) {
        this.description = description;
    }

    public void setExits(Room north, Room east, Room south, Room west) {
        this.northExit = north;
        this.eastExit = east;
        this.southExit = south;
        this.westExit = west;
    }

    public String getDescription() {
        return description;
    }

    public Room getExit(String direction) {
        switch (direction) {
            case "north": return northExit;
            case "east":  return eastExit;
            case "south": return southExit;
            case "west":  return westExit;
            default: return null;
        }
    }

    public String getExitString() {
        String exits = "Exits:";
        if (northExit != null) exits += "\nnorth";
        if (eastExit != null) exits += "\neast";
        if (southExit != null) exits += "\nsouth";
        if (westExit != null) exits += "\nwest";
        return exits;
    }
}

Kegunaan:
Merepresentasikan setiap lokasi dalam dunia permainan yang bisa memiliki koneksi (exit) ke ruangan lain.

Atribut:

  • String description : deskripsi ruangan.

  • Room northExit, southExit, eastExit, westExit : referensi ke ruangan lain berdasarkan arah.

Method:

  • Room(String description) : konstruktor untuk membuat ruangan dengan deskripsi tertentu.

  • setExits(Room north, Room east, Room south, Room west) : menentukan ruangan yang terhubung dari ruangan saat ini.

  • getDescription() : mengembalikan deskripsi ruangan.

  • getExit(String direction) : mengembalikan ruangan tujuan berdasarkan arah yang dimasukkan pemain.

  • getExitString() : menampilkan daftar arah (exit) yang tersedia dari ruangan saat ini.

Hubungan:
Digunakan oleh kelas Game untuk membangun peta dunia permainan dan menentukan arah perpindahan pemain.


2. Class Command

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

    public Command(String firstWord, String secondWord) {
        this.commandWord = firstWord;
        this.secondWord = secondWord;
    }

    public boolean isUnknown() {
        return (commandWord == null);
    }

    public boolean hasSecondWord() {
        return (secondWord != null);
    }

    public String getCommandWord() {
        return commandWord;
    }

    public String getSecondWord() {
        return secondWord;
    }
}

Kegunaan:
Menyimpan hasil input pemain yang sudah diproses, berupa kata perintah dan argumen tambahan.

Atribut:

  • String commandWord : perintah utama (misalnya: go, help, quit, look).

  • String secondWord : kata kedua atau argumen tambahan (misalnya: arah tujuan).

Method:

  • Command(String firstWord, String secondWord) : konstruktor untuk menyimpan dua kata input.

  • isUnknown() : mengembalikan true jika perintah tidak dikenali.

  • hasSecondWord() : mengecek apakah pemain memasukkan argumen tambahan.

  • getCommandWord() : mengambil kata perintah utama.

  • getSecondWord() : mengambil kata kedua (argumen).

Hubungan:
Objek Command dibuat oleh kelas Parser dan digunakan oleh Game untuk menentukan aksi yang akan dijalankan.


3. Class CommandWords

public class CommandWords {

    private static final String validCommands[] = { "go", "quit", "help" };


    public boolean isCommand(String aString) {

        for (String command : validCommands) {

            if (command.equals(aString)) return true;

        }

        return false;

    }


    public void showAll() {

        System.out.print("Your command words are:\n\t");

        for (int i = 0; i < validCommands.length; i++) {

            System.out.print(validCommands[i]);

            if (i < validCommands.length - 1) System.out.print(" ");

        }

        System.out.println();

    }

}

Kegunaan:
Menyimpan daftar semua kata perintah valid yang dikenali oleh sistem.

Atribut:

  • String[] validCommands : array yang berisi daftar perintah yang diperbolehkan (go, quit, help, look).

Method:

  • isCommand(String aString) : memeriksa apakah string tertentu merupakan perintah yang valid.

  • showAll() : menampilkan semua perintah yang dapat digunakan pemain.

Hubungan:
Digunakan oleh Parser untuk memvalidasi apakah input pemain termasuk perintah yang sah.


4. Class Parser

import java.util.Scanner;


public class Parser {

    private CommandWords commands;

    private Scanner reader;


    public Parser() {

        commands = new CommandWords();

        reader = new Scanner(System.in);

    }


    public Command getCommand() {

        System.out.print("> ");

        String inputLine = reader.nextLine();

        String word1 = null, word2 = null;

        String[] words = inputLine.split(" ");

        if (words.length > 0) word1 = words[0];

        if (words.length > 1) word2 = words[1];

        if (commands.isCommand(word1)) {

            return new Command(word1, word2);

        } else {

            return new Command(null, word2);

        }

    }


    public void showCommands() {

        commands.showAll();

    }

}

Kegunaan:
Bertanggung jawab membaca input pemain dari konsol, memecahnya menjadi kata-kata, dan menghasilkan objek Command.

Atribut:

  • CommandWords commands : referensi ke daftar perintah valid.

  • Scanner reader : objek untuk membaca input teks dari pemain.

Method:

  • Parser() : konstruktor yang menginisialisasi objek CommandWords dan Scanner.

  • getCommand() : membaca satu baris input, memisahkan kata pertama dan kedua, lalu membuat objek Command.

  • showCommands() : menampilkan semua perintah yang valid.

Hubungan:
Dipanggil oleh Game untuk mendapatkan input pemain dalam bentuk objek Command.


5. Class Game

public class Game {

    private Parser parser;

    private Room currentRoom;


    public Game() {

        createRooms();

        parser = new Parser();

    }


    private void createRooms() {

        Room gate, hallway, lab, office;


        gate = new Room("You are standing at the university gate. The air smells like coffee and deadlines.");

        hallway = new Room("You are in the main hallway. Posters of past tech fairs line the walls.");

        lab = new Room("You enter the computer lab. The monitors glow silently in the dark.");

        office = new Room("You step into the admin office. Papers and cables are everywhere — chaos reigns.");


        // set exits

        gate.setExits(null, hallway, lab, null);

        hallway.setExits(null, null, null, gate);

        lab.setExits(gate, office, null, null);

        office.setExits(null, null, null, lab);


        currentRoom = gate;

    }


    public void play() {

        printIntro();

        boolean finished = false;

        while (!finished) {

            System.out.println("\n" + currentRoom.getDescription());

            System.out.println(currentRoom.getExitString());

            Command command = parser.getCommand();

            finished = processCommand(command);

        }

        System.out.println("Thanks for playing World of Zuul. See you, adventurer!");

    }


    private void printIntro() {

        System.out.println("Welcome to World of Zuul!");

        System.out.println("A thrilling (and slightly buggy) text adventure by Safa.");

        System.out.println("Type 'help' if you get lost.\n");

    }


    private boolean processCommand(Command command) {

        if (command.isUnknown()) {

            System.out.println("I’m not sure what you mean...");

            return false;

        }


        String commandWord = command.getCommandWord();


        switch (commandWord) {

            case "help": printHelp(); break;

            case "go": goRoom(command); break;

            case "quit": return true;

        }


        return false;

    }


    private void printHelp() {

        System.out.println("You're wandering through campus in search of your lost laptop.");

        System.out.println("Explore each room carefully!\n");

        parser.showCommands();

    }


    private void goRoom(Command command) {

        if (!command.hasSecondWord()) {

            System.out.println("Go where?");

            return;

        }


        Room nextRoom = currentRoom.getExit(command.getSecondWord());

        if (nextRoom == null) {

            System.out.println("You bump into a wall. No path that way!");

        } else {

            currentRoom = nextRoom;

        }

    }

}

Kegunaan:
Menjadi pengendali utama permainan. Mengatur ruangan, membaca input, memproses perintah, dan menampilkan hasil ke pemain.

Atribut:

  • Parser parser : untuk membaca dan memproses input pemain.

  • Room currentRoom : menyimpan posisi pemain saat ini.

Method:

  • Game() : konstruktor yang memanggil createRooms() untuk membuat peta permainan dan menyiapkan parser.

  • createRooms() : membuat objek Room dan mengatur koneksi antar ruangan.

  • play() : menjalankan loop utama permainan hingga pemain keluar.

  • printHelp() : menampilkan daftar perintah yang bisa digunakan.

  • goRoom(Command command) : menangani perintah go dan memindahkan pemain ke ruangan yang sesuai.

Hubungan:
Merupakan pusat dari semua kelas. Menggunakan Parser, Command, dan Room untuk menjalankan seluruh mekanisme permainan.


6. Class Main

public class Main {

    public static void main(String[] args) {

        Game game = new Game();

        game.play();

    }

}

Kegunaan:
Sebagai titik awal eksekusi program. Menjalankan permainan dengan membuat objek Game dan memanggil play().

Atribut:
(Tidak memiliki atribut khusus.)

Method:

  • main(String[] args) – method utama yang dijalankan oleh Java. Membuat objek Game dan memulai permainan.

Hubungan:
Menjadi pintu masuk program dan berhubungan langsung dengan kelas Game untuk menjalankan logika utama.


D. Output



E. Kesimpulan

Dari latihan kali ini saya memahami bagaimana:

  • Menggunakan konsep OOP untuk membangun dunia permainan berbasis teks.

  • Memisahkan tanggung jawab antar kelas agar kode mudah dipelihara.

  • Menghubungkan antar ruangan menggunakan konsep reference antar objek.

  • Memproses input pemain secara dinamis menggunakan kelas Parser dan Command.

Struktur World of Zuul ini bisa dikembangkan menjadi game petualangan yang lebih kompleks, seperti menambahkan item, musuh, puzzle, atau skor pemain.



Tidak ada komentar:

Posting Komentar

Pertemuan 16 - Membuat Aplikasi CRUD Java

 Nama          : Safa Mashita  NRP            : 5025241022 Membuat Aplikasi CRUD Java - Manajemen Buku Perpustakaan Pada pertemuan ini, saya...