PHÒNG GIẢ LẬP GAME 2D VÀ 3D
Tài liệu thực hành của Lê Trung Kiên

1. Giải nén gói mã nguồn vào một thư mục riêng.
2. Mở Terminal hoặc CMD tại thư mục có index.html.
3. Nếu đã có Python 3, chạy: python -m http.server 8000
   Trên Windows có thể dùng: py -m http.server 8000
   Hoặc dùng một máy chủ HTTP tĩnh tương đương.
4. Mở http://localhost:8000/index.html trong trình duyệt hỗ trợ Canvas/WebGL.
   Không mở bằng file:// vì mã nguồn sử dụng ES modules.
5. Chọn 2D hoặc 3D, chọn độ khó, bấm Chơi ngay.
6. 2D: WASD/mũi tên. 3D: W/S tiến lùi, A/D bước ngang,
   trái/phải hoặc Q/E xoay camera. Kéo màn 3D để xoay góc nhìn.
7. Các nút trên màn hình hỗ trợ chuột và màn hình cảm ứng.
8. Bật đường BFS để xem đường tới ngọc gần nhất theo số bước.
   Đây chưa phải hành trình thu tất cả ngọc ngắn nhất.
9. Nếu đã có Node.js, chạy kiểm thử: node --test game-core.test.mjs
10. Đọc huong-dan-2d.html và huong-dan-3d.html để làm bài tập mở rộng.

CẤU TRÚC
index.html             Màn chơi và điều khiển.
game.css               Bố cục và màu sắc.
game-core.mjs          Dữ liệu, sinh mê cung, BFS, di chuyển, va chạm, luật chơi.
game-lab.mjs           Vòng lặp, nhận input, Canvas 2D, quản lý giao diện.
math3d.mjs             Phép nhân ma trận, lookAt, phối cảnh, biến đổi vật thể.
webgl-scene.mjs        Shader, hình học khối hộp, dựng cảnh WebGL.
cube-mesh.mjs          Hình học sáu mặt khối hộp dùng chung.
software-scene.mjs     Dựng tam giác 3D bằng CPU khi không có WebGL.
game-core.test.mjs     Các kiểm thử logic và ma trận (Node.js).
fonts/                 Noto Sans và giấy phép OFL.

GIỚI HẠN
Đây là dự án game web dùng để học tập, không phải dự án Android Java.
Game ưu tiên WebGL. Nếu thiết bị không có WebGL, bộ dựng 3D bằng CPU sẽ
dùng cùng ma trận phối cảnh và z-buffer ở độ phân giải thấp hơn.
Không dùng thư viện game bên ngoài, không cần khóa API.
Mã sinh bản đồ dùng seed xác định để có thể tái hiện thí nghiệm.
Đổi chế độ hoặc độ khó sẽ tạo lượt mới. Lượt chơi không được tự lưu.

GỢI Ý THỰC HÀNH
Thay vận tốc trong levels, thêm bình hồi lượt, thêm giới hạn thời gian.
Giữ game-core độc lập với giao diện và viết kiểm thử trước/sau thay đổi.
Đổi màu, sprite, ánh sáng không nên làm thay đổi kết quả va chạm.
