Ok, a little confession.. I know minggu ini saya seharusnya melanjutkan bagian 3 dari seri Blackberry Game Development Tutorial, hanya saja minggu ini saya masih relatif sibuk sehingga belum sempat menyelesaikan artikelnya (itu, dan karena ngejar ngabisin nonton The Big Bang Theory season 2 ). So instead, untuk minggu ini saya akan menulis mini-article tentang bitwise state setting sebagai gantinya. Teori ini sebenarnya bisa diaplikasikan ke berbagai macam programming language, namun karena Java adalah bahasa yang paling saya kuasai, maka sample-sample yang saya berikan akan saya tulis dengan Java juga. Okay, on to the topic..
Asumsikan kita dihadapkan pada problem berikut: Kita akan membuat sebuah game rock-paper-scissors. Pada model yang sederhana, rule-nya adalah sebagai berikut:
- Rock beats scissors
- Scissors beats paper
- Paper beats rock
private static final int ROCK = 1;
private static final int PAPER = 2;
private static final int SCISSORS = 3;
public String checkWin(int myHand, int enemyHand) {
//bila sama, maka seri
if (enemyHand == myHand)
return "It's a Tie!";
switch(myHand) {
case PAPER:
if (enemyHand == ROCK)
return "You Win!";
break;
case ROCK:
if (enemyHand == SCISSORS)
return "You Win!";
break;
case SCISSORS:
if (enemyHand == PAPER)
return "You Win!";
break;
}
//pemain kalah
return "You Lose!"
}
Namun bagaimana bila melakukan perhitungan yang lebih kompleks, seperti perbandingan elemen? Katakanlah kita memiliki sebuah kasus sbb: kita ingin membuat game seperti rock-paper-scissors, namun ketimbang menggunakan gunting, batu dan kertas kita ingin membuatnya lebih kompleks dengan menggunakan elemen-elemen seperti air, api dan tanah sebagai pembandingnya. Rule-nya adalah sebagai berikut:
- Water defeats Fire
- Fire defeats earth
- Earth defeats Water
- Wind defeats Earth and Fire, but loses to Water
- Thunder defeats Earth, Wind and Water, but loses to Fire
Joining States Using Bitwise OR
final int WATER = 2 << 0; final int FIRE = 2 << 1; final int EARTH = 2 << 3; final int WIND = 2 << 4; final int THUNDER = 2 << 5;
int defeats= WIND|WATER|EARTH;
Checking For Value Using Bitwise AND
int defeats= WIND|WATER|EARTH;
if ((defeats & FIRE) != 0)
System.out.println("Fire");
if ((defeats & WIND) != 0)
System.out.println("Wind");
Removing States Using Bitwise XOR
int defeats= WIND|WATER|EARTH;
defeats = defeats ^ WIND; //remove konstanta WIND
if ((defeats & WIND) == 0)
System.out.println("No Wind");
Hasil dari code snipped di atas adalah text “No Wind” akan dicetak, karena konstanta WIND telah diremove dari state parameter defeats.
Completing The Code
final int WATER = 2 << 0;
final int FIRE = 2 << 1;
final int EARTH = 2 << 3;
final int WIND = 2 << 4;
final int THUNDER = << 5;
private int getDefeats(int hand) {
int defeats = 0;
switch (hand) {
case WATER:
defeats = FIRE|WIND;
case FIRE:
defeats = EARTH|THUNDER;
case EARTH:
defeats = WATER;
case WIND:
defeats = EARTH|FIRE;
case THUNDER:
defeats = EARTH|WIND|WATER;
}
return defeats;
}
private String checkWin(int myHand, int enemyHand) {
if (enemyHand == myHand)
return "It's a Tie!";
int defeats = getDefeats(myHand);
if ((defeats & enemyHand) != 0)
return "You Win!"
else
return "You Lose!"
}
Bitwise operation dapat menjadi tools yang sangat berguna, khususnya untuk membuat code kita lebih compact dan sederhana. Ada banyak implementasi dan teknik lain dalam penggunaan bitwise operation untuk app/game kita, namun secara pribadi, saya lebih sering menggunakannya untuk state settings karena cukup ringkas dan flexible. Feel free to look for more bitwise operation implementation out there, as this is just the simplest ones. Hope this has been helpful, minggu depan kita akan kembali ke tutorial Blackberry Game Development kita