Permainan ular sederhanan

 

#include <iostream>

#include <windows.h> //menggunakan gotoxy, GetAsyncKeyState,

//dan beberapa fungsi lainnya

//Awal pendeklarasian beberapa konstanta

#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

//Akhir pendeklarasian konstanta

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 = 5, start = 0, makX, makY;

 

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 << "+";

 }

}

 

void tampil()

{

 gotoxy(iX, iY); //iX dan iY adalah posisi gambar kepala

 cout << char(2); //untuk menggambar gambar kepala

 //karena ascii dari smiley tsb adalh 2

 gotoxy(makX, makY);

 //nilai makX dan makY adalah random

 //digunakan untuk posisi makanan, jadi posisi makanan random

 cout << "*"; //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();

}

 

/*void trace()

{

 for(int j = 0; j <= nEkor -1; j++)

 {

  cout << "x" << j << " y"<< j<< " = " << ekorsX[j] << "," << ekorsY[j];

  cout << " // " << iX << "," << iY << endl;

 }

 system("pause");

 system("cls");

}*/

 

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()

{

 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 << "*";

}

 

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 >= 32)

   {

    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 : ";

}

//Untuk menulis skor terbaru dan panjang dari snake

void tulis_skor()

{

 gotoxy(11,1); cout << (nEkor - 5) * 10;

 gotoxy(28,1); cout << nEkor;

}

//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

{

 system("cls"); //membersihkan layar

 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

   }

   Sleep(40 - (nEkor / 10)); //delay yang semakin cepat dengan penambahan ekor

  }

 system("cls"); //layar dibersihkan

 gotoxy(32,12); cout << "Skor : " << (nEkor - 5) * 10; //ditampilkan skor

 gotoxy(25,13);

 system("pause"); //selesai

}

Share on :

0 Response to "Permainan ular sederhanan"

Posting Komentar