https://caro-game-demo-websocket.onrender.com/
Đây là dự án Cờ Caro (Gomoku) chạy trên Node.js, giao diện thuần HTML/CSS/JS và đồng bộ trạng thái bằng Socket.IO.
Mục tiêu của dự án:
- Dễ chạy, dễ học, không phụ thuộc framework nặng.
- Realtime mượt giữa 2 client.
- Quản lý phòng đơn giản bằng bộ nhớ RAM trên server.
- Tạo phòng / tham gia phòng bằng mã phòng.
- Rời phòng linh hoạt, giữ phòng để người mới có thể vào lại.
- Đồng bộ realtime nước đi giữa 2 người chơi qua Socket.IO.
- Kiểm soát lượt chơi: chưa tới lượt sẽ không được đánh.
- Check win 5 quân liên tiếp theo 4 trục (ngang, dọc, 2 đường chéo).
- Highlight ô thắng để nhấn mạnh đường chiến thắng.
- Làm mới ván đấu nhanh trong phòng.
- Thông báo đẹp bằng SweetAlert2.
- Server: Node.js HTTP server + Socket.IO
- Client: HTML + CSS + JavaScript thuần
- Lưu trạng thái phòng: In-memory (
Map) trên server
Lưu ý: vì dùng RAM nên khi restart server, dữ liệu phòng sẽ mất.
Tic-tac-toe/
├── public/
│ ├── index.html # Giao diện game
│ ├── style.css # CSS giao diện
│ └── app.js # Logic game + Socket client
├── server.js # HTTP server + Socket.IO server
├── package.json
├── package-lock.json
└── README.md- Node.js 18+ (khuyến nghị Node.js 20+)
- npm
npm installnpm startHoặc chạy chế độ dev (auto reload):
npm run dev- URL mặc định:
http://localhost:3000
Nếu cổng 3000 đang bận:
PORT=3001 npm start- Người chơi A bấm TẠO PHÒNG.
- Gửi mã phòng cho người chơi B.
- Người chơi B bấm THAM GIA PHÒNG và nhập mã.
- Hai bên đánh theo lượt X/O.
- Đủ 5 quân liên tiếp sẽ thắng.
createRoomjoinRoomsetuproomReadymakeMovemoveMadegameOverrestartGamegameRestartedleaveRoomopponentLeftroomError
- Chưa có cơ chế lưu lịch sử trận đấu.
- Chưa có xác thực người dùng.
- Chưa scale nhiều server instance (vì đang dùng RAM local).
- Thêm bảng điểm và lịch sử trận.
- Thêm bot AI chơi đơn.
- Thêm xác nhận khi reset/rời phòng.
- Dùng Redis Adapter cho Socket.IO khi scale nhiều server.
Xây dựng để học realtime và game logic theo cách đơn giản, rõ ràng, dễ mở rộng.