Wednesday, 22 June 2011

Ayo Menghitung Cepat (2)

Tulisan ini merupakan lanjutan dari:
Ayo Menghitung Cepat (1)

Seperti janji saya yang berbunyi, yaitu "... akan saya bahas lagi sedikit tentang proses pemilihan jawabannya ..." hehehe. Maka setelah kita membuat kelas tombol ( class tombol{...}; ) yang tentunya sebagai objek utama dalam program ini, kita perlu menyiapkan variabel lainnya seperti berikut ini :


...
    // program main loop
    int fps = 0, a = 0, b = 0, c = 0, d = 0, poin = 10, jawaban = 0, kurangPoin = 0;
    bool done = false, reloadAngka = true;
    std::string pertanyaan;
...

Variabel a,b,c, dan d untuk menampung pilihan-pilihan jawaban. Selanjutnya variabel poin, untuk menampung nilai poin yang dimiliki. Poin akan bertambah jika jawaban yang dipilih benar. Dan poin juga berfungsi sebagai indikator perubahan bilangan-bilangan perkalian, semakin besar poin maka semakin besar bilangan yang akan dikalikan. Proses ini terletak pada pengecekkan kondisi var booelan reloadAngka (yang pada artikel sebelumnya juga sudah menampakkan diri ) :


...
    if( reloadAngka){
        int _x = 1+poin/60+rand()%4+(poin/30),
            _y = 1+poin/60+rand()%4+(poin/30);

        jawaban = _x*_y;

        int _z = _x+_y;
        a=jawaban+1+rand()%_z;
        b=jawaban+3+rand()%_z;
        c=jawaban-1-rand()%_z;
        d=jawaban-3-rand()%_z;

        int _start = rand()%4;
        switch(_start){
            case 0: a=jawaban; break;
            case 1: b=jawaban; break;
            case 2: c=jawaban; break;
            case 3: d=jawaban; break;
            default:;
        }

        std::stringstream SS;
        SS << _x << " x " << _y << " = ";
        pertanyaan = SS.str().c_str();
        reloadAngka = false;
    }
...

Variabel jawaban sudah pasti untuk menampung jawaban yang benar dan berfungsi sebagai parameter yang dibutuhkan dalam memilih jawaban yang benar. Var pertanyaan untuk menampung kalimat (string) perkalian. Sedangkan var kurangPoin sebagai timer untuk mengurangi 1 poin setiap 3 detik, jadi jangan kelamaan mikirnya atau poin anda akan berkurang dengan sendirinya . Penempatan jawabannya dilakukan secara acak (random), jadi tidak hanya jawabannya saja yang acak . Kita lanjutkan pada bagian terpenting yaitu pemilihan jawaban:


...
 //tahap 1
    case SDL_MOUSEMOTION:
        Xmouse = event.motion.x;
        Ymouse = event.motion.y;
        break;
    
    case SDL_MOUSEBUTTONDOWN:
        if( event.button.button == SDL_BUTTON_LEFT) klikKiri = true;
        break;
...
 //tahap 2
 const int _benar = 1;
    const int _salah = 2;
    int benar = 0; //0 (nol) berarti diam saja

    if( A.proses( Xmouse, Ymouse)){
        if(jawaban == a) benar = _benar;
        else benar = _salah;
    }
    else if( B.proses( Xmouse, Ymouse)){
        if(jawaban == b) benar = _benar;
        else benar = _salah;
    }
    else if( C.proses( Xmouse, Ymouse)){
        if(jawaban == c) benar = _benar;
        else benar = _salah;
    }
    else if( D.proses( Xmouse, Ymouse)){
        if(jawaban == d) benar = _benar;
        else benar = _salah;
    }
...

Untuk memastikan jawaban yang diklik itu benar, terlebih dahulu penanganan pada mouse yaitu dengan memperoleh koordinat X, dan Y serta penekanan tombol kiri (tahap 1 pada potongan kode diatas). Setelah bahan-bahan yang dibutuhkan telah siap, lalu memeriksa setiap tombol dengan fungsi "proses" yang dimilikinya (kelas tombol) - tahap 2. Dikarenakan variabel klikKiri adalah variabel global. Sehingga pemeriksaan tombol kiri sudah tertekan atau belum tidak tampak pada kode diatas tetapi terletak pada fungsi proses pada kelas tombol. Saran jangan terlalu banyak membuat variabel global atau anda akan pusing ketika para serangga (bug) datang (-.-) . Jika area tombol benar-benar terklik maka selanjutnya memeriksa apakah nilai yang dimiliki tombol sama dengan jawaban. Jika iya maka akan terjadi pengaturan pada var benar. Fungsi utama var benar ini untuk menampilkan gambar benar (tanda bulat hijau) atau salah (tanda silang merah). Kurang lebih seperti itu program ini bekerja .

- krofz
 

back to top

back to top