Tugas 6 PBO C World of Zuul
Tugas 6 PBO C World of Zuul
Nama : Dewangga Dharmawan
NRP : 05111940000029
Dosen : Fajar Baskoro
Grafik program World of Zuul
Class Game
/**
* Class main game. Menginisialisasikan gamenya lalu memberikan
* loop untuk membaca dan mengeksekusi command dan juga berisi kode
* yang mengimplemenkan masing-masing command yang dimasukan
*
* @author (Dewangga Dharmawan)
* @version (16/11/2020)
*/
public class Game
{
/*
* Menginisialisasikan pembaca command dan ruangan
*/
private Parser parser;
private Room currentRoom;
/*
* Menginisialisasikan game Zuul dan petanya
*/
public Game()
{
createRooms();
parser = new Parser();
}
/*
* Membuat ruangan dan hubungannya dengan ruangan lainnya.
* Serta menentukan titik start game
*/
private void createRooms()
{
//Beragam jenis ruangan dan deskripsinya
Room bedroom1, bedroom2, bathroom, midroom, near_lad, gudang, attic,
balcony ,garden, n_living, s_living, kitchen, TV_room, masterbed,
black_room;
bedroom1 = new Room("kamar tidur biru");
bedroom2 = new Room("kamar tidur jingga");
bathroom = new Room("kamar mandi");
midroom = new Room("ruang lantai atas");
near_lad = new Room("dekat tangga dan balkon atau lantai 2");
gudang = new Room("gudang atas");
attic = new Room("ruang rahasia atas");
balcony = new Room("balkon");
garden = new Room("balkon berbunga");
n_living = new Room("ruang keluarga bagian utara atau lantai 1");
s_living = new Room("ruang keluarga bagian selatan");
kitchen = new Room("dapur");
TV_room = new Room("tempat menonton TV atau ruang makan");
masterbed = new Room("kamar tidur putih");
black_room = new Room("unknown");
//Beragam hubungan antar ruangan
bedroom1.setExit("selatan", midroom);
bedroom1.setExit("portal", black_room);
bedroom2.setExit("selatan", near_lad);
bathroom.setExit("barat", midroom);
midroom.setExit("timur", bathroom);
midroom.setExit("utara", bedroom1);
midroom.setExit("barat", near_lad);
midroom.setExit("selatan", gudang);
gudang.setExit("barat", midroom);
near_lad.setExit("timur", midroom);
near_lad.setExit("utara", bedroom2);
near_lad.setExit("atas", attic);
near_lad.setExit("barat", balcony);
near_lad.setExit("selatan", garden);
near_lad.setExit("bawah", n_living);
attic.setExit("bawah", near_lad);
balcony.setExit("timur", near_lad);
garden.setExit("utara", near_lad);
n_living.setExit("atas", near_lad);
n_living.setExit("selatan", s_living);
n_living.setExit("timur", TV_room);
n_living.setExit("utara", masterbed);
TV_room.setExit("barat", n_living);
masterbed.setExit("selatan",n_living);
s_living.setExit("utara", n_living);
s_living.setExit("timur", kitchen);
kitchen.setExit("barat", s_living);
currentRoom = bedroom1;
}
/*
* Memulai permainan sampai command 'quit' atau finished
* menjadi true
*/
public void play()
{
//Menampilkan intro
printWelcome();
boolean finished = false;
while(!finished)
{
Command command = parser.getCommand();
finished = processCommand(command);
}
System.out.println("Waktunya pergi, sampai jumpa lagi.");
}
/*
* Menampilkan intro dan bantuan pertama (Tutorial singkat)
*/
private void printWelcome()
{
System.out.println();
System.out.println("Halo. Untuk mengelilingi kamarku");
System.out.println("Bisa ketik ke [Nama arah]");
System.out.println("Tekan 'bantuan' untuk bantuan");
System.out.println("Tekan 'keluar' untuk keluar dari game");
look();
}
/*
* Mengeksekusi sebuah command. Jika commandnya merupakan
* 'quit' maka kembalikan true. Jika tidak, false
*/
private boolean processCommand(Command command)
{
boolean wantToQuit = false;
//Jika command tidak valid, maka ditanyakan untuk
//Command yang valid
if(command.isUnknown())
{
System.out.println("Maksudmu?");
return false;
}
//Permisalan untuk masing-masing command
String commandWord = command.getCommandWord();
if(commandWord.equals("bantuan"))
printHelp();
else if(commandWord.equals("ke"))
goRoom(command);
else if(commandWord.equals("lihat"))
look();
else if(commandWord.equals("ambil"))
System.out.println("Take on me. Bener. Belum ada barang apa apa");
else if(commandWord.equals("keluar"))
wantToQuit = quit(command);
return wantToQuit;
}
/*
* Menampilkan bantuan jika command bertuliskan 'help'
*/
private void printHelp()
{
System.out.println("Halo, kau berada di sebagian rumahku");
System.out.println("Kata yang bisa digunakan :");
parser.showCommands();
}
/*
* Jika ada jalan keluar, maka ditampilkan dan menjadi jalan
* menuju ruangan lain. Jika tidak, maka tampilkan bahwa
* program tidak tahu lokasi tersebut
*/
private void goRoom(Command command)
{
//Mengecek apakah ada kata kedua (Ruangan)
if(!command.hasSecondWord())
{
System.out.println("Kemana?");
return;
}
//Mengambil kata kedua (Ruangan)
String direction = command.getSecondWord();
//Posisi hubungan antar ruangan
Room nextRoom = null;
if(direction.equals("utara"))
nextRoom = currentRoom.getExit("utara");
if(direction.equals("timur"))
nextRoom = currentRoom.getExit("timur");
if(direction.equals("selatan"))
nextRoom = currentRoom.getExit("selatan");
if(direction.equals("barat"))
nextRoom = currentRoom.getExit("barat");
if(direction.equals("atas"))
nextRoom = currentRoom.getExit("atas");
if(direction.equals("bawah"))
nextRoom = currentRoom.getExit("bawah");
if(direction.equals("portal"))
nextRoom = currentRoom.getExit("portal");
//Jika arah tidak ada, maka ditanyakan lagi
//Selain itu, pergi menuju ruangan berikutnya
if(nextRoom == null)
System.out.println("Tidak ada jalan keluar");
else
{
currentRoom = nextRoom;
look();
}
}
/*
* Memperkecilkan system.out.print untuk menampilkan deskripsi
* ruangan
*/
private void look()
{
System.out.println(currentRoom.getLongDescription());
}
/*
* Jika commandnya 'quit', cek apabila apakah benar-benar
* keluar atau lainnya
*/
private boolean quit(Command command)
{
//Jika ada kata kedua, return false. Jika tidak, true
if(command.hasSecondWord())
{
System.out.println("Keluar kemana?");
return false;
}
else
return true;
}
}
Class Parser
/**
* Class ini membaca input dari terminal dan mencoba
* menerjemahkannya sebagai command. Ini membuat object class
* Command yang dimasukan
*
* @author (Dewangga Dharmawan)
* @version (12/11/2020)
*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Parser
{
//Menyimpan semua command word yang valid
private CommandWords commands;
/*
* Belum diketahui apa kegunaan methode ini
* tapi mungkin berhubungan dengan enumerasi
*/
public Parser()
{
commands = new CommandWords();
}
/*
* Menampilkan sebuah display input command yang akan dibaca
*/
public Command getCommand()
{
/*
* Display input program
*/
String inputLine = "";
String word1, word2;
System.out.print("> ");
//Membaca input
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//Membaca kevalidan input (Secara teknis, bukan program)
try{
inputLine = reader.readLine();
}
catch(java.io.IOException exc)
{
System.out.println("Maaf, ada error saat membaca: " + exc.getMessage());
}
//Membuat token input
StringTokenizer tokenizer = new StringTokenizer(inputLine);
/*
* Mendapatkan kata pertam adan kedua
*/
if(tokenizer.hasMoreTokens())
word1 = tokenizer.nextToken();
else
word1 = null;
if(tokenizer.hasMoreTokens())
word2 = tokenizer.nextToken();
else
word2 = null;
/*
* Mengecek apabila kata-kata tersebut merupakan
* command word valid
*/
if(commands.isCommand(word1))
return new Command(word1, word2);
else
return new Command(null, word2);
}
/*
* Menampilkan semua command word yang valid dari Class
* CommandWords
*/
public void showCommands()
{
commands.showAll();
}
}
Class Command
/**
* Class ini mengecek apakah input yang dimasukkan valid
* dan mengecek kata pertama dan kedua
*
* @author (Dewangga Dharmawan)
* @version (12/11/2020)
*/
public class Command
{
/*
* Inisialisasi kata pertama dan kedua, jika ada
*/
private String commandWord;
private String secondWord;
/*
* Membuat object command dan mengisi salah satu atau
* kedua kata. Jika kedua kata isinya null, maka command
* ini tidak dikenal oleh program
*/
public Command(String firstWord, String secondWord)
{
commandWord = firstWord;
this.secondWord = secondWord;
}
/*
* Kata pertama di return. Jika commandnya tidak di-
* mengerti, hasilnya null
*/
public String getCommandWord()
{
return commandWord;
}
/*
* Kata kedua command ini di return. return null jika
* tidak ada kata kedua
*/
public String getSecondWord()
{
return secondWord;
}
/*
* Return true jika command tidak dimengerti
*/
public boolean isUnknown()
{
return (commandWord == null);
}
/*
* Return true jika command memiliki kata kedua
*/
public boolean hasSecondWord()
{
return (secondWord != null);
}
}
Class CommandWords
/**
* Class ini mendefinisikan semua command valid di dalam game
* dengan cara menyimpan object String command word
*
* @author (Dewangga Dharmawan)
* @version (12/11/2020)
*/
public class CommandWords
{
/*
* Array yang berisi kata-kata command yang valid
*/
private static final String validCommands[] = {
"ke", "keluar", "tolong", "lihat", "ambil"
};
/*
* Inisialisasi command word
* Masih kosong untuk sementara
*/
public CommandWords()
{
}
/*
* Menampilkan semua command valid menggunakan loop for
*/
public void showAll()
{
for(String command : validCommands)
System.out.print(command + " ");
System.out.println();
}
/*
* Mengecek apakah String yang diberikan adalah kata command
* valid. Jika tidak, maka di return false. Menggunakan loop for
*/
public boolean isCommand(String aString)
{
for(int i = 0; i < validCommands.length; i++)
{
if(validCommands[i].equals(aString))
return true;
}
return false;
}
}
Class Room
/**
* Class ini berisi lokasi-lokasi dari masing-masing room menuju
* room lainnya
*
* @author (Dewangga Dharmawan)
* @version (12/11/2020)
*/
import java.util.*;
public class Room
{
/*
* Menyimpan deskripsi ruang dan hubungan antar ruangan
*/
private String description;
private HashMap<String, Room> exits;
/*
* Membuat ruangan dan menyimpannya dalam Hashing Map
*/
public Room(String description)
{
this.description = description;
exits = new HashMap<String,Room>();
}
/*
* Mendefinisikan hubungan antar ruang dengan arah dan
* ruangan tujuan
*/
public void setExit(String direction, Room neighbor)
{
exits.put(direction, neighbor);
}
/*
* Menggerakan jalan pemain ke ruangan berikutnya
*/
public Room getExit(String direction)
{
return exits.get(direction);
}
/*
* Menampilkan hubungan yang ada dalam satu ruangan
*/
public String getExitString()
{
String returnString = "Jalan keluar:";
Set<String> keys = exits.keySet();
for(String exit : keys)
returnString += "\n" + exit;
return returnString;
}
/*
* Mengembalikan deskripsi ruangan
*/
public String getDescription()
{
return description;
}
/*
* Mengembalikan deskripsi ruangan yang lebih panjang
*/
public String getLongDescription()
{
return "Sekarang kau ada di " + description + ".\n" + getExitString();
}
}
Implementasi program (Berawal dari class Game sebagai class utama)
Halo. Untuk mengelilingi kamarku
Bisa ketik ke [Nama arah]
Tekan 'bantuan' untuk bantuan
Tekan 'keluar' untuk keluar dari game
Sekarang kau ada di kamar tidur biru.
Jalan keluar:
portal
selatan
> bantuan
Halo, kau berada di sebagian rumahku
Kata yang bisa digunakan :
ke keluar bantuan lihat ambil
> lihat
Sekarang kau ada di kamar tidur biru.
Jalan keluar:
portal
selatan
> ambil
Take on me. Bener. Belum ada barang apa apa
> ke
Kemana?
> ke selatan
Sekarang kau ada di ruang lantai atas.
Jalan keluar:
timur
barat
utara
selatan
> utara
Maksudmu?
> ke utara
Sekarang kau ada di kamar tidur biru.
Jalan keluar:
portal
selatan
> ke selatan
Sekarang kau ada di ruang lantai atas.
Jalan keluar:
timur
barat
utara
selatan
> ke selatan
Sekarang kau ada di gudang atas.
Jalan keluar:
barat
> ke barat
Sekarang kau ada di ruang lantai atas.
Jalan keluar:
timur
barat
utara
selatan
> ke barat
Sekarang kau ada di dekat tangga dan balkon atau lantai 2.
Jalan keluar:
timur
barat
utara
atas
bawah
selatan
> ke bawah
Sekarang kau ada di ruang keluarga bagian utara atau lantai 1.
Jalan keluar:
timur
utara
atas
selatan
> ke selatan
Sekarang kau ada di ruang keluarga bagian selatan.
Jalan keluar:
timur
utara
> ke timur
Sekarang kau ada di dapur.
Jalan keluar:
barat
> ke barat
Sekarang kau ada di ruang keluarga bagian selatan.
Jalan keluar:
timur
utara
> ke utara
Sekarang kau ada di ruang keluarga bagian utara atau lantai 1.
Jalan keluar:
timur
utara
atas
selatan
> ke utara
Sekarang kau ada di kamar tidur putih.
Jalan keluar:
selatan
> keluar
Waktunya pergi, sampai jumpa lagi.
Komentar
Posting Komentar