Lanjut ke konten
1 Juli 2012 / Jeffrey Hermanto Halimsetiawan

Dynamic Difficulty Balancing in Mobile Phone Games using Genetic Algorithm

Dalam studi master saya semester ini, salah satu mata kuliah yang saya ambil adalah Application of Computational Intelligence in Engineering. Mata kuliah yang menarik dan diajar oleh instruktur yang berpengalaman di bidang kecerdasan komputasional, yaitu: Prof. I-Tung Yang. Salah satu syarat kelulusan mata kuliah ini adalah membuat sebuah final project yang mengimplementasikan salah satu dari beberapa teknik metaheuristik yang diajarkan seperti: Genetic Algorithm, Particle Swarm Organization, Multi-objective Optimization, Simulated Annealing, Tabu Search, Ant Colony Optimization, Differential Evolution, Artificial Immune System, atau algoritma lainnya pada kasus nyata di bidang engineering. Setelah melalui proses studi literatur dari paper berikut:

Verma, Millan A., and Peter W. McOwan. 2005. An Adaptive Methodology for Synthesizing Mobile Phone Games using Genetic Algorithms. The 2005 IEEE Congress on Evolutionary Computation.

Akhirnya saya dan rekan saya memutuskan untuk mengambil topik serupa dengan judul, Dynamic Difficulty Balancing in Mobile Phone Games using Genetic Algorithm.

Latar Belakang

Berdasarkan data dari Microsoft Tag (2011), telepon seluler telah berkembang dengan sangat cepat dari tahun ke tahun hingga mencapai 4 milyar. Ternyata 61% orang tersebut menggunakan telepon selulernya untuk bermain game. Saat ini, game ponsel tidak secara akurat mengatasi bervariasinya kemampuan pemain. Jika pemain tidak terampil maka pemain dapat menjadi stres, sebaliknya apabila pemain sangat terampil tentunya pemain dapat cepat bosan. Oleh karena itu, pendekatan yang lebih adaptif untuk mengubah tingkat kesulitan game secara dinamis amatlah dibutuhkan.

Definisi Masalah

Studi kasus pada proyek ini adalah sebuah game action yang simpel dengan cara bermain yang mudah, yaitu: cukup dengan menggerakkan ponsel dengan Windows Phone OS ke kiri dan kanan karena memanfaatkan sensor accelerometer. Objektif dari game ini adalah untuk memperoleh skor tertinggi dengan mengambil balon dan koin serta menghindari bintang-bintang yang bertebaran. Selain itu, pemain juga akan diganggu oleh angin yang akan otomatis menggerakkan karakter secara horizontal berdasarkan arah dan kecepatan angin tersebut.

In Game Screenshot - Up!

Algoritma

Elemen-elemen terkait dalam game ini yang dapat mempengaruhi tingkat kesulitan permainan dijabarkan dalam diagram berikut:

Genetic Algorithm Elements - Up!

Elemen-elemen tersebut di-encode menjadi kromosom-kromosom dalam genetic algorithm yang salah satu contoh solusinya seperti gambar berikut:

Encoded Solution - Up!

Karena proyek ini menggunakan genetic algorithm, tentu saja beberapa tuning parameters wajib ditentukan terlebih dahulu sebelum program dijalankan. Berdasarkan hasil trial and error sebelumnya, maka tuning parameters yang digunakan adalah:

  • Population: 4
  • Max. Generation: 5
  • Mutation Rate: 0.06
  • Crossover Rate: 0.8

Implementasi

Untuk mengimplementasikan genetic algorithm dalam permainan, langkah-langkah yang dilakukan adalah:

  1. Membuat opsi bagi pemain untuk bermain dengantingkat kesulitan berdasarkan chromosome generation yang acak.
  2. Implementasi 1

  3. Membuat tingkat kesulitan permainan yang adaptif selama permainan berdasarkan respon dari pemain. Permainan tersebut akan memperbarui Lookup Table yang berisi fitness value sesuai dengan nilai pemain.
  4. Implementasi 2

Agar memperoleh bayangan mengenai jalannya algoritma ini, flowchart pengimplementasian algoritma tersebut dapat dilihat pada gambar berikut:

Flowchart - Up!

Salah satu contoh hasil dari Lookup Table yang akan digunakan untuk mengatur tingkat kesulitan permainan setelah game ini dijalankan dan memperoleh respon dair pemain adalah sebagai berikut:

Lookup Table Result - Up!

Evaluasi

Pengaturan elemen-elemen permainan pada kromosom genetic algorithm tidak berdampak secara langsung terhadap fitness value. Oleh karena itu, proses evaluasi algoritma ini memerlukan respon dari pemain tentang seberapa baik sistem ini bekerja.

Pertanyaan pertama dari proses evaluasi ini adalah apakah permainan yang dimainkan sesuai dengan permintaan pemain untuk tingkat kesulitan yang lebih tinggi dan rendah. Berikut adalah pie chart hasil evaluasi terhadap pemain:

image

Pertanyaan kedua adalah game manakah yang lebih disukai antara Random Game dan GA Game. Berikut adalah pie chart hasil evaluasi terhadap pemain:

image

Kesimpulan

Dari proyek ini, beberapa kesimpulan yang dapat ditarik antara lain:

  • Genetic algorithm dapat diimplementasikan pada sebuah game yang bertujuan untuk mengatur tingkat kesulitan permainan.
  • Beberapa peningkatan yang dapat dilakukan antara lain: menghasilkan jumlah populasi dan generasi yang lebih banyak, menambahkan lebih banyak obstacle,  dan mengintegrasikan proses chromosome generation dan chromosome update secara bersamaan.

Semoga tulisan yang “sedikit” akademis ini dapat bermanfaat!

30 Juni 2012 / Jeffrey Hermanto Halimsetiawan

Pixel-Perfect Collision Detection pada Silverlight for Windows Phone

Dalam pengembangan sebuah game, kebutuhan untuk melakukan pengecekan collision detection antara 2 objek sangat sering sekali diperlukan. Terutama apabila pengecekan collision detection tersebut dilakukan pada 2 objek PNG images, monster hijau dengan balon, bintang, atau koin seperti gambar di bawah ini:

UP! Game

Langkah-langkah untuk melakukan pixel-perfect collision detection pada Silverlight for Windows Phone adalah sebagai berikut:

  1. Buat CharacterUserControl yang berisi Image dari monster hijau dan beri nama img1.
  2. image

  3. Buat StarUserControl yang berisi Image dari bintang dan beri nama img1.
  4. image

  5. Tambahkan instans dari CharacterUserControl dan BalloonUserControl pada MainPage.
  6. Definisikan method GetWriteableBitmap().
    protected WriteableBitmap GetWriteableBitmap(FrameworkElement control)
    {
        WriteableBitmap wb = new WriteableBitmap((int)control.Width, (int)control.Height); ;
        wb.Render(control, new TranslateTransform());
        wb.Invalidate();
        return wb;
    }
  7. Karena proses pembuatan WriteableBitmap sangatlah sering, maka WriteableBitmap dari Image tersebut akan disimpan pada property Tag dari Image pada saat constructor dipanggil.
    Image imgChar = chrMain.FindName("img1") as Image;
    WriteableBitmap wbChar = GetWriteableBitmap(chrMain);
    imgChar.Tag = wbChar;
    
    Image imgStar = str1.FindName("img1") as Image;
    WriteableBitmap wbStar = GetWriteableBitmap(str1);
    imgStar.Tag = wbStar;
  8. Definisikan method CheckCollision() yang akan dipanggil untuk melakukan pengecekan. Pada method ini, pengecekan akan dilakukan untuk setiap 10 pixel x pada setiap 10 pixel y.
    /**
     * Check the collision between control1 - control2 and also controlElem1 - controlElem2
     **/
    protected bool CheckCollision(FrameworkElement control1, FrameworkElement controlElem1,
                                    FrameworkElement control2, FrameworkElement controlElem2)
    {
        if (control2.Tag != null)
            return false;
        if (control2.Margin.Top + control2.Height < control1.Margin.Top)
            return false;
    
        if (control2.Margin.Left + control2.Width >= control1.Margin.Left &&
            control2.Margin.Left <= control1.Margin.Left + control1.Width)
        {
            bool bCollision = false;
            Point ptCheck = new Point();
    
            // do a more accurate pixel hit test in every 10 pixels
            for (int x = Convert.ToInt32(control1.Margin.Left);
                    x < Convert.ToInt32(control1.Margin.Left + control1.Width); x += 10)
            {
                for (int y = Convert.ToInt32(control1.Margin.Top);
                        y < Convert.ToInt32(control1.Margin.Top + control1.Height); y += 10)
                {
                    ptCheck.X = x;
                    ptCheck.Y = y;
    
                    if (CheckCollisionPoint(ptCheck, control1, controlElem1))
                        if (CheckCollisionPoint(ptCheck, control2, controlElem2))
                        {
                            bCollision = true;
                            break;
                        }
                }
                if (bCollision) break;
            }
            return bCollision;
        }
        return false;
    }
  9. Definisikan method CheckCollisionPoint() yang akan dipanggil untuk melakukan pengecekan di setiap pixel yang telah ditentukan.
    /**
     * Check the collision between control and controlElem in the selected pt
     **/
    public bool CheckCollisionPoint(Point pt, FrameworkElement control, FrameworkElement controlElem)
    {
        // NOTE that we saved the WB in the Tag object for performance
        WriteableBitmap wb = controlElem.Tag as WriteableBitmap;
    
        int width  = wb.PixelWidth;
        int height = wb.PixelHeight;
    
        double offSetX = control.Margin.Left;
        double offSetY = control.Margin.Top; 
    
        double xCur = pt.X - offSetX;
        double yCur = pt.Y - offSetY;
    
        if (xCur < 0 || xCur >= width || yCur < 0 || yCur >= height)
            return false;
    
        int offset = (int) ((width * yCur) + xCur);
    
        if (offset >= wb.Pixels.Count())
            return false;
    
        return (wb.Pixels[offset] != 0);
    }
  10. Pada event handler TimerTick pada game logic, lakukan pengecekan collision detection tersebut.
    Image imgChar = chrMain.FindName("img1") as Image;
    Image imgStar = str1.FindName("img1") as Image;
    if (CheckCollision(chrMain, imgChar, str1, imgStar))
    {
        // game over
        DoGameOver();
        break;
    }

Sebagai catatan, pendekatan ini memang mudah untuk diimplementasikan namun jika collision detection dilakukan pada banyak objek sekaligus maka performa aplikasi dapat menurun secara drastis. Sebaiknya, tidak melakukan pengecekan pada gambar PNG karena akan memerlukan waktu komputasi yang lama.

Semoga bermanfaat!

Referensi: Andy Beaulieu.

30 Juni 2012 / Jeffrey Hermanto Halimsetiawan

Rahasia Dapur Taptitude dari Four Bros Studio

Pertengahan bulan April 2012, developer Windows Phone digemparkan dengan kisah sukses tentang sebuah game bernama Taptitude yang menghasilkan 1 juta ad impressions per hari dan pendapatan sebesari $100,000. Kisah sukses tersebut dituliskan secara langsung oleh Four Bros Studio di website mereka dan memperoleh perhatian media dari Business Insider, WM Power User, dan Mobility Digest. Hal tersebut akhirnya menarik minat dari Channel 9 untuk mengundang salah satu developer Taptitude, Brandon Furtwangler, untuk berbagi kisah sukses mereka. Pada video tersebut, Brandon menjelaskan bagaimana asal mulanya Taptitude yang kurang begitu diminati hingga akhirnya mereka melakukan update game tersebut hingga ratusan kali. Taptitude sendiri merupakan sebuah game yang di dalamnya terdapat banyak sekali mini game yang selalu diperbaharui. Game tersebut tersedia secara free pada Windows Phone Marketplace dan didukung oleh Microsoft pubCenter Ads. Sayangnya, Microsoft pubCenter ini hanya tersedia bagi developer yang tinggal di Amerika Serikat.

TaptitudeLogo

Untuk lebih jelasnya, silahkan menyaksikan video berikut. Semoga bermanfaat.

NB: Logo Taptitude diambil dari Windows Phone Marketplace

30 Juni 2012 / Jeffrey Hermanto Halimsetiawan

Windows Phone 7 Ad Rotator

Kadang kala kita pernah merasa bahwa penghasilan yang diperoleh dari ad provider tertentu kurang memuaskan sehingga kita ingin untuk menampilkan ads dari beberapa ad providers secara bergantian. Mengapa harus bergantian? Karena jika kita menampilkan terlalu banyak iklan pada suatu Page tentunya pengguna akan merasa tidak nyaman. Lantas bagaimanakah solusinya? Salah satu cara yang dapat digunakan adalah dengan memanfaatkan Windows Phone 7 Ad Rotator yang telah tersedia untuk Silverlight maupun XNA.

Beberapa ad providers yang telah didukung antara lain:

Beberapa langkah untuk mengimplementasikan Ad Rotator:

  1. Tambahkan sebuah instance dari AdRotatorControl melalui XAML
    <adRotator:AdRotatorControl x:Name="AdRotatorControl"
    xmlns:adRotator="clr-namespace:AdRotator;assembly=AdRotator"
    Width="480" Height="80"
    SettingsUrl=http://aksarastudio.com/myAdSettings.xml
    DefaultAdType="None"
    DefaultSettingsFileUri="/AppAssemblyName;component/defaultAdSettings.xml"
    PubCenterAdUnitId="99999"
    PubCenterAppId="xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    AdDuplexAppId="9999"
    AdMobAdUnitId="xxxxxxxxxxxxxx"
    InneractiveAppId="xxxxxxxxxxxxxxxxxx"
    MobFoxAppId="xxxxxxxxxxxxxxxxxx"
    SmaatoPublisherId ="xxxxxxxxxxxxxxxxxx"
    SmaatoAppId="xxxxxxxxxxxxxxxxxx"
    SlidingAdDirection="Left"
    SlidingAdDisplaySeconds="10"
    SlidingAdHiddenSeconds="20"/>

    SettingsURL merupakan URL dari remote XML file yang mengatur probabilitas dari ad providers yang ditampilkan. Apabila remote XML file tersebut tidak dapat di-load maka file yang ditentukan pada DefaultSettingsFileUri lah yang akan digunakan.

  2. Siapkan file konfigurasi XML pada URL yang telah ditentukan pada SettingsURL dengan contoh konten sebagai berikut
    <?xml version="1.0" encoding="utf-8"?>
    <AdSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    	<CultureDescriptors>
    		<AdCultureDescriptor CultureName="en-US">
          <Probabilities Probability="15" AdType="InnerActive" AppID="<InnerActiveAPPID" />
          <Probabilities Probability="15" AdType="MobFox" AppID="<MobFox APP ID>" IsTest="false"/>
          <Probabilities Probability="40" AdType="PubCenter" AppID="<Pubcenter APP ID>" SecondaryID="<Pubcenter AD Unit ID>" />
          <Probabilities Probability="10" AdType="AdDuplex" AppID="<AdDuplex AD ID"/>
          <Probabilities AdType="DefaultHouseAd"/>
        </AdCultureDescriptor>
    		<AdCultureDescriptor CultureName="en-GB">
          <Probabilities Probability="40" AdType="InnerActive" AppID="<InnerActiveAPPID" />
          <Probabilities Probability="40" AdType="MobFox" AppID="<MobFox APP ID>" IsTest="false"/>
          <Probabilities Probability="15" AdType="PubCenter" AppID="<Pubcenter APP ID>" SecondaryID="<Pubcenter AD Unit ID>" />
          <Probabilities Probability="5" AdType="AdDuplex" AppID="<AdDuplex AD ID"/>
          <Probabilities AdType="DefaultHouseAd"/>
        </AdCultureDescriptor>
    		<AdCultureDescriptor CultureName="de-DE">
          <Probabilities Probability="20" AdType="InnerActive" AppID="<InnerActiveAPPID" />
          <Probabilities Probability="70" AdType="MobFox" AppID="<MobFox APP ID>" IsTest="false"/>
          <Probabilities Probability="5" AdType="PubCenter" AppID="<Pubcenter APP ID>" SecondaryID="<Pubcenter AD Unit ID>" />
          <Probabilities Probability="5" AdType="AdDuplex" AppID="<AdDuplex AD ID"/>
          <Probabilities AdType="DefaultHouseAd"/>
        </AdCultureDescriptor>
    		<AdCultureDescriptor CultureName="default">
          <Probabilities Probability="25" AdType="InnerActive" AppID="<InnerActiveAPPID" />
          <Probabilities Probability="25" AdType="MobFox" AppID="<MobFox APP ID>" IsTest="false"/>
          <Probabilities Probability="25" AdType="PubCenter" AppID="<Pubcenter APP ID>" SecondaryID="<Pubcenter AD Unit ID>" />
          <Probabilities Probability="25" AdType="AdDuplex" AppID="<AdDuplex AD ID"/>
          <Probabilities AdType="DefaultHouseAd"/>
        </AdCultureDescriptor>
    	</CultureDescriptors>
    </AdSettings>

Untuk informasi lebih lengkap, silahkan buka tautan berikut.

Selamat mencoba!

3 Mei 2012 / Jeffrey Hermanto Halimsetiawan

Cara Submit Aplikasi ke Windows Phone Marketplace via App Hub

Hingga saat ini (3 Mei 2012), Microsoft masih belum membuka akses bagi developer aplikasi di Indonesia untuk submit aplikasi ke Windows Phone Marketplace via App Hub. Pengembang aplikasi Windows Phone di Indonesia dapat melakukan submit aplikasinya melalui pihak ketiga, yaitu: App Gateway dan Yalla Apps. In case submission via App Hub telah dibuka, berikut adalah langkah-langkah untuk submit Aplikasi ke Windows Phone Marketplace via App Hub:

  1. Login terlebih dahulu di http://create.msdn.com/en-US dengan menggunakan akun Live yang telah terdaftar.
  2. Klik tombol ‘submit a new app’ pada bagian kanan.
  3. 01_Submit-a-New-App

  4. Masukkan nama internal aplikasi di App Hub, file .xap dari aplikasi, dan versi dari aplikasi tersebut. Lalu, klik tombol ‘Next’
  5. 02_Upload-XAP-Package

  6. Masukkan deskripsi dari aplikasi tersebut, yaitu: kategori, sub-kategori, deskripsi singkat, deskripsi lengkap, 4 buah keywords, support URL, support email, beberapa icon (ukuran 99×99, 173×173, 200×200 px), background art berukuran 1000×800 px yang akan ditampilkan pada aplikasi Marketplace apabila aplikasi kita menjadi featured apps, serta 8 buah screenshot aplikasi berukuran 480×800 px. Catatan tambahan, semua format gambar yang diminta adalah png. Jika semuanya telah lengkap, klik tombol ‘Next’.
  7. 03B_Fill-Application-Descri

    03A_Fill-Application-Descri

  8. Tentukan harga dari aplikasi dengan memilih pada combo boxSelect Price tier’. Kemudian, tentukan pada market mana sajakah aplikasi tersebut akan tersedia. Untuk lebih mudahnya, klik ‘select all’ pada Worldwide. Catatan, apabila kita men-submit game maka kita akan diminta untuk meminta memasukkan Video Game Content Rating System untuk negara-negara tertentu serta mengunggah file sertifikasinya.
  9. 04_Set-Price-and-Market-Ava

  10. Apabila ada keterangan tambahan untuk proses sertifikasi aplikasi tersebut, silahkan masukkan pada text area ‘text notes or instructions’. Lalu, tentukan publish options dari aplikasi tersebut, jika aplikasi ingin segera di-publish setelah aplikasi tersebut certified maka pilih opsi ‘As soon as it’s certified’.
  11. 05_SetAppTesting&Publish

  12. Jika proses submission telah berhasil, maka akan muncul halaman dengan tulisan “Thank you! Your app has been submitted”. Selanjutnya, kita hanya perlu menunggu hasil sertifikasi, apakah lolos proses sertifikasi atau gagal sehingga kita harus memperbaiki aplikasi dahulu dan melakukan update file .xap.
  13. 06_AppHasBeenSubmitted

Untuk penjelasan lebih lanjut, dapat dilihat pada tautan berikut. Semoga bermanfaat!

Rancang situs seperti ini dengan WordPress.com
Mulai