Senin, 23 Mei 2011

Tugas Game

PUZZLE ANGKA

Game ini dipilih sebagai game yang dianggap bisa mengasah otak, dapat dimainkan oleh siapa saja, simpel/sederhana, tidak hilang oleh zaman, dan dapat dibuat dengan berbagai bahasa pemrograman, mulai dari bahasa pemrograman sederhana hingga bahasa pemrograman berbasis object.

Tujuan permainan : mengurutkan 15 angka dalam 16 kotak yang tersedia seperti matriks 4 x 4, dimana satu kotak dijadikan sebagai kotak pertukaran .

Aturan main
• Terdiri dari 15 angka dalam 16 kotak (4 x 4)
• Angka awal masih teracak, permainan terdiri dari 3 tingkat kesulitan ;
1. Easy
2. Medium
3. Hard
• Game ini memiliki ketentuan yang lebih spesifik lagi, misalnya ; waktu .

Cara memainkannya :
• Susun atau urutkan angka-angka dalam 16 kotak tersebut
• Pengurutan angka disusun ke samping kanan
• Untuk memindahkan/menukar angka tersebut, gunakan panah pada keyboard (hanya bisa ke kiri-kanan dan atas-bawah)
• Permainan berakhir ketika semua angka terurut dan kotak penukar berada di pojok kanan bawah



Algoritma permainan :
 Lihat angka yang disediakan sesuai tingkat kesulitan permainanv
 Urutkan angka-angka tersebutv
 Geser angka tersebut dengan kotak penukar sampai angka-angka tersebut terurut dan kotak penukar berada di pojok kanan bawah, dan .. horeeee menangg !!!!!!!!!!!!!!!!!!!!!!!v

BEST CASE
a. Urutkan empat angka terdepan dimana empat angka tersebut terurut
b. Kemudian tempatkan empat angka terdepan tersebut pada tempatnya dengan menggeser satu-persatu
c. Ulangi langkah tersebut untuk angka selanjutnya

BATASAN
Yang menjadi batasan pertama dalam permainan ini, apabila kotak kosong yang menjadi penukar berada di tepi kotak, maka kotak kosong tersebut tidak bisa berpindah ke tepi seberangnya .
Kedua, kotak penukar hanya bisa bergeser satu kotak (tidak mungkin lebih dari satu kotak)

Kesimpulannya :
Manusia lebih bisa mengingat sesuatu dalam bentuk gambar dan warna, jadi alangkah baiknya bila permainan tersebut ditampilkan dalam perpaduan warna dan gambar yang lebih menarik, agar permainan tersebut tidak membosankan . Bisa juga ditampilkan dalam bahasa pemrograman Visual Basic dan Visual Prolog . Dan agar lebih menantang pemain, diberikan limit waktu untuk menyelesaikan permainan ini .
Dan yang menjadi kekurangan dalam game ini adalah tidak adanya score yang dimuat pada permainan ini, jadi game ini bisa disebut game sederhana, masih ada penyempurnaan dari game ini.



LISTING PROGRAM


LISTING PROGRAM

/*
* File : puzzle.c
*/

#include 
#include 
#include 

#define atas 1
#define kiri 2
#define bawah 3
#define kanan 4

#define keyUp 0x048
#define keyDown 0x050
#define keyLeft 0x04b
#define keyRight 0x04d

#define true 1
#define false 0

#define easy 10
#define medium 20
#define hard 30

#define caption " ----------------\n// GAME PUZZLE //\n----------------\n"

#define fieldSize 4

char field[fieldSize][fieldSize];
char field2[fieldSize][fieldSize];
unsigned int seed;
int x, y;

int acak(int i);
void initField(int movement);
void move(int arah);
void generateOutput();
int cekUrut();

int acak(int i) {
int a;
seed += 5;
srand(seed);

a = (rand() % i) + 1;

return(a);
}

void initField(int movement) {
int arah, arahOld = -1, nPindah = movement, xOld, yOld;
int c = 1, i, j;
char temp;

srand(time(NULL));
seed = rand();
x = y = (fieldSize - 1);

for (i = 0; i <= (fieldSize - 1); i++) {
for (j = 0; j <= (fieldSize - 1); j++) {
field[i][j] = field2[i][j] = c;
c++;
}
}
field[fieldSize - 1][fieldSize - 1] = field2[fieldSize - 1][fieldSize - 1] = ' ';

c = 0;
while (c != nPindah) {
xOld = x;
yOld = y;
arah = acak(4);

if (arah != 0) {
if ( c != 0) {
if ((arah + 2) % 4 == arahOld) {
continue;
}
}

switch (arah) {
case atas :
if (y > 0) y--;
else continue;
break;
case kiri:

if (x > 0) x--;
else continue;
break;
case kanan :
if (x < fieldSize - 1) x++;
else continue;
break;
case bawah :
if (y < fieldSize - 1) y++;
else continue;
break;
default :
break;
}

if (x >= 0 && y >= 0 && x <= (fieldSize - 1) && y <= (fieldSize - 1)) {
temp = field[y][x];
field[y][x] = field[yOld][xOld];
field[yOld][xOld] = temp;

c++;
arahOld = arah % 4;
} else {
x = xOld;
y = yOld;
}
}
}
}

void move(int arah) {
int xOld, yOld;
char temp;

xOld = x;
yOld = y;

switch (arah) {
case atas :
if (y > 0) y--;
break;
case kiri:
if (x > 0) x--;
break;
case kanan :
if (x < (fieldSize - 1)) x++;
break;
case bawah :
if (y < (fieldSize - 1)) y++;
break;
default :
break;
}

if (x >= 0 && y >= 0 && x <= (fieldSize - 1) && y <= (fieldSize - 1)) {
temp = field[y][x];
field[y][x] = field[yOld][xOld];
field[yOld][xOld] = temp;


} else {
x = xOld;
y = yOld;
}
generateOutput();
}

void generateOutput() {
int i, j, k;
clrscr();
puts(caption);
puts("Tekan ESC untuk keluar / reset permainan...");
for(k = 1; k <= fieldSize; k++) printf("+----"); puts("+");

for (i = 0; i<=(fieldSize - 1); i++) {
for (j= 0; j<=(fieldSize - 1); j++) {
if (i == y && j == x) {
printf("| %c ", field[i][j]);
} else {
printf("| %2i ", field[i][j]);
}
}
puts("|");

for(k = 1; k <= fieldSize; k++) printf("+----"); puts("+");
}
}

int cekUrut() {
int c, d;
int match = true;

for (c = 0; c <= (fieldSize - 1); c++) {
for (d = 0; d <= (fieldSize - 1); d++) {
if (field[c][d] != field2[c][d]) {
if (match == true) {
match = false;
}
}
}
}
return(match);
}

main() {
int i, j, k, level;
char key;

system("cls");
puts(caption);
puts("Mainkan puzzle dan menyusunnya menjadi urutan yang benar...");
puts("Geser kotak kosong sehingga menjadi berurutan sbg berikut : \n");
initField(0);



for(k = 1; k <= fieldSize; k++) printf("+----"); puts("+");
for (i = 0; i<=(fieldSize - 1); i++) {
for (j= 0; j<=(fieldSize - 1); j++) {
if (i == y && j == x) {
printf("| %c ", field2[i][j]);
} else {
printf("| %2i ", field2[i][j]);
}
}
puts("|");

for(k = 1; k <= fieldSize; k++) printf("+----"); puts("+");
}
puts("Gunakan tombol panah untuk menggeser kotak kosong...\n");
puts("Tekan sembarang tombol untuk melanjutkan...");
getch();
for(;;) {
system("cls");
puts("Level : ");
puts("\t1. Easy");
puts("\t2. Medium");
puts("\t3. Hard");
printf("Pilih Level yang akan dimainkan : ");
scanf("%i", &level);

switch (level) {
case 1 :
initField(easy);
break;
case 2 :
initField(medium);
break;
case 3 :
initField(hard);
break;
default :
puts("Level salah!!");
getch();
continue;
}

system("cls");

generateOutput();

while ((key = getch()) != 27) {
switch(key) {
case keyUp :
move(atas);
break;
case keyDown :
move(bawah);
break;
case keyLeft :
move(kiri);
break;
case keyRight :
move(kanan);
break;
}
if (cekUrut() == true) {
puts("\nANDA MENANG!!!");


break;
}
}
if (key == 27) {
printf("Apakah anda ingin keluar ?\n['y' utk keluar / 't' utk reset] : ");
if (toupper(getchar()) == 'Y') break;
else continue;
} else {
printf("Apakah anda ingin main lagi ? [y/t] : ");
if (toupper(getchar()) == 'T') {
puts("\nTerima Kasih Telah Mencoba!!!");
getch();
break;
}
else continue;
}
}
}


TAMPILAN OUTPUT