Current Article:

(Go) Realtime Number Guessing Game

Categories Projects

(Go) Realtime Number Guessing Game

Github: Number Guessing Game

Beberapa hari yang lalu, tepatnya tanggal 5 Juli 2025, aku jadi speaker di acara Google Developer Group Binus Online. Di sana aku sharing soal pemrograman dasar pakai bahasa Go. Kita bikin project simple bareng-bareng: sebuah Number Guessing Game yang interaksinya masih via terminal. Komputer bakal generate angka random dari 1 sampai 100, dan user diminta nebak sampai bener. Sederhana tapi cukup buat kenalan sama sintaks dasar Go, concurrency, goroutine, logic, dan I/O.

Tapi setelah acara selesai, aku nggak puas. Aku pengen game ini naik level lebih seru, interaktif, dan tentunya bisa dipake buat belajar arsitektur aplikasi yang lebih rapi. Jadi, aku putuskan buat ngembangin game ini jadi Realtime Number Guessing Game pakai WebSocket (Gorilla), dan backend-nya full Go dengan struktur clean architecture.

New Flow

Di versi lanjutannya ini, gamenya bukan cuma tebak angka komputer. Tapi user dan komputer saling tebak angka satu sama lain. Masing-masing menentukan angka rahasianya (bisa 3 digit, 4 digit, atau sesuai input awal). Lalu mereka gantian nebak.

Setiap digit yang benar dan posisinya tepat akan dapet 1 poin. Kalau berhasil nebak semua digit dengan posisi yang pas, langsung menang.

Clean Architecture & Modular Design

Salah satu goals utamaku di project ini adalah bikin kodenya rapih dan maintainable. Jadi aku terapkan prinsip clean architecture:

/cmd/server          → entrypoint
/internal/handler    → HTTP & WebSocket handler
/internal/service    → business logic
/internal/model      → struct & data model
/internal/store      → in-memory store (pakai mutex untuk concurrency safety)
/pkg/utils           → helper functions

Struktur Directory & Penjelasan

  • /cmd/server
    Berisi entry point aplikasi. Di sinilah WebSocket dan RestAPI server dijalankan, router di-setup, dan dependency dari service lainnya diinisialisasi.
  • /internal/handler
    Tempat semua WebSocket dan RestAPI handler. Tugasnya menerima request dari client, parsing data, lalu meneruskan ke service. Handler ini tidak mengandung business logic.
  • /internal/service
    Berisi seluruh business logic dari game. Di sinilah aturan main dijalankan: StartGame, ProcessGuess, dan HandleGuess.
  • /internal/model
    Menyimpan semua struktur data seperti GameSession, WSRequest, WSResponse, GuessRequest, GuessResponse, dan SessionRequest.
  • /internal/store
    In-memory store untuk menyimpan data session yang sedang berjalan. Menggunakan mutex agar aman ketika ada banyak koneksi aktif secara bersamaan (concurrent safe).
  • /pkg/utils
    Kumpulan helper functions seperti GenerateNumber, CountPoints, dan CountDigits.

Testing & Debugging

Karena interface-nya berbasis WebSocket dan bukan frontend UI, aku pake Postman buat simulasi client. Mulai dari submit angka user, kirim tebakan, sampai lihat skor semua bisa via WebSocket message.

Flow-nya jelas:

  1. User connect via WebSocket.
  2. Kirim jumlah digit dan angka rahasia milik user.
  3. Komputer generate angka acak.
  4. Giliran komputer nebak duluan, lalu user.
  5. Sistem cek posisi & nilai tiap digit, lalu update skor.
  6. Game terus jalan sampai salah satu berhasil tebak angka lawan dengan tepat.

Final Thoughts

Awalnya cuma game terminal buat pemula. Tapi dengan sedikit eksperimen dan semangat ngulik, project ini berkembang jadi game real-time yang bisa dipakai buat belajar WebSocket, state management, modular code, dan tentu aja Go.

Kalau kamu lagi belajar Go dan pengen ngerasain sensasi bikin project beneran dari nol, coba deh explore ide-ide kecil kayak gini. Dari iseng, bisa jadi portofolio juga.

Prev Gardenision