Game Snake Di C++
#include <iostream>
#include <conio.h>
#include <windows.h> //menggunakan gotoxy, GetAsyncKeyState,
#define batas_atas 2 //batas_atas game
#define batas_bawah 23 //batas_bawah_game
#define batas_samping 2 // batas samping kiri game
#define batas_samping_k 78 //batas samping kanan game
using namespace std;
//pendeklarasian variabel
int iX(5), iY(5), x1 (4), y1 (4), xHapus(3), yHapus(3), veloX(1),
veloY(0)
,ekorsX[200], ekorsY[200], nEkor = 2, start = 0, makX, makY
,level = 1 ,username;
void gotoxy(int x, int y) // Void untuk gotoxy, memindahkan kursor pada
console
{
COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void naik() // untuk gerak Snake ke atas
{
veloY = -1; //Kecepatan Y menjadi ke atas
veloX = 0; //kecepatan X dinolkan
}
void turun()
{
veloY = 1; //sda
veloX = 0; //sda
}
void samping()
{
veloX = -1; //sda
veloY = 0; //sda
}
void samping_k()
{
veloX = 1; //sda
veloY = 0; //sda
}
void hapus()
{
gotoxy(xHapus, yHapus); //untuk menghapus bagian yang sudah
dilewati
cout << " ";
}
void ekor()
{
for(int j = 0; j <= 2; j++)
{
gotoxy(ekorsX[j], ekorsY[j]);
cout << char(29);
}
}
void tampil()
{
gotoxy(iX, iY); //iX dan iY adalah posisi gambar kepala
cout << char(1); //untuk menggambar gambar kepala
gotoxy(makX, makY);
//nilai makX dan makY adalah random
//digunakan untuk posisi makanan, jadi posisi makanan random
cout << char(3); //gambar makanan
}
void ganti_posisi() //mengganti posisi dari ekor ekor snake
{
xHapus = ekorsX[nEkor - 1];
yHapus = ekorsY[nEkor - 1];
for(int j = nEkor - 1; j >= 1; j--)
{
ekorsX[j] = ekorsX[j-1];
ekorsY[j] = ekorsY[j-1];
}
ekorsX[0] = iX;
ekorsY[0] = iY;
}
void velo() //fungsi untuk melakukan update posisi snake sesuai tombol
//yang ditekan
{
ganti_posisi();
hapus();
iX += veloX;
iY += veloY;
tampil();
ekor();
}
bool isDestroy()
{
//selain untuk mencek apakah snake sudah kalah
//fungsi ini juga menghapus kepala snake yang tersisa jika
membentur dinding
if(iX == batas_samping_k) { iX = 3; gotoxy(78, iY); cout <<
" "; }
if(iX == batas_samping) { iX = 77; gotoxy(2, iY); cout
<< " "; }
if(iY == batas_atas) { iY = 22; gotoxy(iX, 2); cout <<
" "; }
if(iY == batas_bawah) { iY = 3; gotoxy(iX, 23); cout <<
" "; }
//trace();
for(int j = 0; j <= nEkor - 1; j++)
if(ekorsX[j] == iX && ekorsY[j] == iY) return true;
return false;
}
char getkey()//fungsi untuk mendapatkan tombol yang ditekan
{
for(int i = 8; i <= 222; i++)
{
if(GetAsyncKeyState(i) == -32767)
{
switch(i)
{
case 38 : if(veloY != 1)naik();
break;//jika tombol yang ditekan adalah atas
case 40 : if(veloY != -1)turun();
break; //jika tombol yang ditekan adalah bawah
case 37 : if(veloX != 1)samping();
break; //jika tombol yang ditekan adalah kiri
case 39 : if(veloX != -1)samping_k();
break; //jika tombol yang ditekan adalah kanan
}
}
}
}
void random_makanan()
{
//
PENAMBAHAN UNTUK IF PERULANGAN LEVEL UP PER KELIPATAN MAKAN
makX = rand()%(batas_samping_k - 1);
if(makX < 4) makX += 3 + (4-makX); //mencegah agar makanan
tidak diluar batas
makY = rand()%(batas_bawah - 1);
if(makY < 4) makY += 3 + (4-makY);
gotoxy(makX, makY);
cout << char(3);
if
(nEkor%10==0)
level=level+1;
}
bool isEaten()
{
if(iX == makX && iY == makY) return true; else return
false;
}
void cBorder() //Fungsi untuk membuat garis tepi game
{
for(int i = 1; i <= 78; i++)
{
for(int j = 1; j <= 24; j += 23)
{
if(j > 1 || i >= 33)
{
gotoxy(i, j);cout << char(219);
}
}
}
for(int i = 1; i <= 24; i++)
{
for(int k = 1; k <= 80; k += 78)
{
gotoxy(k, i); cout <<
char(219);
}
}
}
//akhir pembuatan garis tepi
//Penulisan Skor
void skor()
{
gotoxy(3,1); cout << "Skor : ";
gotoxy(18,1); cout << "Panjang : ";
gotoxy(33,1); cout << "level : ";
gotoxy(3,2); cout << "Nama : ";
}
//Untuk menulis skor terbaru dan panjang dari snake
void tulis_skor()
{
gotoxy(11,1); cout << (nEkor) * 10;
gotoxy(28,1); cout << nEkor;
gotoxy(41,1); cout << level;
}
//Fungsi yang menjalankan beberapa fungsi yang berjalan
//pada awal program, hanya sekali
void inisialisasi()
{
cBorder(); //buat pinggiran game
random_makanan(); //letakkan makanan secara random
skor(); //tulis tulisan skor di tepi atas
tulis_skor(); //menulis skor
}
int main() //fungsi Utama dimana program perulangan di jalan kan
{ int pilih;
char
user[20];
pilih:
system("cls"); //membersihkan layar
cout << "\tSelamat Datang \n";
cout << "\t\t1.main \n";
cout << "\t\t2.keluar \n";
cout << "anda pilih yang mana : ";
cin>>pilih;
switch (pilih){
case 1:
goto main;
case 2:
goto
exit;
default : cout << "maaf tidak tersedia";
goto pilih;
}
main:
cout << "Masukkan Nama = ";cin >> user;
system("cls");
gotoxy(11,2); cout << user; // menampilkan nama user
inisialisasi(); //menjalankan fungsi inisialisasi
while(!(isDestroy())) //selama snake belum rusak atau kalah
{
velo(); //merubah posisi snake berdasarkan kecepatan X atau
Y
getkey(); //untuk mendapatkan tombol apa yang ditekan user
dan
//menjalankan beberapa fungsi yang diperlukan
if(isEaten())//mencek apakah makanan telah dilalap oleh
snake
{
nEkor += 2; //panjang ekor ditambah 2
random_makanan(); //makanan diletakkan lagi
tulis_skor();//skor di update
}
//======================ini untuk kecepatan dari
ular ============
Sleep(200 - (nEkor * 5)); //delay yang semakin cepat dengan
penambahan ekor
}
system("cls"); //layar dibersihkan
gotoxy(32,12); cout << "Skor "<<
user<<":" << (nEkor - 1) * 10; //ditampilkan skor
gotoxy(25,13);
exit:
system("pause"); //selesai
}