Senin, 30 Mei 2016

Tugas 3 Softskill - Pengantar Teknologi Game


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

}