- The Backdooms là một game HTML chạy trực tiếp từ mã QR, được phát triển với cảm hứng từ DOOM 1993 và The Backrooms
- Dự án này được thiết kế để thử nghiệm giới hạn lưu trữ và nén của mã QR, đồng thời trình diễn một phương pháp sáng tạo để lưu trữ các ứng dụng web nhẹ ngay bên trong mã QR
- Có thể quét mã QR để chơi game mà không cần kết nối Internet, nhờ việc game được phân phối dưới dạng nén cực mạnh
- Sử dụng API DecompressionStream để chạy game động ngay trong trình duyệt
- Tương thích với các trình duyệt di động hiện đại, và có thể tạo mã QR bằng Python cùng thư viện mã QR
Tổng quan dự án
- The Backdooms là một game HTML chạy trực tiếp từ mã QR, được phát triển với cảm hứng từ DOOM 1993 và The Backrooms
- Được thiết kế để thử nghiệm giới hạn lưu trữ và nén của mã QR, đồng thời trình diễn một phương pháp sáng tạo để lưu trữ các ứng dụng web nhẹ ngay bên trong mã QR
Tính năng
- Hoàn toàn ngoại tuyến: Sau khi quét mã QR, có thể chơi game mà không cần kết nối Internet
- Nén cực hạn: Sử dụng nén Zlib, luồng giải nén Gzip và mã hóa base64 để nén kết quả cuối cùng đến mức tối đa
- Trang web tự giải nén: Sử dụng API
DecompressionStream để chạy game động ngay trong trình duyệt
- Tương thích di động: Hoạt động trên các trình duyệt di động mới hỗ trợ API Decompressionstream (Edge, Yandex, Opera)
Cài đặt và phụ thuộc
- Về mặt kỹ thuật, chỉ cần một trình duyệt web hiện đại, nhưng để tạo mã QR cho game khoảng 2.5kb thì cần Python 3.7+, thư viện
qrcode, và pillow
Cách sử dụng
1️⃣ Chuyển game thành mã QR
- Chạy script bằng lệnh sau:
python3 QRGEN.py <your-game.html> <output-qrcode.png>
2️⃣ Quét mã QR
- Có thể dùng smartphone hoặc trình quét QR để mở game trực tiếp trong trình duyệt web
3️⃣ Chơi ngay 🎮
- Có thể thưởng thức The Backdooms mà không cần tải xuống hay cài đặt
Phân tích kỹ thuật
Quy trình nén
- Đọc HTML đầu vào: Đọc nội dung HTML được cung cấp từ tệp hoặc nguồn nhập liệu
- Nén Zlib + giải nén GZip: Nén HTML bằng Zlib và dùng Decompressionstream của GZip để đạt mức nén tốt nhất
- Mã hóa Base64: Mã hóa dữ liệu đã nén bằng Base64 để giữ ở dạng văn bản và có thể nhúng an toàn vào tệp HTML
- Nhúng vào wrapper HTML: Tạo một wrapper HTML tự giải nén dựa trên JavaScript. Wrapper này bao gồm hàm API DecompressionStream để tự động giải nén nội dung khi được mở trong trình duyệt
- Chuyển thành Data URI: Chuyển toàn bộ HTML sang định dạng
data:text/html;base64,... để có thể lưu trữ và chia sẻ dễ dàng mà không cần tệp vật lý
Logic tạo mã QR
- Hệ thống trước tiên cố gắng tạo phiên bản QR nhỏ nhất có thể bằng cách dùng
qr.make(fit=True) để điều chỉnh kích thước QR động theo độ dài nội dung
- Nếu phiên bản cần thiết vượt quá 40 (giới hạn chuẩn của mã QR), hệ thống sẽ ép dùng phiên bản 40 với
fit=False
- Sử dụng mức sửa lỗi thấp nhất là L để chứa được lượng dữ liệu tối đa có thể
- Nếu dữ liệu vẫn không vừa trong QR v40 mức L, quy trình sẽ thất bại và trả về thông báo lỗi rằng dữ liệu quá lớn để mã hóa vào mã QR
Kết quả
- Nếu thành công, mã QR sẽ được tạo và hiển thị
- Nếu thất bại, quy trình sẽ kết thúc với thông báo lỗi rằng dữ liệu quá lớn để mã hóa vào mã QR
Giấy phép
- Dự án này được phát hành theo giấy phép MIT và có thể tự do sử dụng, chỉnh sửa, chia sẻ
Ghi nhận
- id Software, đơn vị đã phát triển DOOM
- matttkc, người đã đề xuất ý tưởng này từ 5 năm trước
- Toby Fox, người đã tạo ra phần nhạc tuyệt vời của Undertale; phiên bản được host trên GitHub của game này sử dụng bản 8-bit của Bonetrousle
- Được phát triển bởi Kuber Mehta
1 bình luận
Ý kiến Hacker News
Thỉnh thoảng tôi hay bắt đầu những dự án ngẫu hứng, và đây cũng là một trường hợp như vậy. Đây là dự án tôi làm trong một tuần hồi đầu năm nay nhưng chưa chia sẻ, còn lần này tôi quyết định đăng lên
Dự án tiếp theo: biến LLM thành mã QR
Dự án thật sự rất ngầu. Nhờ đó tôi mới biết về URL
data:. Tôi có biết URI schemedata:, nhưng không biết nó có thể được dùng như một URL hoàn chỉnh. Tôi từng nghĩ liệu có thể nhét cả một trò chơi vào mã QR không, nhưng lại lầm tưởng rằng cần một liên kết HTTP(s) nên đã gác ý định đó lại. Việc này truyền cảm hứng cho tôi rất nhiều: có thể nhét cả một trò chơi vào mã QR không? [Liên kết YouTube]Mong bạn thêm vài ảnh chụp màn hình vào kho lưu trữ. Tôi đang xem trên điện thoại, nhưng không rõ vì sao chỉ thấy 3 nút và một màn hình đen
Tôi đã quét bằng trình quét mã QR mặc định của iPhone, nhưng nó báo "Không có dữ liệu khả dụng"
Bạn nên cập nhật CSS của canvas thành
image-rendering: pixelatedđể hình ảnh hiển thị sắc nét thay vì bị mờMong bạn tiếp tục tạo ra những thứ tuyệt vời, kuberwastaken
Dự án quá đỉnh. Tôi đang chờ "mã QR tự chứa" được thêm vào canitrundoom (dù về mặt kỹ thuật có được chấp nhận hay không thì tôi không chắc)
Dự án này tạo cảm giác như đang tiến gần đến Snow Crash. Tôi tự hỏi liệu chỉ nhìn mã QR thôi có đang làm biến đổi não mình không :-D Công việc thật đáng kinh ngạc
Rất hay. Chỉ góp ý nhỏ thôi: DOOM không dùng raycasting. Dự án này giống Wolfenstein 3D hơn, và Wolf3D mới là game dùng raycasting