Thursday, 18 March 2010

Algoritma Pencarian String

Buat kalian para Blogger yang suka Edit HTML pasti sudah akrab dengan yang namanya "Find" (kalau di Mozilla ada di menu Edit) untuk mencari kode-kode atau kata-kata tertentu dalam proses "Mempercantik Blog". Kali ini kita akan membuat program yang sesuai judul diatas. Nggak usah ngomong panjang lebar lagi , nih langsung aja aku kasih contoh kodenya:

#include <fstream>
#include <string>
#include <iostream>

using std::cout;
using std::cin;

int main()
{
//find = untuk menampung kata yang akan dicari
std::string kalimat, find;
std::ifstream getFile("kalimat.txt");
if( getFile == NULL){
kalimat="Ini adalah kalimat standar yang akan dijadikan "
"bahan untuk mencoba algoritma Brute Force. "
"Jika ingin mencoba kalimat yang berbeda silahkan "
"isi atau ubah file kalimat.txt yang ada dalam satu folder "
"dengan program ini. Pastikan kalimatnya panjang agar "
"kata-kata yang akan dicari nantinya memiliki banyak "
"pilihan dibanding kalimat standar ini yang nggak jelas. "
"Akhir kata selamat mencoba dan happy coding.";
}
else{
for( int c=0;c<10;c++){
std::string temp;
getline(getFile,temp);
kalimat+=temp;
}
}
getFile.close();

cout<<kalimat<<"\n\nKata yang ingin dicari : ";
cin>>find;

bool cocok = true;
for(std::string::iterator iKalimat = kalimat.begin(),
iFind = find.begin();iKalimat<kalimat.end();++iKalimat)
{
if(*iFind != *iKalimat || !cocok){
if( *iKalimat == ' ') cout<<" ";
else cout<<"-";
iFind = find.begin();
}
else{
std::string::iterator sKata;
sKata = iKalimat;
while(iFind <find.end()){
if( *iFind != *sKata) cocok = false;
++iFind;
++sKata;
}
if( cocok){
iFind = find.begin();
while(iFind<find.end()){
cout<<*iKalimat;
++iFind;
++iKalimat;
}
iFind = find.begin();
}

if( *iKalimat == ' ') cout<<" ";
else cout<<"-";
}
cocok = true;
}

cout<<"\n\n";
system("pause");
return 0;
}

// - krofz
Berikut screenshot programnya:

Gambar 1. Cari Stringnya!


Program diatas akan memeriksa setiap huruf/karakter (variabel kalimat) dengan kata yang dicari (var find) didalam for utama. Jika cocok atau tidak langsung ditampilkan kelayar monitor anda (??!!). Dibawah ini link download untuk source code dan program yang sudah jadi.

Link : http://rapidshare.com/files/364865040/22_Pencarian_String.7z
Size : 109 KB

- krofz

Thursday, 11 March 2010

Kapal Luar Angkasa (3)

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

"Font: Courier New, Font Size:12, Font Style: Bold"
Ini semua tentang TTF (True Type Font)


Dengan adanya SDL_ttf, akan mempermudah pembuatan sebuah text/teks. Lihat potongan kode berikut:

TTF_Font *Huruf = NULL;
...
//di fungsi main()
if( TTF_Init() == -1) return 1;

...
Huruf = TTF_OpenFont("Data/impact.ttf",24);
if( Huruf == NULL) return 1;
SDL_Color putih = {255,255,255};

...
std::stringstream hg_score;
SDL_Surface *kalimat = NULL;

//mengubah bilangan bulat (int highscore) menjadi string
hg_score<<"High Score : "<<highscore;
kalimat = TTF_RenderText_Solid( Huruf, hg_score.str().c_str(),putih);
terapinGbr((lebar_layar/2)-(kalimat->w/2),0,kalimat,screen);
SDL_FreeSurface( kalimat);

...
TTF_CloseFont( Huruf);
TTF_Quit();
...
Untuk dapat menggunakannya saat program berjalan kita harus memanggil fungsi utama TTF terlebih dahulu, yaitu "TTF_Init()". Jika fungsi init ini gagal dipanggil (return -1) maka program akan segera ditutup (walaupun bisa dilanjutkan dengan kemungkinan error atau crash setiap saat). Selanjutnya agar dapat menyimpan sebuah file huruf (.ttf) ke dalam sebuah variabel, kita menggunakan "TTF_Font" dan biar lebih dinamis penggunaannya digunakan pointer. Untuk mengisi variabel bertipe TTF_Font dengan sebuah file (.ttf), kita menggunakan fungsi "TTF_OpenFont(const char *file, int ptsize)". Argumen pertama diisi dengan lokasi file yang akan dituju, sedangkan argumen kedua diisi dengan ukuran huruf (font size) yang akan digunakan. Selanjutnya memastikan bahwa file yang dipanggil ada dan berjalan dengan mulus. Tipe data "std::stringstream" mempermudahkan kita dalam memasukkan sebuah bilangan ke dalam sebuah kalimat dengan mengubahnya menjadi sebuah string atau huruf.

"TTF_RenderText_Solid(TTF_Font *font, const char *text, SDL_Color fg)", argumen pertama akan membuat sebuah gambar dengan bentuk dan ukuran dari huruf yang digunakan, argumen kedua diisi dengan kalimat yang akan ditampilkan, dan argumen ketiga sesuai namanya berfungsi untuk memberi warna. Jika semuanya tidak ada masalah maka akan tercipta sebuah teks dari gambar. Selanjutnya menampilkannya dan terakhir membersihkannya (surface) karena sudah tidak digunakan lagi. Jangan coba-coba mengisi dteks lagi dengan TTF_RenderText_Solid(), jika belum membersihkan surface-nya karena dapat menyebabkan memory leak, yang pada akhirnya komputer dapat nge-hang . Mau coba? Hapus baris SDL_FreeSurface, lalu jalankan program lalu lihat PF Usage (Page File) di Task Manager (Windows XP) maka dipastikan angkanya akan terus bertambah walau nggak banyak setiap detiknya. Kurang terasa? Ingin mencoba sampai grafik kuningnya ada diatas? Silahkan gunakan pengulangan untuk baris TTF_Render.

Gambar 1. Page File di Task Manager


Jika sudah sampai puncak, kerja processor terlihat tidak terlalu sibuk tapi rasa "Nge-Lag" dan lampu led HDD terlihat sangat sibuk. Ternyata membuat program yang bermanfaat tidak semudah yang dibayangkan dibandingkan program yang berbahaya - "Google say: Don't be Evil". Terakhir jika font / huruf sudah tidak digunakan lagi maka kita perlu membersihkannya dengan "TTF_CloseFont( TTF_Font*)". TTF_Quit(), waktunya untuk pulang dan bersih-bersih.

Aku hanya ingin berterima kasih kepada Lazy Foo,
- krofz

Thursday, 4 March 2010

Kapal Luar Angkasa (2)

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

Proses Penggambaran


Ok, saatnya kita mempelajari fungsi-fungsi utama penggambaran. Berikut kode-nya:
...
void terapinGbr(int x, int y, SDL_Surface *sumber, SDL_Surface *tujuan,
SDL_Rect *clip = NULL)
{
SDL_Rect kotak;

kotak.x = x;
kotak.y = y;

SDL_BlitSurface( sumber, clip, tujuan, &kotak);
}

...
SDL_Surface *memuat(std::string namafile, int r, int g, int b)
{
SDL_Surface *gbrDimuat = NULL;
SDL_Surface *gbrOptimal = NULL;

gbrDimuat = IMG_Load( namafile.c_str());
if( gbrDimuat != NULL)
{
gbrOptimal = SDL_DisplayFormat( gbrDimuat);
SDL_FreeSurface( gbrDimuat);

if( gbrOptimal != NULL)
{
SDL_SetColorKey( gbrOptimal, SDL_SRCCOLORKEY,
SDL_MapRGB( gbrOptimal->format, r,g,b));
}
}
return gbrOptimal;
}
...
Fungsi yang pertama yaitu "void terapinGbr()", berfungsi untuk memudahkan kita dalama menampilkan sebuah gambar dilayar. Cukup dengan mengisi parameter, seperti contoh kode berikut :
...
void kapal::tampil()
{
//misal kotak.x = 100, dan y = 100
terapinGbr(kotak.x-10, kotak.y-10, gbrKapal, screen);
}
...


Maka akan tercipta sebuah gambar di layar (screen) dengan posisi x = 90 (misalnya jika kotak.x = 100), dan y = 90 (misalnya juga jika kotak.y = 100), dengan gambar yang ditampilkan adalah variabel gbrKapal (SDL_Surface *), dan permukaan (surface) yang dituju adalah variabel screen. Sedangkan untuk parameter yang kelima tidak dimasukkan juga tidak apa-apa, karena jika tidak diisi maka nilai defaultnya adalah NULL (SDL_Rect *clip = NULL). Parameter kelima ini berguna untuk melakukan proses animasi, karena game ini masih sangat sederhana (suara aja nggak ada) jadi belum saatnya digunakan hehehe... ntar tunggu Kapal Luar Angkasa v0.2 . Sudah pahamkan dengan fungsi terapinGbr()? Kalau sudah sekarang kita kefungsi yang kedua yaitu "SDL_Surface *memuat()". Fungsi kedua ini berguna saat kita hendak memasukkan sebuah file (gambar) menjadi variabel (SDL_Surface*) yang dapat ditampilkan/diolah. Berikut contoh kode-nya:

...
gbrPeluru = memuat("Data/Peluru.png",255,0,0);
gbrPower = memuat("Data/Kekuatan.png",0,0,100);
...
Parameter yang pertama akan menampung sebuah string untuk menuju ke file yang dituju. Sedangkan yang kedua, ketiga, dan keempat berfungsi untuk menghilangkan warna yang tidak diingin dengan kode warna RGB. Dari contoh diatas gbrPeluru akan memanggil file Peluru.png di direktori/folder Data, dan akan menghilangkan warna Merah (R=255,G=0,B=0). Tapi sebelum melanjutkan program dan menampilkan gbrPeluru (misalnya) perlu diperiksa apakah file ada ditempat atau sudah kelayapan (alias nggak ada). Dengan memeriksanya menggunakan "if(gbrPeluru == NULL)", kok bisa kalau gambarnya nggak ada pasti variabelnya NULL? Ini karena kita sudah membuat fungsi kedua ini powerfull (alias canggih). Mari kita lihat isi dari fungsi kedua ini, pertama adalah membuat 2 variabel SDL_Surface berpointer lalu mengisinya dengan NULL. Berbeda dengan tutorial sebelumnya yang menggunakan "SDL_LoadBMP()", yang hanya dapat memanggilkan file berformat Bitmap (.bmp), kali ini kita menggunakan "IMG_Load()" yang berasal dari "SDL_image.h" dan lib "SDL_image.lib", yang tentunya sudah kita download sebelumnya. IMG_Load ini dapat memanggil lebih banyak format gambar seperti .jpg, .png, .tiff, dsb. Ok, kita lanjutin kalau file yang dituju ada ditempat, maka proses berlanjut ke bagian dari if. Tapi kalau nggak ada maka nilai kembaliannya (return) receh, wew... salah return-nya variabel gbrOptimal yang masih beralamat NULL.

"SDL_DisplayFormat()" akan mengubah format "bit per pixel" (bpp) pada gambar sehingga disesuaikan dengan kemampuan program yaitu sebesar 32 (lihat pada parameter ketiga SDL_SetVideoMode( lebar_layar, tinggi_layar, 32, SDL_SWSURFACE)). Selanjutnya membersihkan alamat dan nilai dari SDL_gbrDimuat dengan SDL_FreeSurface(). Agar gambar tidak ditampilkan begitu saja (yang nanti terlihat seperti kotak bergambar), maka kita perlu membuang warna tertentu yang telah dijadikan sebagai background. Hal ini dapat dilakukan dengan "SDL_SetColorKey()", hmm.. nggak bisa banyak jelasin fungsi ini . Ada yang berminat mengembangkan game ini? .

Aku hanya ingin berterima kasih kepada Lazy Foo,
- krofz
 

back to top

back to top