Senin, 01 Februari 2016

Source Code game ular HP-Nokia menggunakan bahasa C++

Pada kesempatan ini ane mau berbagi source code game ular monggo dicomot

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys\timeb.h>
#include <Windows.h>

/** Struktur **********/

/**
Struktur untuk menampung data tiap segment dari snake
(array)
*/
struct Segment {
int x, y;
};

/** Variabel global **********/

// Array untuk menampung data ular
struct Segment snake[2000];

// Variabel untuk menyimpan panjang ular (array snake)
int length = 0;

// Posisi makanan
int food_x, food_y;

/** Konfigurasi permainan **********/

// Arah kepala saat awal permainan
int dir = VK_RIGHT;

// Panjang segment snake saat awal permainan
int snake_size = 3;

// Kecepatan gerakan snake dalam ms
int snake_speed = 200;

// Panjang console
int console_width = 80;

// Tinggi console
int console_height = 25;

/** Fungsi-fungsi **********/

/**
Push segment ke snake (pada bagian head).
*/
void push(int x, int y) {
for (int i = length; i > 0; i--) {
snake[i] = snake[i - 1];
}
snake[0].x = x;
snake[0].y = y;
length++;
}

/**
Pop bagian ekor snake.
*/
void pop() {
length--;
}

/**
Pindahkan posisi kursor di layar
Fungsi ini spesifik untuk OS windows.
*/
void gotoxy(int x, int y) {
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

/**
Gambar snake (array) di layar
*/
void display() {
for (int i = 0; i < length; i++) {
// Cetak di posisi x,y
gotoxy(snake[i].x, snake[i].y);
printf("O");
}
}

/**
Memeriksa apakah terdapat salah satu segment
snake (array) di koordinat x,y.
Return 0 artinya tidak bertumpuk, 1 artinya bertumpuk.
*/
int check_collision(int x, int y) {
for (int i = 0; i < length; i++) {
if (snake[i].x == x && snake[i].y == y) {
return 1;
}
}
return 0;
}

/**
Taruh makanan secara acak, namun memastikan
makanan tidak bertumpuk dengan salah satu segment
snake (array)
*/
void place_food() {
// Jika makanan bertumpuk dengan salah satu segment
// snake, ulangi penempatan makanan secara acak.
do {
food_x = rand() % console_width;
food_y = rand() % console_height;
} while (check_collision(food_x, food_y) == 1);
}

/**
Program utama
*/
int main() {
// Randomize
srand(time(NULL));

// Untuk menyimpan penanda waktu saat snake bergerak
struct timeb last_timestamp;
ftime(&last_timestamp); // Set nilai awal

// Untuk menyimpan nilai
int score = 0;

// Pertama-tama, push segment (node) ke kanan
// sebanyak 3 segment (sesuai nilai variable snake_size)
for (int i = 0; i < snake_size; i++) {
push(i, 0);
}

// Tempatkan makanan secara acak
place_food();

// Game loop. Bagian di dalam while akan dieksekusi terus menerus
while (true) {
// Ambil penanda waktu saat ini
struct timeb current_timestamp;
ftime(&current_timestamp);

// Selisih waktu terakhir dengan waktu sekarang dalam ms
int interval = 1000 * (current_timestamp.time - last_timestamp.time) + (current_timestamp.millitm - last_timestamp.millitm);

// Snake bergerak setiap 200 ms (sesuai nilai variable snake_speed)
// Dihitung dengan membandingkan selisih waktu sekarang dengan waktu
// terakhir kali snake bergerak.
if (interval >= snake_speed) {          
// Tentukan posisi x,y ke mana snake akan bergerak.
// Posisi dilihat dari koordinat segment kepala (head)
// dan arah (variable dir)
int x, y;
switch (dir) {
case VK_LEFT:
x = snake[0].x - 1;
y = snake[0].y;
break;
case VK_RIGHT:
x = snake[0].x + 1;
y = snake[0].y;
break;
case VK_UP:
x = snake[0].x;
y = snake[0].y - 1;
break;
case VK_DOWN:
x = snake[0].x;
y = snake[0].y + 1;
break;
}

// Jika posisi kepala (head) menabrak tembok pembatas,
// maka permainan berakhir (keluar dari game loop)
if (x < 0 || x >= console_width || y < 0 || y >= console_height) {
break;
}

// Jika posisi kepala (head) menabrak dirinya sendiri
// (posisi sama dengan salah satu segment), maka permainan
// berakhir (keluar dari game loop)
if (check_collision(x, y) == 1) {
break;
}

// Jika tidak terjadi tabrakan (collision), maka snake
// boleh bergerak maju..

// Pop ekor, lalu push segment ke depan head sehingga
// snake tampak bergerak maju.
            // Namun jika posisi x,y ke mana kepala (head) snake akan
            // bergerak berada di posisi makanan, tidak perlu pop
            // sehingga segment bertambah panjang.
if (x == food_x && y == food_y) {
// Dalam hal snake memakan makanan, maka nilai bertambah
score += 100;

// Lalu makanan ditempatkan ulang secara acak
place_food();
}
else {
pop();
}
push(x, y);

// Tampilkan kondisi permainan saat ini di layar...

// Bersihkan layar
system("cls");

// Cetak (render) snake di layar
display();

// Cetak (render) makanan di layar
gotoxy(food_x, food_y);
printf("X");

// Perbarui penanda waktu
last_timestamp = current_timestamp;
}

// Ubah arah jika tombol panah ditekan
if (GetKeyState(VK_LEFT) < 0) {
dir = VK_LEFT;
}
if (GetKeyState(VK_RIGHT) < 0) {
dir = VK_RIGHT;
}
if (GetKeyState(VK_UP) < 0) {
dir = VK_UP;
}
if (GetKeyState(VK_DOWN) < 0) {
dir = VK_DOWN;
}

// Keluar dari program jika menekan tombol ESC
if (GetKeyState(VK_ESCAPE) < 0) {
return 0;
}
}

// Setelah keluar dari game loop, berarti permainan berakhir (game over)
system("cls");
printf("GAME OVER\n");
printf("Your score : %d\n\n", score);

printf("Press ENTER to exit...");
getchar();
return 0;
}

jika berhasil komennya ditunggu.. thanks

Tidak ada komentar:

Posting Komentar