12 Mei 2010

Java Applet Tower Of Hanoi

Halo sahabat blogger.... Pada postingan saya ini, saya mau share tentang "Tower of Hanoi" pada java Applet.
Ada yang belum tau apa itu "Tower of Hanoi" atau menara hanoi??
oke... saya akan mereview sedikit tentang apa itu menara hanoi.

Menara Hanoi adalah sebuah permainan matematis atau teka-teki. Permainan ini terdiri dari tiga tiang dan sejumlah cakram dengan ukuran berbeda-beda yang bisa dimasukkan ke tiang mana saja. Permainan dimulai dengan cakram-cakram yang tertumpuk rapi berurutan berdasarkan ukurannya dalam salah satu tiang, cakram terkecil diletakkan teratas, sehingga membentuk kerucut.
Tujuan dari teka-teki ini adalah untuk memindahkan seluruh tumpukan ke tiang yang lain, mengikuti aturan berikut:
  • Hanya satu cakram yang boleh dipindahkan dalam satu waktu.
  • Setiap perpindahan berupa pengambilan cakram teratas dari satu tiang dan memasukkannya ke tiang lain, di atas cakram lain yang mungkin sudah ada di tiang tersebut.
  • Tidak boleh meletakkan cakram di atas cakram lain yang lebih kecil.

Asal 

Teka-teki ini ditemukan Édouard Lucas, ahli matematika Perancis di tahun 1883. Ada sebuah legenda tentang candi Indian yang berisi ruang besar dengan tiga tiang yang dikelilingi 64 cakram emas. Pendeta Brahma, melaksanakan tugas dari peramal di masa lalu, sesuai dengan aturan teka-teki ini. Menurut legenda ini, bila teka-teki ini diselesaikan, dunia akan kiamat. Tidak jelas benar apakah Lucas menemukan legenda ini atau terinspirasi olehnya.

Bila legenda ini benar, dan pendeta itu bisa memindahkan satu cakram tiap detik, menggunakan pemindahan paling sedikit, maka akan memakan waktu 264−1 detik atau kurang lebih 584,582 milyar tahun.

Oke, bagi teman-teman yang ingin mendemokan  permainan ini, di bawah ini adalah source codenya:
Pertama-tama, buat java class dengan nama Tower.
Selanjutnya copas semua Coding di bawah ini:

let's check at out :D



import java.awt.*;
import java.applet.*;
import java.util.*;
public class Tower extends Applet {
    TowerPanel panel;
    TowerControl control;
    public void init() {
        resize(500,450);
    setLayout(new BorderLayout());
    panel = new TowerPanel();
    add("Center", panel);
    add("South", control = new TowerControl(panel));
    }
    public void start() {
    panel.start();
    }
    public void stop() {
    panel.stop();
    }
    public boolean action(Event evt, Object arg) {
        if (arg instanceof Boolean) {
            if (((Checkbox)evt.target).getLabel().equals("Reset")) {
                panel.reset = ((Boolean)arg).booleanValue();
            } else {
                panel.reset = ((Boolean)arg).booleanValue();
            }
            return true;
        }
        return false;
    }
}
class Towering {
    int num_rings[] = new int[3];
    int top_size[] = new int[3];
    public Towering(int a){
        num_rings[0] = a;
        num_rings[1] = 0;
        num_rings[2] = 0;
        top_size[0] = 40;
        top_size[1] = 1000;
        top_size[2] = 1000;
    }
    public void reset(int b){
        num_rings[0] = b;
        num_rings[1] = 0;
        num_rings[2] = 0;
        top_size[0] = 40;
        top_size[1] = 1000;
        top_size[2] = 1000;
    }
}
class ring {
    int ring_size[] = new int[10];
    int old_x[] = new int[10];
    int which_x[] = new int[10];
    int which_y[] = new int[10];
    int order[] = new int[10];
    int which_tower[] = new int[10];

    public ring(int a){
     for(int i = 0; i<a; i++){
        ring_size[i] = 40+20*i;
        which_x[i] = 100;
        old_x[i] = which_x[i];
        which_y[i] = 400-30*(a-i);
        order[i] = a-i;
        which_tower[i] = 0;
        }
    }

    public void reset(int b){
     for(int i = 0; i<b; i++){
        ring_size[i] = 40+20*i;
        which_x[i] = 100;
        old_x[i] = which_x[i];
        which_y[i] = 400-30*(b-i);
        order[i] = b-i;
        which_tower[i] = 0;
        }
    }
}

class TowerPanel extends Panel implements Runnable{
    Thread going = null;
    int width = 500;
    int height = 400;
    int tower_height = 350;
    int tower_width = 20;
    int num_rings = 8;
    int pick_ring = 1000;
    int tempx;
    int tempy;
    boolean win = false;
    boolean reset;
    //special effect words
    String s = new String("Tower of Hanoi");
    char separated[];
    int x_coord = 0, y_coord = 0;
    Towering towers = new Towering(num_rings);
    ring rings = new ring(num_rings);
    TowerPanel(){

        setFont(new Font("TimesRoman",Font.BOLD,40));
        setBackground(new Color(170,170,170));
        separated = new char [s.length()];
        s.getChars(0,s.length(),separated,0);
    }
    public void paint(Graphics g) {
        //special words
        for(int i=0;i<s.length();i++)
        {
        x_coord = (int) (Math.random()*10+15*i+100);
        y_coord = (int) (Math.random()*10+36);
        g.setColor(new Color(200-10*i, 10*i, 10*i));
        g.drawChars(separated, i,1,x_coord,y_coord);
        }
        //drawing those three towers
        g.setColor(Color.red);
        g.fill3DRect(90,height-tower_height, tower_width, tower_height, true);
        g.setColor(Color.blue);
        g.fill3DRect(240,height-tower_height, tower_width, tower_height, true);
        g.setColor(Color.yellow);
        g.fill3DRect(390,height-tower_height, tower_width, tower_height, true);

        //drawing all the rings
        g.setColor(Color.black);
        for(int j=0;j<num_rings;++j){
            g.setColor(new Color(20*j+55,200-20*j,20*j+55));
            g.fill3DRect(rings.which_x[j]-rings.ring_size[j]/2, rings.which_y[j], rings.ring_size[j], 30, true);
        }
        //Congratulation
        if(win){
            g.setColor(Color.white);
            g.drawString("Congratulation!!!",150,150);
            }
    }
    public synchronized boolean mouseDown(Event evt, int x, int y) {
        for(int k=0; k<num_rings; ++k){
        if(rings.order[k] == towers.num_rings[rings.which_tower[k]]) {
        if((x>=(rings.which_x[k]-rings.ring_size[k]/2))&&(x<=((rings.which_x[k]-rings.ring_size[k]/2)+rings.ring_size[k]))){
         if((y>=rings.which_y[k])&&(y<=(rings.which_y[k]+30))){
            pick_ring = k;
        }}}}
        return true;
    }
    public synchronized boolean mouseDrag(Event evt, int x, int y) {
        if(pick_ring!=1000){
            rings.which_x[pick_ring] = x;
            rings.which_y[pick_ring] = y;
        //repaint(1,x-40,y-40,rings.ring_size[pick_ring]*5,200);
        repaint();
        }
        return true;
    }
    public synchronized boolean mouseUp(Event evt, int x, int y) {
        if(pick_ring!=1000){
            if((140>=rings.which_x[pick_ring])&&(100<=(rings.which_x[pick_ring]+rings.ring_size[pick_ring]))&&(rings.ring_size[pick_ring]<towers.top_size[0])){
              ++towers.num_rings[0];
              --towers.num_rings[rings.which_tower[pick_ring]];
              rings.which_tower[pick_ring] = 0;
              rings.which_x[pick_ring] = 100;
              rings.order[pick_ring] = towers.num_rings[0];
              rings.which_y[pick_ring] = 400-30*towers.num_rings[0];
}
            else if((280>=rings.which_x[pick_ring])&&(240<=(rings.which_x[pick_ring]+rings.ring_size[pick_ring]))&&(rings.ring_size[pick_ring]<towers.top_size[1])){
               ++towers.num_rings[1];
              --towers.num_rings[rings.which_tower[pick_ring]];
              rings.which_tower[pick_ring] = 1;
              rings.which_x[pick_ring] = 250;
              rings.order[pick_ring] = towers.num_rings[1];
              rings.which_y[pick_ring] = 400-30*towers.num_rings[1];
    }
else if((430>=rings.which_x[pick_ring])&&(390<=(rings.which_x[pick_ring]+rings.ring_size[pick_ring]))&&(rings.ring_size[pick_ring]<towers.top_size[2])){
              ++towers.num_rings[2];
              --towers.num_rings[rings.which_tower[pick_ring]];
              rings.which_tower[pick_ring] = 2;
              rings.which_x[pick_ring] = 400;
              rings.order[pick_ring] = towers.num_rings[2];
              rings.which_y[pick_ring] = 400-30*towers.num_rings[2];
    }
            else{
              rings.which_x[pick_ring] = rings.old_x[pick_ring];
              rings.which_y[pick_ring] = 400-30*towers.num_rings[rings.which_tower[pick_ring]];
    }
    }
        rings.old_x[pick_ring] = rings.which_x[pick_ring];
        pick_ring = 1000;
        //recompute the to_size for all towers
        for(int z=0;z<num_rings;++z){
            if(rings.order[z] == towers.num_rings[rings.which_tower[z]]){
                towers.top_size[rings.which_tower[z]] = rings.ring_size[z];
    }
        }
        //see if the user wins
        for(int t=0;t<3;++t){
            if((t!=0)&&(towers.num_rings[t] == num_rings)){
                win = true;
            }
            if(towers.num_rings[t] == 0){
                towers.top_size[t] = 1000;
            }
        }
        repaint();
        return true;
    }
    public void start(){
        if(going == null){
            going = new Thread(this);
            going.start();
        }
    }
    public void stop() {
        going = null;
    }
    public void run() {

        while (going!=null) {

        try {Thread.sleep(100);} catch (InterruptedException e){}

        repaint(1,0,0,500,45);

        //repaint();
    }
         going = null;
    }

    public void reset(boolean filled, int num_blocks) {
    win = false;
    num_rings = num_blocks;
    towers.reset(num_rings);
    rings.reset(num_rings);
    repaint();
    }
}

class TowerControl extends Panel {
    TextField s;
    TextField e;
    TowerPanel pa;
    public TowerControl(TowerPanel pa) {
    this.pa = pa;
    add(s = new TextField("8", 4));
    add(new Button("Reset Blocks Number"));
    }
    public boolean action(Event ev, Object arg) {
    if (ev.target instanceof Button) {
        String label = (String)arg;
        pa.reset(label.equals("Reset Blocks Number"),
      Integer.parseInt(s.getText().trim()));
        return true;
    }
    return false;
    }
}


sumber:http://web.student.tuwien.ac.at/~e9125168/javaa/jtower.html

4 komentar:

mak,, apa ni???
hebat kali si maya ni dang... ngeri ilmunya :D

malas posting: haha gag kok bang... :D
kok namanya malas posting bang??

hahaaha... inikan materi java semester 3.. :D

ukhra : haha iya... kmren iseng2 lihat lg. eh jadiin posting deh. wkwk :D

Posting Komentar