• Tidak ada hasil yang ditemukan

Implementasi Struktur Data Stack (Tumpukan) dalam Tower of Hanoi Game

N/A
N/A
Protected

Academic year: 2021

Membagikan "Implementasi Struktur Data Stack (Tumpukan) dalam Tower of Hanoi Game"

Copied!
10
0
0

Teks penuh

(1)
(2)

Implementasi Struktur Data Stack

(Tumpukan) dalam Tower of Hanoi Game

Oleh: Adnan w Anadrep

Selamat datang di tutorial ini, kali ini saya akan memberikan tutorial

tentang pengimplementasian struktur data stack (tumpukan) dalam

sebuah game. Game yang saya angkat kali ini adalah game tower of hanoi.

Selamat datang di tutorial ini, kali ini saya akan memberikan tutorial tentang pengimplementasian struktur data stack (tumpukan) dalam sebuah game. Game yang saya angkat kali ini adalah game tower of hanoi.

The Tower of Hanoi (juga disebut Menara Brahma atau Lucas 'Tower) adalah permainan

matematika atau teka-teki. Ini terdiri dari tiga batang, dan sejumlah piringan dengan ukuran yang berbeda yang dapat berpindah ke batang lainnya. Teka-teki dimulai dengan tumpukan piringan dalam urutan ukuran pada satu batang, yang terkecil di bagian atas, sehingga membuat bentuk kerucut. Tujuan dari teka-teki adalah untuk memindahkan seluruh tumpukan ke batang lain, dan harus mematuhi aturan sederhana berikut ini:

Hanya satu piringan dapat dipindahkan pada satu kali langkah.

1.

Setiap langkah terdiri dari mengambil satu piringan paling atas dari salah satu tumpukan dan

2.

meletakkannya di paling atas tumpukan lain yaitu piringan hanya dapat dipindahkan jika piringan ada di paling atas suatu tumpukan.

Tidak ada piringan yang dapat ditempatkan di atas piringan yang lebih kecil.

3.

Sedangkan algoritma yang kita gunakan dalam membuat game ini adalah algoritma Stack (tumpukan) dalam teori Struktur Data. Stack (tumpukan) adalah salah satu model struktur data yang tersusun secara LIFO (Last In First Out) dimana penyisipan elemen selalu dilakukan di atas (TOP) dan penghapusan elemen selaku dilakukan pada TOP. Stack disini diimplementasikan dengan single link

list dinamis.

Dalam membuat game ini, saya menggunakan tipe data ADT (Abstract Data Type). Abtract Data Type merupakan suatu konsep pemrograman yang terkait dengan pendefinisian TYPE dan kumpulan

PRIMITIF terhadap TYPE tersebut. TYPE dapat dikatakan sebagai hasil proses Abstraksi awal data dari

permasalahan (studi kasus) yang sedang dihadapi. Sedangkan PRIMITIF adalah operasi dasar terhadap TYPE tersebut.

(3)

lakukan adalah membuat file header.h untuk membuat spesifikasi yang dibutuhkan dalam game ini. Spesifikasi yang harus kamu buat adalah:

Infotype (info suatu elemen, dalam hal ini bertipe integer)

● Elemen stack ● Stack ● #ifndef HEADER_H_INCLUDED #define HEADER_H_INCLUDED

// definisikan properti dari list biar lebih mudah dibaca #define Info(P) (P)->Info

#define Next(P) (P)->Next #define Top(S) (S).Top #define Max(S) (S).Max #define Count(S) (S).Count #define Nil NULL

#define bool unsigned short int #define False 0

#define True !False #include <stdio.h> #include <stdlib.h> #include <conio.h>

// ini adalah infotype yang ada pada elemen typedef int InfoType;

// membuat elemen stack untuk single link list typedef struct tElmStack *Address;

typedef struct tElmStack { InfoType Info; Address Next; } ElmStack; // list typedef struct { Address Top; int Count; } Stack; void CreateStack(Stack *S); // I.S. Sembarang

// F.S. Terbentuk Stack kosong bool IsEmpty(Stack S);

// Menghasilkan True jika Stack kosong, dan False jika Stack tidak kosong Address Allocate(InfoType X);

(4)

// Menghasilkan Address dari alokasi sebuah elemen dengan InfoType X

// Jika alokasi berhasil maka nilai Address tidak Nil dan jika gagal nilai Address Nil

void DeAllocate(Address P); // I.S. P terdefinisi

// F.S. Memori yang digunakan oleh P dikembalikan ke sistem void Push(Stack *S, Address P);

// I.S. Sembarang, P terdefinisi // F.S. Menempatkan P pada Top dari S void Pop(Stack *S, Address *P);

// I.S. Stack tidak kosong

// F.S. Mengambil P dari Top dari S void ViewStack(Stack S);

// I.S. Sembarang

// F.S. Menampilkan semua Info dari masing-masing elemen dari Stack void ViewVisual(Stack S[3], int TotalDisk);

// I.S. Tiga Stack, Total Disk > 0

// F.S. Menampilkan visualisasi Menara Hanoi dari 3 Stack tersebut #endif // HEADER_H_INCLUDED

Setelah selesai membuat spesifikasi program yang dibutuhkan, kini saatnya masuk ke langkah kedua yaitu pembuatan implementasi dari abstract type yang sudah dibuat. Kamu perlu membuat file baru yaitu implementasi.c. Pada file ini kamu harus mengimplementasikan prosedur dan function yang sudah kamu definisikan di file header.h yang sudah dibuat, maka kamu harus meng-include file header.h di file ini.

#include "header.h" void CreateStack(Stack *S) { Top(*S) = Nil; Count(*S) = 0; } bool IsEmpty(Stack S) {

return Top(S) == Nil; }

Address Allocate(InfoType X) {

(5)

if (P != Nil) { Info(P) = X; Next(P) = Nil; } return P; } void DeAllocate(Address P) { free(P); }

void Push(Stack *S, Address P) {

Next(P) = Top(*S); Top(*S) = P;

Count(*S)++; }

void Pop(Stack *S, Address *P) { *P = Top(*S); Top(*S) = Next(*P); Count(*S)--; } void ViewStack(Stack S) { Address P; InfoType X[Count(S)]; int i = 0;

for (P = Top(S); P != Nil; P = Next(P)) {

X[i] = Info(P); i++;

}

for (i = Count(S) - 1; i >= 0; i--) printf("%d ", X[i]);

}

void ViewVisual(Stack S[3], int TotalDisk) { int i, j, k; Address P; InfoType X[3][TotalDisk]; for (i = 0; i < 3; i++) {

for (j = 0; j < TotalDisk - Count(S[i]); j++) X[i][j] = 0;

(6)

{

X[i][j] = Info(P); j++;

} }

for (i = 0; i < TotalDisk; i++) { for (j = 0; j < 3; j++) { printf(" "); if (X[j][i] == 0) for (k = 0; k < 2 * TotalDisk - 1; k++) printf(" "); else {

for (k = 0; k < TotalDisk - X[j][i]; k++) printf(" ");

for (k = 0; k < 2 * X[j][i] - 1; k++) printf("=");

for (k = 0; k < TotalDisk - X[j][i]; k++) printf(" "); } } printf("\n"); } for (i = 1; i <= 3; i++) { printf(" "); for (j = 0; j < TotalDisk - 1; j++) printf(" "); printf("%d", i); for (j = 0; j < TotalDisk - 1; j++) printf(" "); } printf("\n"); }

fiuuhh.... Setelah selesai membuat implementasi dari abstract data type yang dibuat, kini saatnya kamu masuk ke langkah ketiga yaitu membuat driver atau main program yang kamu akan buat ini, maka kamu perlu membuat file main.c yang didalamnya adalah file utama yang akan dijalankan oleh compiler. Sebelumnya kamu harus include file header.h. Namun, ada beberapa compiler yang meminta include file implementasinya (implementasi.c). Kali ini saya include file headernya (header.h).

#include "header.h" int main()

(7)

int i;

int CMain, TotalDisk, MFrom, MTo, MCount; Address P;

// membuat 3 stack (tower) Stack Tower[3];

for (i = 0; i < 3; i++) CreateStack(&Tower[i]); // membuat menu program do

{

system("cls");

printf("================\n"); printf(" TOWER OF HANOI\n"); printf("================\n"); printf(" 1. New Game\n"); printf(" 2. Credits\n"); printf(" 3. Quit\n");

printf("================\n\n"); printf(" Your Input: ");

scanf("%d", &CMain); switch (CMain) { case 1: do { system("cls"); printf("================\n"); printf(" NEW GAME\n"); printf("================\n"); printf(" Total Disk: "); scanf("%d", &TotalDisk); if (TotalDisk <= 0) {

printf("\n Invalid input. Please input again.\n"); getch();

} }

while (TotalDisk <= 0);

// menyisipkan piringan yang telah diinput kedalam stack (tower) pertama

for (i = 0; i < TotalDisk; i++)

Push(&Tower[0], Allocate(TotalDisk - i)); // obey the rule

MCount = 0; do

(8)

system("cls"); for (i = 0; i < 3; i++) { printf("\n Tower %d: ", i + 1); ViewStack(Tower[i]); } printf("\n\n"); ViewVisual(Tower, TotalDisk);

printf("\n\n Move Count: %d\n\n", MCount); printf("\n Move From : ");

scanf("%d", &MFrom);

printf("\n To : "); scanf("%d", &MTo);

MFrom--; MTo--;

if (MFrom >= 0 && MFrom <= 2 && MTo >= 0 && MTo <= 2) { if (!IsEmpty(Tower[MFrom])) { if (IsEmpty(Tower[MTo])) { Pop(&Tower[MFrom], &P); Push(&Tower[MTo], P); MCount++; } else if (Info(Top(Tower[MTo])) > Info(Top(Tower[MFrom]))) { Pop(&Tower[MFrom], &P); Push(&Tower[MTo], P); MCount++; } else {

printf("\n Invalid move. Please input your move again.\n"); getch(); } } else {

printf("\n Invalid move. Please input move again.\n"); getch(); } } else {

printf("\n Invalid move. Please input move again.\n"); getch();

(9)

} }

while (Count(Tower[1]) != TotalDisk && Count(Tower[2]) != TotalDisk); system("cls"); for (i = 0; i < 3; i++) { printf("\n Tower %d: ", i + 1); ViewStack(Tower[i]); } printf("\n\n"); ViewVisual(Tower, TotalDisk);

printf("\n\n Move Count: %d\n", MCount); printf("\n Congratulation, you win!\n"); getch(); while (!IsEmpty(Tower[1])) { Pop(&Tower[1], &P); DeAllocate(P); } while (!IsEmpty(Tower[2])) { Pop(&Tower[2], &P); DeAllocate(P); } break; case 2: system("cls"); printf("==================================\n"); printf(" TOWER OF HANOI\n");

printf(" Copyright @ndhaperdana\n");

printf("==================================\n\n"); getch();

break; case 3:

printf("\n Thanks for playing.\n"); getch();

break; default:

printf("\n Invalid input. Please input again.\n"); getch(); } } while (CMain != 3); return 0; }

(10)

Akhirnya selesai sudah kamu membuat game ini, tinggal di compile kemudian jalankan, dan kamu bisa mencoba mengasah otak kamu dengan bermain game yang sudah kamu buat sendiri :)

Jalankan kodenya, maka akan muncul seperti ini, selamat bermain :)

Sekian tutorial dari saya :)

Tentang Penulis

Referensi

Dokumen terkait

Unit kompetensi ini harus diujikan secara konsisten pada seluruh elemen dan dilaksanakan pada pekerjaan yang sebenarnya di tempat kerja atau secara simulasi dengan situasi

Sehubungan dengan karakter akademis, pandangan lain dari Ben Agger (2003) membedakan kajian budaya sebagai gerakan teoritis, dan kajian budaya sebagai mode analisis

Tidak seperti sistem operasi lain yang hanya menyediakan satu atau 2 shell, sistem operasi dari keluarga unix misalnya linux sampai saat ini dilengkapi oleh banyak shell

Beberapa permasalahan yang teridentifikasi sehingga menyebabkan rendahnya perlindungan hukum terhadap penguasaan tanah antara lain: (i) Cakupan peta dasar pertanahan pada

Daya listrik yang disediakan oleh PLTS sebesar 5000 W untuk pemakaian selama 10 jam, menggunakan panel surya sebanyak 40 panel, daya puncak setiap panel surya 250 WP,

Di dalam tulisan ini, dipaparkan modalitas dari aspek pendefinisian, karakteristik, ragam, serta bentuk pengungkap, dan makna modalitas yang berkaitan dengan

Terjadi korelasi yang baik antara hasil analisis dengan metoda Rankine terhadap hasil pengamatan inklinometer, maka metode ini dapat dipakai dalam menganalisis pergerakan

 Secara umum,jasa konsultan juga memiliki etika dalam suatu pekerjaan profesi mereka, pemikiran, gagasan atau ketentuan yang baik dan bermoral yang dibuat dan dilaksanakan oleh