19 điểm bởi GN⁺ 2025-08-25 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Một kỹ sư phần mềm 15 năm kinh nghiệm chia sẻ trải nghiệm phát triển một trò chơi bài thời thơ ấu bằng Go
  • Khi phát triển “Truco” mà không có LLM (mô hình ngôn ngữ lớn), tác giả phải tự giải quyết thủ công mọi vấn đề như thiết kế UI và triển khai serverless, nên mất 3 tháng
  • Khi làm “Escoba”, tác giả dùng LLM để chuyển đổi mã backend và tăng mạnh tốc độ triển khai, phần lớn đã hoạt động chỉ sau 1 lần prompt
  • Ở phần sau, bài viết cung cấp hướng dẫn từng bước để bất kỳ ai cũng có thể làm game, thông qua ví dụ Tic-Tac-Toe cùng backend Go, chuyển đổi WASM và tích hợp React
  • Tuy nhiên, frontend React và việc quản lý trạng thái game dựa trên WASM vẫn cần tự debug và triển khai trực tiếp

Giới thiệu

  • Một kỹ sư phần mềm có 15 năm kinh nghiệm nhận ra rằng mình chưa từng thật sự tự làm và triển khai một trò chơi nào
  • Tác giả quyết định phát triển bằng Go một trong những trò chơi bài mà mình từng chơi cùng bạn bè thời nhỏ ở Argentina

Truco: 3 tháng không có LLM

  • Từ ngày 18/06/2024, tác giả bắt đầu phát triển trò chơi bài Truco với backend Go. Phần frontend được viết với kiến thức React chỉ ở mức tối thiểu
  • Việc triển khai UI là thử thách lớn nhất; để không phải cung cấp máy chủ, tác giả dùng TinyGo để transpile sang WASM (WebAssembly) rồi triển khai các tệp tĩnh lên GitHub Pages
  • Vì khi đó chưa dùng LLM, tác giả phải tự tìm hiểu mọi chi tiết và lặp đi lặp lại quá trình thử sai, nên mất khoảng 3 tháng để hoàn thành
  • Mục tiêu không phải quảng cáo hay kiếm tiền mà chỉ đơn giản là hoàn thiện trò chơi; ngay cả sau 1 năm phát hành, trò chơi vẫn được chơi đều đặn

Escoba: 3 ngày cùng LLM

  • Một năm sau, trong chuyến về Argentina thăm gia đình, tác giả dạy cho cháu mình trò chơi bài phổ biến thứ hai có tên Escoba
  • Lần này, tác giả dùng LLM (Claude), sao chép backend của Truco rồi mô tả luật của Escoba trong prompt và yêu cầu refactor mã
  • Ngay ở prompt đầu tiên, phần triển khai đã gần như hoàn hảo; chỉ còn một vài lỗi nhỏ và một số tính năng bổ sung cần chỉnh tay
  • Frontend vẫn cần nhiều ngày tự triển khai/debug. Giới hạn của LLM, kỹ năng React và môi trường đặc thù khi trạng thái game được quản lý trong WASM đều là các yếu tố gây khó khăn

Từng bước: cách tự làm game của riêng bạn

Phát triển backend

  • Backend cho game theo lượt có thể được thiết kế chức năng một cách rõ ràng
  • Để giữ kiến trúc serverless, việc tránh mô hình hai người chơi trực tiếp với nhau là lựa chọn thực tế nếu không có máy chủ thương mại

Phát triển frontend

  • Frontend cần thực hiện các việc sau
    • Yêu cầu backend tạo GameState mới
    • Hiển thị trạng thái trên UI
    • Cung cấp giao diện để chọn hành động hợp lệ
    • Gửi command tới backend khi áp dụng hành động
    • Nếu đến lượt bot thì gửi yêu cầu tới backend

Chuyển backend sang WASM

  • Để build mã Go thành WASM, dùng GOARCH=wasm GOOS=js go build
  • Có thể gặp vấn đề kích thước binary quá lớn, nên tác giả dùng TinyGo để giảm dung lượng
  • Để export các hàm kết nối với frontend, cần viết một entry point riêng trong Go (ví dụ: main_wasm.go) và tách nhánh khi build
  • Trong hàm main, cần chặn bằng select {} để chương trình không kết thúc ngay lập tức

Liên kết dữ liệu backend - frontend

  • Các struct linh hoạt của Go như GameState không thể serialize/deserialize trực tiếp trong WASM
  • Vì vậy, cần trao đổi toàn bộ dữ liệu bằng định dạng JSON
  • Theo tài liệu TinyGo, cả đầu vào và đầu ra đều được truyền nhận bằng JSON serialization

Giao diện frontend - backend

  • Ở frontend, các hàm backend được gọi trực tiếp
  • GameState chỉ được quản lý bên trong WASM và frontend không thể mutation; backend luôn là nguồn chân lý duy nhất
  • Sau khi biên dịch lại WASM, cần thay thế tệp tương ứng; bài viết cũng đưa ví dụ tự động hóa bằng Makefile

Môi trường chạy WASM

  • Để chạy được, cần đưa wasm_exec.js vào phần head, rồi dùng script đó để tạo instance và chạy

Kết luận

  • Làm game là một trải nghiệm thú vị, và tổ hợp Go, WASM, React là một cách tiếp cận mà ai cũng có thể thử
  • Sự hỗ trợ của LLM giúp năng suất tăng mạnh, nhưng năng lực frontend và kinh nghiệm debug vẫn rất quan trọng
  • Bất kỳ ai cũng có thể tự thử thách bản thân với việc phát triển game theo cấu trúc này, nên hãy thử xem

Chưa có bình luận nào.

Chưa có bình luận nào.