Selasa, 25 Juli 2017

Meninjau ulang demosceneku di JS1k 2015

For English version from this entry, click here.

Sudah dua tahun berlalu, sejak aku pertama kali mengenal JS1k. Aku sudah mengirim sebanyak tiga kali, hingga tahun ini, 2017. Kali ini, aku akan membahas tentang apa yang sebenarnya terjadi pada demosceneku ini dan bagaimana cara kerjanya.

Berikut kodenya:
for(_='er~";Z-1]Xp||W=[]V+1UA[S){QinP0<O14-p]Nstyle "+( Si] 1>h? ") 6<i%8? && ); else C(2 ":" =0; .push( function( 1>h  Sp document.createElement("t = able   for( if( >"+ +"</ === WOh  >i;i++) . .margP= >p)S8*h+7]+=S .Pn~HTML= .appendChild(  1>  j++;6<j  3, b T b Y T Y "autoZvar AV,RV,p=s=h=n=i=j=k=l=m (C= a,cQ a) 20 aQi j="ZkV; m="Z16 l="<td  =\'paddPg:9px;bord~:1px solid #000;background: i p? "cyan red #ff0 +(7>i O ?Zcursor:poPt~;\'onclick=\'C( iU)+ \' ;\' +( "rowspan=2><b b>  td> ,8>i?7>i?j+=l:m=l:k l R[0] k.rev~se().joP(" +m;R[1] j}   21 a)Os?(n=1, =(Oh 6 W 14 p?p+2:pU)%16]++,s--, 0),setTimeout( Q 1)},500)):(n=0,1< ] 7>p%8?C(pU): 2)),Y 0>h?"Reload for new game In hand: "+s+"<br/>  "Your AI\'s +" turnZ   22 aQ 1  ]Q  7> 7<p 15 N,SN   8<p 14> Op 6 pX+ U], X= U]=0} 0  7  15 W(h= 1:0  j=i 7 1 i=8; j 15 2  Oh) ;;) OSi=8+Date.now()%7]QC(iU break}}  23 a?(h=-1,al~t("You  1<c?"wP lose )):1>n (s= =aX, ]=0, 1)  { i 16 A  0:7  i 2 R T  r )  0)}})( ';g=/[^ -MRTY[-}]/.exec(_);)with(_.split(g))_=join(shift());eval(_)
Mungkin kalian bingung dengan kode di atas. Apa itu?

Membuka paket kode

Kode di atas adalah kode yang sudah dijadikan paket berukuran kecil yang nantinya akan dibuka dan berjalan otomatis. Jika kalian melihat sumber kodenya, sebenarnya kira-kira itu yang akan muncul saat dibuka paketnya.

Mulai menganalisis kode

// JS1K ENTRY
// Title: Dakon (Javanese Congkak)
// by Muhammad Rifqi Priyo Susanto
Pertama, kita buat tabel untuk wadah dan untuk informasi lalu menyimpannya ke suatu variabel sambil sebagai argumen ke suatu fungsi.
b.appendChild(T=document.createElement("table"));
b.appendChild(Y=document.createElement("table"));
Atur nilai margin menjadi auto sehingga tabel berada di tengah dokumen. Hanya berlaku untuk elemen dengan nilai CSS display adalah table, termasuk elemen table.
T.style.margin=Y.style.margin="auto";
Inisialisasi variabel, kita bisa gunakan variabel global untuk menyimpan variabelnya.
var N=[], R=[],
 p=s=h=n=i=j=k=l=m=0;

Masuk ke fungsi utama

Z adalah sebuah fungsi utama yang berperan banyak pada demo ini. Fungsi Z dapat melakukan berbagai hal, yang akan dibahas satu per satu.
(Z=function(task,param){
  1. Menyiapkan permainan.
    Siapkan nilai untuk masing-masing rumah. Siapkan juga elemen tr pada elemen table untuk wadah di atas.
    if(!task){
     for(i=0;i<16;i++)N.push(i%8>6?0:7);
     for(i=0;i<2;i++)R.push(T.appendChild(document.createElement("tr")));
     Z(20);
  2. Informasikan kepada pengguna tentang keadaan saat ini, selanjutnya disebut "menggambar".
    Dengan menggunakan elemen tr yang sudah dibuat, isi dengan elemen td yang sudah memiliki isi jumlah benih pada rumah-rumah yang ada. Jika rumah tersebut sedang dilewati pemain, gunakan warna yang berbeda.
    }else if(task===20){
     for(i=0,j="",k=[],m="";i<16;i++){
      // gambar lubang alias "rumah"
      l="<td style='padding:9px;border:1px solid #000;background:"+
       (i===p?(h<1?"cyan":"red"):"#ff0")+
       (i<7&&N[i]>0
        ?";cursor:pointer;'onclick='Z("+(i+1)+")'"
         :";'"
       )+
       (i%8>6?"rowspan=2><b>"+N[i]+"</b>":">"+N[i]+"</td>");
      i<8?i<7?j+=l:m=l:k.push(l);
     }
     R[0].innerHTML=k.reverse().join("")+m;
     R[1].innerHTML=j;
  3. Gerakan tiap langkah.
    }else if(task===21){
     // jika masih ada benih di tangan, jalan
     if(s>0){
      // deklarasikan aktivitas langkah
      n=1;
      // tambah 1 ke rumah selanjutnya
      // gerakkan penunjuk
      N[p=(
       h>0&&p===6 || h<1&&p===14 ?
        p+2:
         p+1
      )%16]++;
      // kurangi jumlah benih di tangan
      s--;
      // gambar permainan
      Z(20);
      // atur langkah selanjutnya
      setTimeout(function(){Z(21)},500)
     // jika tidak ada benih di tangan
     }else{
      // berhentikan aktivitas langkah
      n=0;
      // jika benih di rumah yang
      // ditunjuk lebih dari 1 dan
      // bukan lumbung
      N[p]>1&&p%8<7?
       // langkah selanjutnya
       Z(p+1):
      // else
       // jalankan penganalisis
       Z(22)
     }
     // beritahukan pemain
     // jika permainan sudah selesai, tambahkan pemberitahuan
     // untuk muat ulang untuk permainan baru
     // jika tidak, katakan jumlah benih di tangan dan giliran siapa sekarang
     Y.innerHTML=h<0?
      "Reload for new game":
       "In hand: "+s+"<br/>"+(h<1?"Your":"AI's")+" turn"
     ;
  4. Menganalisis keadaan permainan dan gerakan komputer.
    Juga akan dicek untuk keadaan spesial, termasuk aturan-aturan lain dalam bermain.
    }else if(task===22){
     if(N[p]===1){
      // "nembak"
      //  jika jumlah benih di rumah yang ditunjuk adalah 1 dan
      //  rumah yang di seberangnya adalah salah satu rumah musuh maka
      //  tambah benih dari rumah yang ditembak ke lumbung
      //  dan atur jumlah benih yang ada di rumah yang ditembak menjadi nol
       if(h<1&&p<7 || h>0&&p>7&&p<15){
        N[h*8+7]+=N[14-p],
        N[14-p]=0
       }
      // "mikul"
      //  jika jumlah benih dalam rumah yang ditunjuk adalah 1 dan
      //  rumah itu adalah milik musuh dan ada benih di rumah sebelahnya
      //  (bukan lumbung) maka tambahkan benih dari rumah sebelahnya ke lumbung
      //  dan atur jumlah benih di rumah sebelahnya menjadi nol
       if(h<1&&p>8&&p<14 || h>0&&p>0&&p<6){
        N[h*8+7]+=N[p-1]+N[p+1],
        N[p-1]=N[p+1]=0
       }
     }
     
     // gambar permainan
     Z(20);
     // jika penunjuk tidak berada di lumbung,
     // ganti pemain
     !(h<1&&p===7 || h>0&&p===15) && (h=h<1?1:0);
     
     // cek rumah-rumah pemain (kecuali lumbung)
     for(i=0,j=0;i<7;i++)N[i]<1&&j++;
     // jika semua rumah pemain tidak punya benih,
     // komputer menang!
     j>6&&Z(23,1);
    
     // cek rumah-rumah komputer (kecuali lumbung)
     for(i=8,j=0;i<15;i++)N[i]<1&&j++;
     // jika semua rumah komputer tidak punya benih,
     // pemain menang!
     j>6&&Z(23,2);
    
     // jika sekarang giliran komputer
     if(h>0)
      // jalankan
      // Kecerdasan Buatan
      // dengan menggunakan looping dan pemilihan acak
      for(;;){
       // jika rumah sampel lebih dari nol
       if(N[i=8+Date.now()%7]>0){
        // pilih rumah itu
        Z(i+1);
        break;
       }
      }
  5. Saat permainan selesai.
    }else if(task===23){
     // bukan giliran siapa-siapa
     h=-1;
     // beritahu siapa pemenangnya
     alert("You "+(param>1?"win":"lose"));
  6. Memilih rumah untuk bergerak selanjutnya.
    }else{
     // jika aktivitas langkah TIDAK berjalan,
     if(n<1)
     // atur:
     // - jumlah benih di tangan
     // - penunjuk
     // - jumlah benih di rumah yang dipilih ke nol
     s=N[p=task-1],
     N[p]=0,
     // jalankan aktivitas langkah
     Z(21);
    }

Jalankan otomatis fungsi ini sehingga langsung menyiapkan permainan.
})();

Kata Penutup

Mungkin hanya itu yang bisa kuceritakan tentang bagaimana kodeku bekerja. Aku teringat betapa senangnya jika berhasil menghemat satu bita.

Tidak ada komentar:

Posting Komentar