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

Postingan populer dari blog ini

Tugas 5 PBO C Tech Support System

Tugas 10 PBO C Text Editor

Tugas 3 PBO C Jam Masjid