The Last Airbender - Aang

acmilan

Jumat, 15 April 2011

Pembuatan Permainan Labirin 2D Pada Telpon Gengam

 
Permainan Labirin 2Dimensi yang saya buat merupakan permainan sederhana yang dapat digunakan pada telpon genggam anda. Permainan ini yakni sebagai penguji ketangkasan para pengguna untuk menemukan jalan keluar dari sebuah titik yang dimulai dari sudut kiri atas dan berakhir pada sudut kanan bawah dengan jalan yang berliku-liku. Permainan Labirin 2Dimensi  ini merupakan permainan berbasis java yang berguna untuk menghilangkan rasa jenuh. Selain itu juga menarik dan dapat dimainkan siapa saja dan dimana saja untuk semua kalangan baik dewasa maupun anak-anak.

Selain itu pada permainan Labirin 2Dimensi ini terdapat beberapa menu yakni:
1)      Level Baru menu ini berfungsi sebagai pengaturan ulang atau meRestart permainan bisa juga disebut sebgai menu untuk mengatur ulang labirinnya tersebut tetapi masih dalam tingkat kesulitan yang sama.
2)      Pengaturan Ukuran menu ini berfungsi sebagai pengaturan tingkat kesulitan Labirin tersebut. Dalam Pengaturan Ukuran terdapat lagi dua pilihan yakni: Lebar dan Jumlah Kolom. Menu tersebut sangat saling berpengaruh antara satu sama lain yakni apabila pada lebar di tambahkan maka jumlah kolom pasti akan berkurang, dan juga sebaliknya.

Struktur Navigasi

Struktur navigasi dari aplikasi permainan Labirin 2Dimensi adalah Composite. Struktur aplikasi yang dijelaskan di bawah ini adalah merupakan struktur ketika aplikasi tersebut dijalankan.


 

Penjelasan Program

Penjelasan program labirin 2Dimensi, yakni bagaimana cara membuat aplikasi permainan ini dan  penjelasan coding didalamnya.

Project kali ini dibuat dalam softwere NetBeans IDE 6.0.1. Langkah pertama yakni kita buat project dengan nama Game_Labirin dan finish. 



setelah tampil kotak dialog diatas pilih next. kemudian akan tampil kotak dialog seperti berikut :


kemudian kita ketikkan pada Project Name : Game_Labirin, kemudian klik Finish.

Setelah proses pembuatan nama project selesai, kita kemudian kita tambahkan MIDlet . seperti gambar dibawah ini :

 
kemudian klik MIDlet dan akan tampil otak dialog MIDlet, kemudianpada MIDlet Name kita  beri nama game_labirin. Dan kotak dialognya seperti dibawah ini : 





Setelah itu kita tambahkan java Class sebanyak tiga buah, masing masing kita berinama canvas_labirin, pilih, dan pola_gambar.

gambar kotak dialog java class

setelah kita klik Java Class, maka pada Class Name kita tulis Canvas_Labirin. dan ulangi perintah tersebut sebanyak dua kali lagi dengandiberi nama masing - masing pilih, dan pola_gambar.
 
Gambar kotak dialog Java Class
 

Kemudian ketikkan kode Program nya pada masing MIDlet dan Java Class. tapi sebelum mengetikkannya pastikan semua yang ada pada kolom MIDlet dan Java Class nya telah kosong.

Kode Programdan Penjelasan Mengenai Kode Tersebut
 
Berikut adalah kode Program yang harus anda ketikkan, tapi disini saya akan langsung saja menjelaskan fungsi dari kode programtersebut.


Penjelasan Coding pada MIDlet yang diberi nama game_labirin


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class game_labirin extends MIDlet implements CommandListener {
    //memberikan atau mewariskan class canvs_labirin ke variable layar_kanvas

private canvas_labirin layar_kanvas;
   //memberikan atau mewariskan class pilh ke variable layar_pilih

private pilih layar_pilih;
   // membuat command yang akan berguna untuk keluar dari aplikasi

private Command comm_keluar = new Command("Keluar", Command.EXIT, 99);
  //membuat command yang akan berguna untuk mereset bentuk dari labirin

private Command comm_new = new Command("Reset", Command.SCREEN, 1);
  // command untuk selesai dari permainan nanti dipakai bila terjadi keslahan
private Command comm_alert = new Command("Selesai", Command.EXIT, 1);
  // command untuk masu ke screen opsion perubahan ukuran dari labirin

private Command comm_opsi = new Command("Ubah ukuran", Command.SCREEN, 1);

//Constructor dari Class game_labirin
public game_labirin() {
   
    try {
      /*membuat objek layar kanvas yang memanggil fungsi getdisplay dari
        class display yang berfungsi untuk membentuk tampilan pada layar   
       */
      layar_kanvas = new canvas_labirin(Display.getDisplay(this));
      //memasukkan comand kedalam object layar_kanvas
      layar_kanvas.addCommand(comm_keluar);
      layar_kanvas.addCommand(comm_new);
      layar_kanvas.addCommand(comm_opsi);
      //fungsi dibawah ini agar command yang dilakukan berjalan
      layar_kanvas.setCommandListener(this);
      //bila ada terjadi kesalahan maka akan menjalankan catch
    } catch(Exception e) {
        /*alert merupakan class untuk menampilkan terjadinya eror dengan mengambil
          kesalahan dari exception dengan fungsi e.getMessage() dengan type suara ERROR
          bila terjadi kesalahan maka akan ada comand SELESAI ditampilkan.
         */
      Alert errorAlert = new Alert("error",
           e.getMessage(), null, AlertType.ERROR);
      errorAlert.setCommandListener(this);
      errorAlert.setTimeout(Alert.FOREVER);
      errorAlert.addCommand(comm_alert);
      Display.getDisplay(this).setCurrent(errorAlert);
    }
  }
//Start aplikasi
  public void startApp() throws MIDletStateChangeException {
      //seleksi untuk pertama kali menampilkan object layar_kanvas pada layar
    if(layar_kanvas != null) {
      layar_kanvas.start();
    }
  }
  //Aplikasi berhenti
  public void destroyApp(boolean unconditional)
      throws MIDletStateChangeException {
      //ketika berhenti layar_kanvas di kosongkan system
    layar_kanvas = null;
    System.gc();
  }
  public void pauseApp() {
     
  }
  //di sini menentukan aksi apa saja yang di lakukan bila suatu comand dieksekusi
  public void commandAction(Command c, Displayable s) {
    /*bila comand reset di eksekusi akan 
     *menjalankan fungsi untuk merubah bentuk dari labirin
     *bila comand yang dieksekusi adalah Selesai / terjadi eror maka program
     *tidak langsung berhenti karena diberi nilai false pada destroyApp(false)
    */
     if(c == comm_new) {
      layar_kanvas.newMaze();
    } else if(c == comm_alert) {
      try {
          destroyApp(false);
          notifyDestroyed();
      } catch (MIDletStateChangeException ex) {
      }
      /*bila coman ukuran di eksekusi di jalankan maka
       * maka akan dilempar ke kelas pilih untuk melakukan perubahan
      */
            
    } else if(c == comm_opsi) {
      if(layar_pilih == null) {
          layar_pilih = new pilih(layar_kanvas);
      }
      Display.getDisplay(this).setCurrent(layar_pilih);
    } else if(c == comm_keluar) {
      try {
         destroyApp(false);
         notifyDestroyed();
      } catch (MIDletStateChangeException ex) {
      }
    }
  }
 
}


Penjelasan Coding pada Java Class yang diberi nama Canvas_Labirin

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class canvas_labirin extends Canvas {
  private Display layar;
  private pola_gambar garis;
  private boolean gameover = false;
  private int area;
  private int x1;
  private int x2;
  private int x = 0;
  private int y = 0;
  private int yy;
  private int xx;
  private int yyh;
  private int xxw;
  private int Ox = 1;
  private int Oy = 1;
  private int Px = 1;
  private int Py = 1;
 
  //menset lebar colom
  int setColWidth(int colWidth) {
    if(colWidth < 2) {
      area = 2;
    } else {
      area = colWidth;
    }
    xx = getWidth() / area;
    if(xx % 2 == 0) {
      xx -= 1;
    }
    yy = getHeight() / area;
    if(yy % 2 == 0) {
      yy -= 1;
    }
    garis = null;
    return(xx);
  }
  //mendapatkan nilai minimal lebar kolom
  int getMinColWidth() {
    return(x2);
  }
  //mendapatkan nilai maximal lebar kolom
  int getMaxColWidth() {
    return(x1);
  }
  //mendapatkan nilai maximum jml kolom
  int getMaxNumCols() {
    return(yyh);
  }
  //mendapatkan leabr kolom yang sedang dipakai.
  int getColWidth() {
    return(area);
  }
  //mendapatkan nilai jumlah kolom
  int getNumCols() {
    return(xx);
  }
  //untuk menyesuaikan dengan layar lebar dan tinggi
  public canvas_labirin(Display d) throws Exception {
    layar = d;
    int width = getWidth();
    int height = getHeight();
     area = 5;
    x2 = 3;
    yyh = width / x2;
    if(yyh % 2 == 0) {
      yyh -= 1;
    }
    xx = width / area;
    if(xx % 2 == 0) {
      xx -= 1;
    }
    yy = height / area;
    if(yy % 2 == 0) {
      yy -= 1;
    }
    xxw = 15;
    x1 = width / xxw;
    if(x1 > height / xxw) {
      x1 = height / xxw;
    }
     if(x1 < area) {
      throw(new Exception("error"));
    }
  }
  //untuk menampilkan labirin yang pertama.
  void start() {
    layar.setCurrent(this);
    repaint();
  }
  //untuk membuat labirin yang baru 
  void newMaze() {
    gameover = false;
    garis = null;
    Px = 1;
    Py = 1;
    Ox = 1;
    Oy = 1;
    layar.setCurrent(this);
    repaint();
  }
  /*untuk melakukan penggambaran labirin dan hasil yang akan di di tampilkan
   * seperti "segitu doank? lanjutin lagi ke lv tinggi donk" ketika permainan
     berakhir
  */
   protected void paint(Graphics g) {
    if(garis == null) {
      int width = getWidth();
      int height = getHeight();
      garis = new pola_gambar(xx, yy);
      for(int i = 0; i < xx; i++) {
  for(int j = 0; j < yy; j++) {
    if(garis.area_xy[i][j] == 0) {
      g.setColor(0,100,10);
    } else {
      g.setColor(255,255,200);
    }
    g.fillRect(x + (i*area),
         y + (j*area),
         area, area);
  }
      }
      g.setColor(0,100,10);
      g.fillRect(x + ((xx-1) * area),
     y, width, height);
      g.setColor(255,255,200);
      g.fillRect(x + ((xx-1) * area),
     y + ((yy-2) * area), width, height);
      g.setColor(0,100,10);
      g.fillRect(x,
     y + ((yy-1) * area), width, height);
    }
    g.setColor(255, 100, 150);
    g.fillRoundRect(x + (area)*Px,
        y + (area)*Py,
        area, area,
        area, area);
    if((Ox != Px) || (Oy != Py)) {
      g.setColor(255,255,200);
      g.fillRect(x + (area)*Ox,
        y + (area)*Oy,
        area, area);
    }
    if(gameover) {
      int width = getWidth();
      int height = getHeight();
      Font font = g.getFont();
      int fontHeight = font.getHeight();
      int fontWidth = font.stringWidth("segitu doank? lanjutin lagi ke lv tinggi donk");
      g.setColor(255,255,200);
      g.fillRect((width - fontWidth)/2, (height - fontHeight)/2,
           fontWidth + 2, fontHeight);
      g.setColor(255, 0, 0);
      g.setFont(font);
      g.drawString("segitu doank? lanjutin lagi ke lv tinggi dong", (width - fontWidth)/2,
       (height - fontHeight)/2,
       g.TOP|g.LEFT);
    }
  }
   /*fungsi ini untuk melakukan pembacaan key disini key yang dipaca adalah
    * key untuk melakukan pergerakan arah dan apa aja respon yang akan dilakukan
    * untuk perbahan letak objek bola dalam labirin juga di atur disini.
   */
    public void keyPressed(int keyCode) { 
    if(! gameover) {
      int action = getGameAction(keyCode);  
      switch (action) {
      case LEFT:
  if((garis.area_xy[Px-1][Py] == 1) &&
     (Px != 1)) {
    Ox = Px;
    Oy = Py;
    Px -= 2;
    repaint();
  }
  break;
      case RIGHT:
  if(garis.area_xy[Px+1][Py] == 1) {
    Ox = Px;
    Oy = Py;
    Px += 2;
    repaint();
  } else if((Px == garis.area_xy.length - 2) &&
      (Py == garis.area_xy[0].length - 2)) {
    Ox = Px;
    Oy = Py;
    Px += 2;
    gameover = true;
    repaint();
  }
  break;
      case UP:
  if(garis.area_xy[Px][Py-1] == 1) {
    Ox = Px;
    Oy = Py;
    Py -= 2;
    repaint();
  }
  break;
      case DOWN:
  if(garis.area_xy[Px][Py+1] == 1) {
    Ox = Px;
    Oy = Py;
    Py += 2;
    repaint();
  }
  break;
      }
    }
  }
}


Penjelasan Coding pada Java Class yang diberi nama pilih


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class pilih extends Form
  implements ItemStateListener, CommandListener  {
  private Command kelaur = new Command("ok", Command.EXIT, 1);
  private Gauge indikator;
  private Gauge klomindikator;
  private canvas_labirin xycanvas;
  /*membuat atau indikator lebar labirin dan indikator lebar kolom
   * dan menganbil nilai dari ukuran labirin sebelumnya
  */
  public pilih(canvas_labirin canvas) {
    super("Ubah ukuran");
    addCommand(kelaur);
    setCommandListener(this);
    xycanvas = canvas;
    setItemStateListener(this);
    indikator = new Gauge("Lebar Labirin", true,
           xycanvas.getMaxColWidth(),
           xycanvas.getColWidth());
    klomindikator = new Gauge("Jumlah kolom", false, 
             xycanvas.getMaxNumCols(),
             xycanvas.getNumCols());
    append(indikator);
    append(klomindikator);
  }
  /*dibawah ini merupakan interface dari ItemStateListener yang berkerja
   * di bawah Class Form.
   * dan fungsinya adalah untuk mendapatkan informasi dari perubahan yang akan
   * dilakukan dan lv yang akan di ubah
   */
   public void itemStateChanged(Item item) {
    if(item == indikator) {
      int val = indikator.getValue();
      if(val < xycanvas.getMinColWidth()) {
  indikator.setValue(xycanvas.getMinColWidth());
      } else {
  int numCols = xycanvas.setColWidth(val);
  klomindikator.setValue(numCols);
      }
    }
  }

  /*ketika comand OK dieksekusi maka akan kembali ke game dan sebelumnya meload
   *labirin dengan ukuran yang terbaru ke game.
  */
  public void commandAction(Command c, Displayable s) {
    if(c == kelaur) {
      xycanvas.newMaze();
    }
  }
}


Penjelasan Coding pada Java Class yang diberi nama pola_gambar


import java.util.Random;
import java.util.Vector;

public class pola_gambar {
  private Random acak_acak = new Random();
  int[][] area_xy;
 
  public pola_gambar(int width, int height) {
    area_xy = new int[width][height];
    for(int i = 1; i < width - 1; i++) {
      for(int j = 1; j < height - 1; j++) {
  if((i % 2 == 1) || (j % 2 == 1)) {
    area_xy[i][j] = 1;
  }
      }
    }
    area_xy[0][1] = 1;
    createMaze();
  }
  /*pembuatan awal maze dari penyesuain area labirin yang didapat dari nilai hasil random
   * fungsi getRandomInt(int uper).
  */
   private void createMaze() {
    for(int i = 1; i < area_xy.length - 1; i++) {
      for(int j = 1; j < area_xy[i].length - 1; j++) {
  if((i + j) % 2 == 1) {
    area_xy[i][j] = 0;
  }
      }
    }
    for(int i = 1; i < area_xy.length - 1; i+=2) {
      for(int j = 1; j < area_xy[i].length - 1; j+=2) {
  area_xy[i][j] = 3;
      }
    }
    Vector possibleSquares = new Vector(area_xy.length
          * area_xy[0].length);
    int[] startSquare = new int[2];
    startSquare[0] = getRandomInt(area_xy.length / 2)*2 + 1;
    startSquare[1] = getRandomInt(area_xy[0].length / 2)*2 + 1;
    area_xy[startSquare[0]][startSquare[1]] = 2;
    possibleSquares.addElement(startSquare);
    while(possibleSquares.size() > 0) {
      int chosenIndex = getRandomInt(possibleSquares.size());
      int[] chosenSquare = (int[])possibleSquares.elementAt(chosenIndex);
      area_xy[chosenSquare[0]][chosenSquare[1]] = 1;
      possibleSquares.removeElementAt(chosenIndex);
      link(chosenSquare, possibleSquares);
    }
    possibleSquares = null;
    System.gc();
  }
  /*untuk menentukan jalur yang aad di labirin untuk menuju ke tujuan
   * disini juga pembuatan dinding labirin seutuhnya.
  */
   private void link(int[] chosenSquare, Vector possibleSquares) {
    int linkCount = 0;
    int i = chosenSquare[0];
    int j = chosenSquare[1];
    int[] links = new int[8];
    if(i >= 3) {
      if(area_xy[i - 2][j] == 1) {
  links[2*linkCount] = i - 1;
  links[2*linkCount + 1] = j;
  linkCount++;
      } else if(area_xy[i - 2][j] == 3) {
  area_xy[i - 2][j] = 2;
  int[] newSquare = new int[2];
  newSquare[0] = i - 2;
  newSquare[1] = j;
  possibleSquares.addElement(newSquare);
      }
    }
    if(j + 3 <= area_xy[i].length) {
      if(area_xy[i][j + 2] == 3) {
  area_xy[i][j + 2] = 2;
  int[] newSquare = new int[2];
  newSquare[0] = i;
  newSquare[1] = j + 2;
  possibleSquares.addElement(newSquare);
      } else if(area_xy[i][j + 2] == 1) {
  links[2*linkCount] = i;
  links[2*linkCount + 1] = j + 1;
  linkCount++;
      }
    }
    if(j >= 3) {
      if(area_xy[i][j - 2] == 3) {
  area_xy[i][j - 2] = 2;
  int[] newSquare = new int[2];
  newSquare[0] = i;
  newSquare[1] = j - 2;
  possibleSquares.addElement(newSquare);
      } else if(area_xy[i][j - 2] == 1) {
  links[2*linkCount] = i;
  links[2*linkCount + 1] = j - 1;
  linkCount++;
      }
    }
    if(i + 3 <= area_xy.length) {
      if(area_xy[i + 2][j] == 3) {
  area_xy[i + 2][j] = 2;
  int[] newSquare = new int[2];
  newSquare[0] = i + 2;
  newSquare[1] = j;
  possibleSquares.addElement(newSquare);
      } else if(area_xy[i + 2][j] == 1) {
  links[2*linkCount] = i + 1;
  links[2*linkCount + 1] = j;
  linkCount++;
      }
    }
    if(linkCount > 0) {
      int linkChoice = getRandomInt(linkCount);
      int linkX = links[2*linkChoice];
      int linkY = links[2*linkChoice + 1];
      area_xy[linkX][linkY] = 1;
      int[] removeSquare = new int[2];
      removeSquare[0] = linkX;
      removeSquare[1] = linkY;
      possibleSquares.removeElement(removeSquare);
    }
  }
  //untuk melakukan random nilai yang digunakan untuk pembuatan labirin agar tidak beraturan
  public int getRandomInt(int upper) {
    int retVal = acak_acak.nextInt() % upper;
    if(retVal < 0) {
      retVal += upper;
    }
    return(retVal);
  }
}


Menjalankan Aplikasi

Setelah semuanya selesai kita ketikkan ke dalam MIDlet dan Java Class, setelah itu Proses yang terakhir yaituProses Menjalankannya. Untuk Proses Menjalankannya kita Klik icon Run pada menu Bar. atau bisa dengan menekan tombol F6.


dan setelah memastikan bahwa pada program tersebut tidak ada yang ERROR, maka barulah akan muncul tampilannya, seperti sebagai berikut :


Gambar Tampilan awal

Pada saat Proses Permainan
 
 Pada saat menekan button Menu
 
 Gambarpada saat  Masuk kedalam Menu Ubah Ukuran
 
 
Gambar Pada Saat Menyelesaikan Perrmainan


Demikianlah Proses Pembuatan Game Labirin 2D, Dengan Menggunakan J2ME.
Sebagai referensi penulis menggunakan buku :



DAFTAR PUSTAKA

Shalahuddin, M dan Rosa A.S. 2008. Pemrograman J2ME. Bandung: Informatika.
Hidayat, Wahyu Nur dan Drs. Azhari S.N,M.T. 2009. Tutorial Pemrograman Mobile. Yogyakarta : Gava Media.
Irawan. 2009. 12 Aplikasi Java Mobile. Palembang: Maxikom
Kuntarto, Niknik M. 2008. Cermat dalam Berbahasa Teliti dalam Berpikir. Jakarta:Mitra Wacana Media.
 

Pengikut gw

kursor