Object Oriented Programming | Week 9: World of Zuul
PBO-A 2025
World of Zuul adalah sebuah game adventure sederhana berbasis text. Pada game ini, pemain adalah seseorang yang sedang berjalan-jalan di lingkungan kampus. Pemain bisa menjelajahi beberapa ruangan yang ada dengan mengetikkan perintah/command 'go <arah>'. Selain itu, terdapat pula beberapa command lain seperti 'help' untuk menampilkan bantuan dan juga 'quit' untuk keluar dari game.
Game World of Zuul kali ini dibuat dengan menggunakan bahasa pemrograman Java. Struktur program ini terdiri dari beberapa kelas utama:
- Room - Kelas ini merepresentasikan ruangan dalam dunia game. Setiap ruangan memiliki deskripsi dan empat arah keluar (utara, timur, selatan, barat). Fungsinya adalah menyimpan hubungan antar-ruangan agar pemain bisa berpindah tempat.
- Command - Kelas ini menyimpan perintah yang dimasukkan oleh pemain. Perintah terdiri dari satu kata untuk command 'help' dan 'quit', serta dua kata untuk command 'go': kata pertama (misalnya go) dan kata kedua (misalnya east). Untuk perintah yang hanya mengandung satu command, kata keduanya diabaikan dengan menginisialisasikannya dengan null. Fungsi kelas ini adalah mengirimkan data perintah ke kelas Game untuk diproses.
- CommandWords - Kelas ini berisi daftar perintah yang valid, seperti go, help, dan quit. Fungsinya memastikan bahwa perintah yang diketik pemain dikenali oleh sistem.
- Parser - Kelas ini bertanggung jawab untuk membaca input pemain dari keyboard, memisahkan kata-katanya, dan membuat objek Command. Dengan kata lain, kelas ini menjadi “penerjemah” antara teks yang diketik pemain dan perintah yang dipahami game.
- Game - Kelas utama yang menjalankan seluruh logika permainan. Fungsinya:
- Membuat dunia (ruangan-ruangan dan koneksinya). Peta kampus sederhana terdiri dari beberapa ruangan seperti outside, theater, pub, lab, dan office yang saling terhubung.
- Menampilkan informasi kepada pemain
- Menerima dan memproses perintah melalui loop utama
Room Class:
/**
* @author Muhammad Zaky Zein
* @version 2025.10.25
*/
public class Room
{
private String description;
public Room northExit;
public Room eastExit;
public Room southExit;
public Room westExit;
public Room(String description) {
this.description = description;
}
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;
}
public String getDescription() {
return description;
}
}Parser Class:
/**
* @author Muhammad Zaky Zein
* @version 2025.10.25
*/
import java.util.StringTokenizer;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Parser
{
private CommandWords commands;
public Parser() {
commands = new CommandWords();
}
public Command getCommand() {
String inputLine = "";
String word1 = null, word2 = null;
System.out.print("> ");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
inputLine = reader.readLine();
} catch(java.io.IOException exc) {
System.out.println("There was an error during reading: " + exc.getMessage());
}
StringTokenizer tokenizer = new StringTokenizer(inputLine);
if(tokenizer.hasMoreTokens()) {
word1 = tokenizer.nextToken();
}
if(tokenizer.hasMoreTokens()) {
word2 = tokenizer.nextToken();
}
if(commands.isCommand(word1)) {
return new Command(word1, word2);
} else {
return new Command(null, word2);
}
}
}CommandWords Class:
/**
* @author Muhammad Zaky Zein
* @version 2025.10.25
*/
public class CommandWords
{
private static final String[] validCommands = { "go", "quit", "help" };
public CommandWords() {}
public boolean isCommand(String str) {
for (int i = 0; i < validCommands.length; i++) {
if(validCommands[i].equals(str)) return true;
}
return false;
}
}Command Class:
/**
* @author Muhammad Zaky Zein
* @version 2025.10.25
*/
public class Command
{
private String commandWord;
private String secondWord;
public Command(String firstWord, String secondWord) {
commandWord = firstWord;
this.secondWord = secondWord;
}
public String getCommandWord() {
return commandWord;
}
public String getSecondWord() {
return secondWord;
}
public boolean isUnknown() {
return (commandWord == null);
}
public boolean hasSecondWord() {
return (secondWord != null);
}
}Game Class:
/**
* @author Muhammad Zaky Zein
* @version 2025.10.25
*/
public class Game
{
private Parser parser;
private Room currentRoom;
public Game() {
createRoom();
parser = new Parser();
}
private void createRoom() {
Room outside, theater, pub, lab, office;
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");
/**
* pub-outside-theater
* |
* lab-office
*/
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;
}
private void printWelcome() {
System.out.println();
System.out.println("Welcome to Adventure!");
System.out.println("Adventure 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.println("Exits: ");
if(currentRoom.northExit != null) System.out.println("north");
if(currentRoom.eastExit != null) System.out.println("east");
if(currentRoom.southExit != null) System.out.println("south");
if(currentRoom.westExit != null) System.out.println("west");
}
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 <direction>] - [quit] - [help]");
}
private boolean quit(Command command) {
if(command.hasSecondWord()) {
System.out.println("Quit what?");
return false;
}
return true;
}
private void goRoom(Command command) {
if(!command.hasSecondWord()) {
System.out.println("Go where?");
return;
}
String direction = command.getSecondWord();
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.println("Exits:");
if(currentRoom.northExit != null) System.out.println("north");
if(currentRoom.eastExit != null) System.out.println("east");
if(currentRoom.southExit != null) System.out.println("south");
if(currentRoom.westExit != null) System.out.println("west");
System.out.println();
}
}
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;
}
public void play() {
printWelcome();
boolean finished = false;
while(!finished) {
Command command = parser.getCommand();
finished = processCommand(command);
}
System.out.println("Thank you for playing. Good bye!");
}
}Contoh interaksi pada game World of Zuul yang telah dibuat sebagai berikut:
Demikian pembelajaran pembuatan game World of Zuul pada kesempatan kali ini. Semoga bermanfaat. Terima kasih.
Muhammad Zaky Zein
5025241148

Comments
Post a Comment