Langsung ke konten
AFM Studio
  • Halaman

    AFM Studio
  • Karya
  • Lab
  • Tentang
  • CV
  • Kontak
  • Proyek

    AksaraPerpustakaan pengetahuan Otorita IKN yang bisa dicari, dengan server memeriksa akses setiap pembaca di tiga tingkat
  • Daily TaqwaSistem presensi salat anti-manipulasi untuk ~2.000 pegawai OIKN di Masjid Negara IKN
  • Lantara v2Mesin perizinan Otorita IKN tempat administrator menambah jenis izin baru dari layar, tanpa developer
  • eKiosk IKNDua ruang kendali untuk Nusantara: konten kios dan pelacakan bus live dengan estimasi kedatangan yang menilai dirinya sendiri
  • E-Monev IKNPlatform pemantauan pembangunan Nusantara selama 23 tahun, melacak progres triwulan setiap unit terhadap 24 KPI
  • JDIH OIKNPortal dokumen hukum publik OIKN, dengan alur penerbitan terkendali dan ringkasan AI yang tidak pernah keluar dari server
  • Jejak PenanamanAplikasi absen acara penanaman pohon IKN yang membuktikan peserta hadir di lokasi lewat selfie ber-geofence
  • Dashboard SAKTIPipeline malam dan dashboard yang menggantikan unduhan anggaran manual di keenam satker OIKN
  • DoseRxKalkulator dosis untuk 127 obat yang membulatkan dosis ke tablet dan sirup yang dijual apotek Indonesia
  • CubiqPelatih speedcubing dengan timer setara kompetisi dan solver buatan sendiri untuk 8 puzzle utama
  • ScimotionPerpustakaan sains interaktif berisi 86 artikel, masing-masing dijelaskan bersama animasi yang bisa dikendalikan pembaca
  • WA Daily Scrum BotBot WhatsApp yang menagih laporan standup tim 14 orang dan menandai tugas yang macet berhari-hari

↑ ↓ untuk berpindah · Enter untuk membuka · Esc untuk menutup

Congklak

Congklak di browser tempat pemain memilih aturan daerah mana yang dipakai, setiap aturan disertai sumbernya

Tangkapan layar
set aturan daerah yang bisa dipilih
3
sumber dikutip, masing-masing dengan tingkat keyakinan
5
biji dihitung setelah setiap langkah
98
server permainan untuk main online
0
Di halaman ini

Masalahnya

Congklak adalah permainan papan menabur biji yang dimainkan di seluruh Nusantara dengan banyak nama: dakon, congkak, sungka. Aturannya berbeda di tiap daerah. Apakah permainan selesai saat seorang pemain tidak punya langkah sah, atau begitu ia punya tiga lubang kosong? Apakah biji terakhir yang jatuh di lubang kosong milik sendiri menembak lubang di seberangnya, atau justru mengakhiri giliran? Apakah biji harus berkeliling papan dulu sebelum boleh menembak? Sumber-sumber yang terbit tidak sepakat soal ketiganya.

Setiap aplikasi congklak yang saya temukan memilih satu versi dan menampilkannya sebagai "aturan". Dua pemain yang belajar di daerah berbeda jadi tidak tahu apakah aplikasinya yang salah atau mereka. Saya membuat versi ini untuk pemain Indonesia yang ingin mengenali permainan masa kecilnya, untuk pendatang baru yang perlu diajari, dan untuk siapa pun yang penasaran dari mana aturannya berasal.

Yang saya bangun

Pemain memilih aturan daerah mana yang dipakai

Aplikasi ini memuat tiga set aturan, masing-masing terhubung ke sumbernya. Satu mengikuti versi yang paling umum. Satu mengikuti dokumentasi budaya Kabupaten Sleman, tempat permainan selesai saat ada tiga lubang kosong. Satu lagi mengikuti lembaga kebudayaan nasional Malaysia, tempat biji baru boleh menembak setelah satu putaran penuh. Aturan yang aktif selalu disebutkan di layar. Tampilan perbandingan memutar ulang langkah yang sama di bawah dua aturan secara berdampingan, lalu menandai langkah pertama tempat keduanya berbeda.

Setiap sumber ditimbang dan dicatat

Halaman sumber memuat lima sumber dari tiga jenis: dokumentasi budaya pemerintah, rujukan khusus permainan papan, dan satu artikel berita. Setiap sumber punya tingkat keyakinan yang dinyatakan. Sumber dari Sleman bertentangan dengan dirinya sendiri soal kapan permainan selesai, jadi saya mencatat kedua versinya dan menerapkan yang dinyatakan paling tegas. Artikel berita itu membalik aturan menembak dibanding kedua jenis sumber lain. Saya mencatatnya sebagai perbedaan yang diketahui dan tidak menerapkannya. Saya juga menolak set aturan keempat, karena tidak ada sumber yang mendukung perbedaan yang akan ditambahkannya.

Aturan disimpan sebagai data, jadi daerah baru tidak butuh kode baru

Setiap set aturan adalah berkas data berisi pilihan aturan, sumber, dan perbedaan yang tercatat. Kode permainannya tidak pernah mengecek nama daerah. Build menolak set aturan yang tidak punya sitasi. Saat aturan putaran penuh dari Malaysia butuh sesuatu yang belum bisa dinyatakan formatnya, saya memperluas format itu dan tidak menyentuh logika permainan.

Ke-98 biji dihitung setelah setiap langkah

Papan ini berisi tepat 98 biji. Loop menabur yang menghilangkan atau menggandakan satu biji adalah bug klasik di keluarga permainan ini, dan bug itu diam: permainan tetap berjalan, tapi salah. Saya menulis pemeriksaan yang menghitung ke-98 biji setelah setiap tahap di setiap giliran, sebelum saya menulis logika menaburnya. Karena mesin aturannya selalu memberi hasil yang sama dari langkah yang sama, undo, replay, lawan komputer, dan permainan online semuanya dibangun di atasnya.

Situs jadinya saya uji secara manual

Test suite-nya menjaga mesin permainan dengan baik, tapi tidak bisa melihat bug di antarmuka. Lawan komputer tidak pernah bergerak saat animasi aktif. Tiga jenis huruf dalam desainnya tidak pernah dimuat. Papan menyusut jadi 160 piksel di ponsel. Selain itu, versi pertama menabur berlawanan arah jarum jam, padahal ketiga sumber menyebut searah jarum jam. Semua ini saya temukan dengan memakai situs hasil build di dua browser, dan sekarang ada tes tata letak yang mengunci arahnya.

Hasilnya

Congklak sudah live dan terbuka untuk umum, dalam bahasa Indonesia dan Inggris, dan set aturan tanpa sitasi akan menggagalkan deploy. Kita bisa bermain melawan teman di perangkat yang sama, melawan komputer dengan tiga tingkat kesulitan, atau melawan orang di perangkat lain lewat kode, tanpa server permainan. Biji berpindah dari lubang ke lubang dengan kecepatan yang bisa diatur, dan pratinjau menunjukkan di mana sebuah langkah akan berakhir sebelum dijalankan. Ada juga penampil replay dan mode belajar dengan tiga pelajaran di papan. Istilah tradisional seperti lumbung, biji, menembak, dan dakon tetap dipakai di antarmuka. Saya membangunnya pada 3 dan 4 Agustus 2026.

Di balik layarDetail teknis untuk engineer
  • applyMove(state, move, ruleset) → { state, events } murni: tanpa jam, tanpa keacakan tanpa seed, tanpa float, tanpa API browser. Sebuah permainan adalah daftar langkahnya ditambah id set aturan.
  • Papan berupa Int8Array(16) datar: indeks 0–6 adalah lubang pemain A, 7 lumbung A, 8–14 lubang B, 15 lumbung B.
  • lib/engine/conserve.ts menjumlahkan ke-16 posisi setelah setiap event, di setiap tes dan di build dev.
  • Set aturan adalah paket JSON di data/rulesets/ (umum, jawa-sleman, congkak-melayu), divalidasi dengan skema Zod saat build. Tidak ada if (region === 'jawa') di mesinnya.
  • Sumber: Sleman, Bantul, dan JKKN Malaysia (pemerintah), gambiter.com (rujukan khusus), detikEdu (media massa). detikEdu membalik aturan menembak dan dicatat tanpa diterapkan. Sapuan akhir di jawa-sleman adalah inferensi dan ditandai begitu di entri perbedaannya.
  • Satu giliran mengeluarkan event scoop, sow, relay, bank, capture, extraTurn, dan end; animasinya memutar ulang event itu. prefers-reduced-motion langsung menampilkan ringkasan tertulis.
  • AI memakai minimax dengan alpha-beta dan iterative deepening di Web Worker, pada kedalaman 2, 5, dan 9 ditambah noise ber-seed. AI ini menangani giliran tambahan, saat node tidak bergantian pemain.
  • P2P berjalan lewat WebRTC dengan tempel offer/answer manual atau kode pendek lewat broker PeerJS (di-import dinamis). Kedua peer mengonfirmasi id set aturan saat tersambung dan bertukar hash state setiap giliran; kalau tidak cocok, permainan dihentikan.
  • Dua bug P2P berasal dari lapisan transport: channel yang ditangkap by value sehingga handshake host tidak pernah terkirim, dan PeerJS yang mengembalikan data dalam bentuk berbeda dari yang dikirim. Lapisan jaringan sekarang berupa reducer murni dengan 22 tes yang berjalan tanpa jaringan.
  • Bug UI yang diperbaiki setelah uji di browser: dependensi effect yang tidak stabil dan terpicu setiap frame, effect anak yang berjalan sebelum induknya menulis, font yang dideklarasikan sebagai variabel CSS tapi tidak pernah dimuat, dan mx-auto pada flex item yang membatalkan stretch.
  • 7 halaman × 2 bahasa. Lima dependensi runtime. 120 tes di 13 berkas ditambah simulasi ribuan permainan acak per set aturan. Sekitar 8.600 baris TypeScript, 36 commit.

Tangkapan layar

Papan Permainan
Belajar
Aturan
Bandingkan Aturan
Tanding
Putar Ulang

Sedang merekrut, atau membangun hal serupa?

Saya terbuka untuk posisi full-time dan proyek freelance tertentu.