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
}
