Monday, 29 November 2010

Cryptography Sederhana (1)

"Abcd EfghI = Saya Gamer???"


Cryptography adalah seni dalam menyamarkan informasi. Misalkan ada informasi yang akan disamarkan, contohnya kata "Tester" (informasi asli ini dinamakan plaintext) akan disamarkan menjadi "Uftufs" (hasil akhirnya dinamakan chipertext). Lalu bagaimana kata "Tester" dapat berubah menjadi kata yang aneh tersebut? Kalau sudah tahu pasti gampang (ya iyalah.. ). Jika diperhatikan dengan seksama huruf 't' menjadi 'u', dan 'e' menjadi 'f', yang berarti huruf selanjutnya dari huruf informasi yang asli. Jika sudah di enkripsi (disamarkan) tentu harus di dekripsi (dipecahkan / diungkap). Jika disamarkan dengan menambah satu poin dari karakter aslinya, maka perlu dipecahkan dengan mengurangi satu poin dari informasi yang telah dienkripsi.

Sebagai contoh, silahkan anda coba download terlebih dahulu (jika belum) lalu mainkan game Kapal Luar Angkasa tersebut. Habisi beberapa musuh lalu tutup gamenya, selanjutnya buka kembali maka anda akan mendapati nilai Highscore sesuai dengan score terakhir anda menutup program. Tentunya jika nilainya lebih besar dari highscore sebelumnya. Nilai highscore ini tersimpan pada file bernama "nilai.hs". Dengan sedikit trik, maka kita dapat memanipulasi nilai highscore saat program dijalankan. Triknya adalah dengan merubah nilai (highscore) pada file "nilai.hs" sesuai keinginan. Jika anda bertanya bagaimana melakukannya berarti anda belum pantas menjadi Hacker, atau Cracker xD hehehe. Memang file ini akan terlihat seperti file yang tidak dapat dibuka begitu saja, seperti gambar berikut:

Gambar 1. File dengan format '.hs', sebuah format yang menipu. File yang tidak memiliki asosiasi file pada a). WinXP, dan b). Win 7.

Tetapi anda salah! file ini dapat dibuka dengan mudah dengan notepad dan anda akan mendapati nilai Highscore terakhir!!!. Silahkan ubah nilainya sesuka hati dengan angka tertinggi, dan Yeah.. game buatan kita telah di-hack, selamat.. . Dengan skenario hebat diatas, tentu kita tidak ingin terjadi di game buatan kita nanti. Sekalipun itu membuat mereka (para hacker) senang dan memainkannya lagi dengan kombinasi-kombinasi yang dapat terjadi. Tetap saja itu takkan bertahan lama, yang tertinggal hanya kebosanan. Untuk itu kita perlu mempelajari teknik ini, jadi tunggu bagian kedua tulisan ini hehehe...

- krofz

Wednesday, 24 November 2010

Kapal Luar Angkasa v0.2 (4)


"Semua Terekam tak Pernah Mati"
The Upstairs Band


Game sekarang yang memiliki banyak peta, tantangan, dan jenis mode permainan, membuatnya semakin kompleks dan lama untuk diselesaikan. Untuk itulah program kita harus dapat membuat, menulis, dan membaca sebuah file, atau yang biasa disebut "Save Game". Pengertian yang dimaksud, dapat juga berupa penyimpanan pengaturan opsi (option setting), seperti "Music On", "Sound FX Off", dll. Sehingga saat program dijalankan lagi di lain waktu maka tidak perlu mengaturnya lagi, jika dirasa setting-an default tidak sesuai. So, berikut kode pada program kita:


...
    if( getHighscore() < highscore){
        //simpan highscore
        std::ofstream saveNilai("nilai.hs");
        saveNilai<<highscore;
        saveNilai.close();
    }
...

Kode diatas terletak sebelum pembersihan variabel-variabel surface. Terlihat sangat sederhana karena banyaknya nilai atau data yang harus disimpan masih sedikit bahkan cuma satu, yaitu hanya highscore. Highscore ini sebagai pemicu pemain untuk terus bermain menyusul highscore yang sudah ada hehehe. Sudah mengertikan kode diatas? Kalau belum lihat lagi bagian ini. Setelah ditulis tentu harus dapat dibaca, hehehe . Kalau begitu lansung saja berikut kodenya:


...
int getHighscore()
{
    //hs = highscore
    int temp = 0;
    std::ifstream nilai("nilai.hs");

    if( nilai != NULL){
        nilai>>temp;
        if( temp < 0) temp = 0;
        else if( temp > MaxScore) temp = MaxScore;
    }
    nilai.close();

    return temp;
}

...
 //di dalam fungsi main
    highscore = getHighscore();
...

Kalau masih belum jelas dengan kode diatas silahkan lihat cara Membaca Sebuah File. Intinya kita membuat fungsi dengan tipe data int agar highscore mendapat nilai kembalian (return) yang sesuai. Selain menyimpan nilai highscore, kita juga dapat membuat agar program menyimpan koordinat terakhir, power yang dimiliki, dsb. Sehingga tercipta yang namanya "Load Game", hehehehe . So, sampai disini program kita sudah cukup komplit (complete), akhir kata Happy Coding!.

- krofz

Monday, 8 November 2010

Kapal Luar Angkasa v0.2 (3)

Tulisan ini merupakan lanjutan dari:
Kapal Luar Angkasa v0.2 (1)
Kapal Luar Angkasa v0.2 (2)

Peluru

Yah, pada versi sebelumnya (v0.1) pun kita sudah dapat mengeluarkan peluru. Tapi kali ini musuhnya pun dapat melakukannya dan diperburuk dengan warna peluru yang membaur dengan background, jadi berhati-hatilah! . Berikut ini deklarasi dan inisialisasi pada kelas peluru :

...
class peluru
{
    SDL_Surface *gambar;
    SDL_Rect kotak;
    //serang : false = serang musuh, true = serang jagoan / player
    bool aktif, serang, atas;
    int jenis;
    float x, kecX;

public:
    peluru();

    //****  LANGSUNG  ****
    SDL_Rect getKotak(){ return kotak; }
    bool getAktif(){ return aktif; }
    bool getSerang(){ return serang; }
    void aktifFalse(){ aktif = false; }
    //****  ********  ****

    int getDamage();
    void setPeluru(int,int,float,bool,bool,int,int);
    void bergerak();
    void tampil();
};

...
peluru::peluru()
{
    kotak.x = 0;
    kotak.y = 0;

    aktif = false;
    atas = false;
    serang = PL_PLAYER;
    jenis = PEL_KECIL;

    x = 0;
    kecX = 0;
}

int peluru::getDamage()
{
    switch( jenis){
        case PEL_NORMAL: return 15; break;
        default: return 1;
    }
}

void peluru::setPeluru(int _x, int _y, float _kecX, bool _atas, bool _serang, int _jenis, int _gbr)
{
    jenis = _jenis;
    switch( jenis){
        case PEL_NORMAL: kotak.w = 20; kotak.h = 20; break;
        //default = PEL_KECIL (Peluru KeciL)
        default: kotak.w = 10; kotak.h = 10;
    }

    switch( _gbr){
        case PELG_CYAN: gambar = gbrPeluru02; break;
        //default PELG_MERAH
        default: gambar = gbrPeluru;
    }

    x = _x - (kotak.w/2);
    kotak.x = (int)x;
    kotak.y = _y - (kotak.h/2);

    kecX = _kecX;
    atas = _atas;
    serang = _serang;

    aktif = true;

}

void peluru::bergerak()
{
    x += kecX;
    kotak.x = (int)(x);

    const int kecY = 6;

    if( atas) kotak.y -= kecY;
    else kotak.y += kecY;

    if( kotak.x < 0 || kotak.x > lebar_layar || kotak.y < 0 ||
        kotak.y > tinggi_layar) aktif = false;
}

void peluru::tampil()
{
    terapinGbr( kotak.x, kotak.y, gambar, screen, &cPeluru[jenis]);
}
...

SDL_Surface *gambar, berfungsi sebagai penunjuk gambar atau alamat surface yang akan ditampilkan nanti pada fungsi tampil(), sesuai inisialisasi pada fungsi setPeluru(). Selanjutnya ada 3 var boolean, yaitu boolean aktif berfungsi untuk memberitahukan apakah objek ini eksis atau tidak. Boolean serang, jika sudah aktif maka akan ditujukan untuk siapa peluru ini. Jika bernilai false maka saat musuh menabrak peluru aktif ini, DUARR!!. Begitu pula sebaliknya. Sedangkan boolean atas untuk pergerakan pada sumbu Y, variabel boolean ini bisa dihilangkan jika mau. Dan digantikan dengan int atau float (misal int kecY, atau float kecY). Segala bentuk persiapan yang diperlukan ada di fungsi setPeluru(), seperti koordinat awal muncul, kecepatan (X) peluru, dsb.

Untuk pesawat sang jagoan, peluru ini akan aktif setelah kita menekan tombol spasi (yang terletak pada void kapal::penanganan(peluru *_peluru[])). Banyaknya peluru disesuaikan dengan variabel power punya si jagoan. Power ini didapat dari item yang keluar saat kita menghancurkan musuh. Item ini ditanggani oleh kelas item. Saat ini baru satu jenis item yang akan keluar yaitu item Power, nanti akan kita perbanyak jenisnya . Semua proses tabrakan ini tak lepas dari peran utama fungsi bool f_PeriksaTabrakan(SDL_Rect A, SDL_Rect B) yang sifatnya general (umum). Dengan fungsi SDL_Rect getKotak(){ return kotak; } yang memiliki hak akses public dan dimiliki oleh semua kelas yang akan terjadi proses tabrakan ini. Sehingga penggecekan pada fungsi f_PeriksaTabrakan() menjadi lancar.

Sedangkan musuh akan mengeluarkan peluru jika skor (score) kita telah melebihi nilai yang ditentukan. Ditambah lagi kecepatan nembaknya akan semakin cepat seiring skor yang diperoleh (int _fastShoot = (frame_perdetik*3) - (_score/200); ). Untuk lebih jelasnya lihat inisialisasi fungsi void musuh::bergerak(int _kec, int _X, int _score, peluru *_peluru[]). Tak penting berapa ratus atau bahkan ribu baris kode yang Anda tulis, yang terpenting adalah Anda mengerti arti dan fungsi dari kode yang Anda tulis. Sehingga source code yang telah Anda download tidak menjadi sampah yang bakal menuju Recycle Bin, hehehehe . Maaf jika ada yang kurang jelas atau loncat-loncat pembahasannya.

- krofz
 

back to top

back to top