Cara Membuat Game Sederhana Menggunakan Bahasa C (Game Puzzle)
Game Puzzle-15 Sederhana menggunakan
bahasa C

screenshot game puzzle-15
Sebenernya game ini adalah proyek untuk menuntaskan laporan
praktikum di kampus yaitu praktikum algoritma dan pemrograman I, kebetulan ja
bahasa pemrograman yang dipake bahasa C.
Saya memutuskan membuat proyek game (bukan game yang canggih
lho…sederhana banget malah…hehe..^^), karena temen – temen yang lain kebanyakan
bikin aplikasi perhitungan nilai mahasiswa, manajemen data siswa, perdagangan,
dll… Saya pikir, kalau bikin game tu kayaknya cukup menantang dan berbeda dari
yang lain. Lalu saya mencari inspirasi kemana-mana, termasuk dengan cara
browsing di internet. Entah kenapa dan bagaimana, suatu ketika, kepikiran ja
pengen bikin game puzzle-15,
kayaknya sih karena waktu itu dapet ngeliat puzzle (entah dimana tempatnya)…
Tersedia kotak Puzzle berukuran 4 × 4 yang berisikan angka –
angka dari 1 sampai 15 dan 1 buah kotak kosong, dimana angka – angka tersebut
telah ditempatkan secara acak sedemikian rupa, dimana system pengacakannya
bukan berdasarkan pengacakan tempat saja, namun menggunakan teknik pengacakan
perpindahan kotak kosong dari posisi akhir dari urutan puzzle yang
diinginkan, dimana penggunaan metode ini dimaksudkan agar posisi dan urutan
akhir yang diinginkan dapat tercapai dari posisi awal yang telah acak.
Cara memainkannya sangat mudah, tinggal menggeser-geser kotak
kosong menggunakan tombol arah (panah), sampai akhirnya semua kotak yang berisi
angka-angka terurut dengan benar, dan posisi kotak kosong berada di pojok kanan
bawah…(simpel banget kan..?!). Di game ini terdapat 3 level kesulitan yang bisa
dipilih untuk dimainkan, yaitu easy, medium, dan hard.
Dengan mengedit beberapa code pada source-code program game ini,
kita bisa menambah ukuran dari game puzzle ini (siapa tau aja, udah bosen sama
yang 4×4, trus pengen nambah tantangan jadi 10×10 mungkin…hehe…). Dan nggak
cuman ukuran aja yang bisa diubah, tingkatan level pun bisa diubah (tentunya
ngedit source-code juga….hehe — maklum, kan masih sederhana…^^).
Caranya gampang banget kok :
untuk nambah dimensi ukuran, edit yang bagian
1
|
#define fieldSize 4
|
nah, angka 4 tersebut bisa diganti sesuaikan dengan ukuran yang
diinginkan.
Untuk nambah tingkat kesulitan, edit aja bagian yang ini :
1
2
3
|
#define easy 10
#define medium 20
#define hard 30
|
Angka – angka tersebut merupakan jumlah perpindahan kotak kosong
dari posisi akhir yang diinginkan. angka – angka tersebut diatas, bisa diganti
sesuai dengan yang diinginkan, semakin besar angkanya, semakin banyak pula
perpindahan yang dilakukan, dan semakin sulit untuk diselesaikan.
source-code :
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#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;
}
}
}
0 komentar