Tower Hanoi merupakan sebuah game untuk mengasah logika, ditemukan pertamakali oleh Édouard Lucas, ahli matematika Perancis pada tahun 1883. Game ini terdiri atas tiga buah tiang dan sejumlah cakram dengan ukuran berbeda-beda yang bisa dimasukkan ke tiang. Game ini dimulai dengan cakram-cakram yang tertumpuk rapi berurutan berdasarkan ukurannya dalam salah satu tiang, cakram terkecil diletakkan di posisi paling dan cakram yang berukuran paling besar berada pada posisi paling bawah, sehingga jika dilihat membentuk sebuah kerucut.
Tujuan dari game 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.
Menara Hanoi ini sering digunakan dalam penelitian psikologis dalam hal pemecahan masalah. Selain itu, juga sering digunakan dalam pengajaran algorima rekursif bagi pelajar pemrograman. Permainan ini juga digunakan sebagai ujian ingatan oleh ahli psikolog syaraf dalam berupaya mengevaluasi amnesia.
Mari kita lihat contoh permainan Hanoi Tower dengan tiga keping.
Sebut tiga tiang yang ada masing-masing dengan tiang pertama, tiang kedua dan tiang ketiga. Pada tiang pertama terdapat tiga keping, yaitu keping putih, keping hitam dan keping merah. Ukuran keping putih terbesar dan berada pada bagian terbawah. Keping merah terkecil dan berada pada bagian teratas. Sekarang pindahkan tiga keping tersebut dari tiang pertama ke tiang ketiga, dengan aturan main:
1. Keping di bawah harus lebih besar dari keping di atas.
2. Keping dipindah satu per satu
3. Tiang kedua bisa digunakan sebagai tiang sementara
Gambar di atas memperlihatkan proses perpindahan keping dari tiang pertama ke tiang ketiga.
1. Keping merah dipindah ke tiang ketiga
2. Keping hitam dipindah ke tiang kedua
3. Keping merah dipindah ke tiang kedua.
4. Keping putih dipindah ke tiang ketiga
5. Keping merah dipindah ke tiang pertama
6. Keping hitam dipindah ke tiang ketiga
7. Keping merah dipindah ke tiang ketiga
Selesai, Anda Menang. Jumlah langkah untuk memindahkan tiga keping dari tiang pertama ke tiang ketiga adalah 2 pangkat 3 dikurangi 1, yaitu 8-1=7 langkah.
Cara terbaik untuk mencoba permainan Hanoi Tower adalah pembaca memiliki permainan Hanoi Tower dan mencoba langkah-langkah di atas tersebut. Pembaca bisa membeli permainan Hanoi Tower di Omochatoys dan distributornya.
Di situs ini, pembaca bisa mencoba permainan Hanoi Tower secara online. Klik menu Hanoi Tower Game, akan keluar tampilan seperti gambar di bawah. Melalui menu dropdown pembaca bisa merubah banyaknya keping dari 3 sampai 7. Default jumlah keping adalah 5.
Ada dua jenis Hanoi Tower yang Omochatoys produksi, yaitu keping bundar dan keping segi empat. Masing-masing terdiri dari sepuluh tumpuk keping. Sudah tentu cat yang digunakan adalah cat non-toxic water based.
Java Source Code Towers of Hanoi:
import java.awt.*;
import javax.swing.*;
import no.geosoft.cc.graphics.*;
/**
* G demo program. Demonstrates:
*
* <ul>
* <li>A sample game application
* <li>Graphics animation
* <li>GObject reparenting
* </ul>
*
* @author <a href="mailto:jacob.dreyer@geosoft.no">Jacob Dreyer</a>
*/
public class Demo14 extends JFrame
{
private TowersOfHanoi towersOfHanoi_;
private GWindow window_;
private Peg[] pegs_;
private int nDiscs_;
private JButton startButton_;
public Demo14 (int nDiscs)
{
super ("G Graphics Library - Demo 14");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
nDiscs_ = nDiscs;
// Create the graphic canvas
window_ = new GWindow (new Color (200, 230, 200));
getContentPane().add (window_.getCanvas());
// Create scene
GScene scene = new GScene (window_);
double w0[] = {0.0, 0.0, 0.0};
double w1[] = {4.0, 0.0, 0.0};
double w2[] = {0.0, nDiscs_ * 2, 0.0};
scene.setWorldExtent (w0, w1, w2);
// Add title object and add to scene
scene.add (new Title());
// Create the 3 pegs and add to the scene
int nPegs = 3;
pegs_ = new Peg[nPegs];
for (int i = 0; i < nPegs; i++) {
pegs_[i] = new Peg (i + 1.0);
scene.add (pegs_[i]);
}
// Create the discs and add to the first peg
for (int i = 0; i < nDiscs; i++) {
Disc disc = new Disc ((double) (nDiscs - i) / nDiscs);
disc.setPosition (1.0, i);
pegs_[0].add (disc);
}
pack();
setSize (new Dimension (500, 500));
setVisible (true);
// Create the puzzle and execute the solution
towersOfHanoi_ = new TowersOfHanoi();
towersOfHanoi_.solve();
}
public void discMoved (int source, int destination)
{
// This is the disc to move
Disc disc = (Disc) pegs_[source].getChild (pegs_[source].getNChildren()-1);
double y0 = disc.getY();
double y1 = nDiscs_ + 4.0;
double x0 = pegs_[source].getX();
double x1 = pegs_[destination].getX();
// Animate vertical up movement
double step = 0.2;
double y = y0;
while (y < y1) {
disc.setPosition (x0, y);
disc.redraw();
window_.refresh();
y += step;
}
// Reparent peg
pegs_[source].remove (disc);
pegs_[destination].add (disc);
// Animate horizontal movement
step = 0.05;
double x = x0;
while (x != x1) {
disc.setPosition (x, y);
disc.redraw();
window_.refresh();
x += (x1 > x0 ? step : -step);
if (Math.abs (x - x1) < 0.01) x = x1;
}
// Animate vertical down movement
step = 0.2;
y = y1;
y1 = pegs_[destination].getNChildren() - 1;
while (y > y1) {
if (Math.abs (y - y1) < 0.01) y = y1;
disc.setPosition (x, y);
disc.redraw();
window_.refresh();
y -= step;
}
}
/**
* Graphics object for canvas title.
*/
class Title extends GObject
{
private GSegment anchor_;
public Title()
{
GStyle style = new GStyle();
style.setLineStyle (GStyle.LINESTYLE_INVISIBLE);
style.setForegroundColor (new Color (100, 100, 200));
style.setFont (new Font ("serif", Font.PLAIN, 36));
setStyle (style);
anchor_ = new GSegment();
addSegment (anchor_);
GText text = new GText ("Towers of Hanoi", GPosition.SOUTHEAST);
anchor_.setText (text);
}
public void draw()
{
anchor_.setGeometry (20, 20);
}
}
/**
* Graphics representation of a peg.
*/
class Peg extends GObject
{
private double x_;
private GSegment peg_;
private double[] xy_;
public Peg (double x)
{
x_ = x;
GStyle style = new GStyle();
style.setBackgroundColor (new Color (100, 100, 100));
setStyle (style);
peg_ = new GSegment();
addSegment (peg_);
xy_ = new double[] {x_ - 0.05, 0.0,
x_ - 0.05, nDiscs_ + 2,
x_ + 0.05, nDiscs_ + 2,
x_ + 0.05, 0.0,
x_ - 0.05, 0.0};
}
public double getX()
{
return x_;
}
public void draw()
{
peg_.setGeometryXy (xy_);
}
}
/**
* Graphics representation of a disc.
*/
class Disc extends GObject
{
private double size_;
private GSegment disc_;
private double x_, y_;
public Disc (double size)
{
size_ = size;
GStyle style = new GStyle();
style.setForegroundColor (new Color (255, 0, 0));
style.setBackgroundColor (new Color (255, 150, 150));
setStyle (style);
disc_ = new GSegment();
addSegment (disc_);
}
public void setPosition (double x, double y)
{
x_ = x;
y_ = y;
}
public double getY()
{
return y_;
}
public void draw()
{
double[] xy = new double[] {x_ - size_ / 2.0, y_,
x_ - size_ / 2.0, y_ + 1.0,
x_ + size_ / 2.0, y_ + 1.0,
x_ + size_ / 2.0, y_,
x_ - size_ / 2.0, y_};
disc_.setGeometryXy (xy);
}
}
/**
* Class for solving the "Towers of Hanoi" puzzle.
*/
class TowersOfHanoi
{
public void solve()
{
solve (nDiscs_, 0, 2, 1);
}
private void solve (int nDiscs, int source, int destination, int auxiliary)
{
if (nDiscs == 1)
discMoved (source, destination);
else if (nDiscs > 1) {
solve (nDiscs - 1, source, auxiliary, destination);
discMoved (source, destination);
solve (nDiscs - 1, auxiliary, destination, source);
}
}
}
public static void main (String[] args)
{
int nDiscs = 8;
Demo14 demo = new Demo14 (nDiscs);
}
}
REFERENSI di ambil dari:
- http://tutwurihandayani.wordpress.com/2009/11/01/tower-hanoi/
- http://www.omochatoys.com/index.php?option=com_content&view=article&id=459:hanoi-tower&catid=78:mainan-edukatif&Itemid=163
- http://www.proglogic.com/code/java/puzzle/towersofhanoi.php
- http://www.java2s.com/Code/Java/2D-Graphics-GUI/TowersofHanoi.htm
source code nya sptnya bagus. sdh dicoba running? :)
BalasHapus.oh belum pak, yah nanti saya coba running :)
BalasHapus2³darimana?
BalasHapus