Lập trình viên tạo game Snake chỉ với 4 số nguyên, gây tranh luận về giới hạn lập trình

Nhóm Cộng đồng BigGo
Lập trình viên tạo game Snake chỉ với 4 số nguyên, gây tranh luận về giới hạn lập trình

Một lập trình viên đã tạo ra game Snake hoạt động được chỉ bằng bốn biến số nguyên, thể hiện cách tiếp cận cực đoan đối với lập trình có giới hạn bộ nhớ. Dự án này lưu trữ toàn bộ trạng thái game - bao gồm bảng chơi, vị trí rắn, hướng di chuyển và vị trí táo - trong 4 số nguyên với tổng dung lượng khoảng 17 byte bộ nhớ.

Cách triển khai sử dụng lưới game 4x4 được lưu trong một số nguyên 32-bit, với mỗi bit đại diện cho một ô trên bảng. Dữ liệu game bổ sung như vị trí đầu rắn, vị trí đuôi, độ dài, vị trí táo và hướng điều khiển của người chơi được đóng gói vào một số nguyên 32-bit khác bằng các phép toán bitwise. Số nguyên thứ ba theo dõi hướng di chuyển của rắn, trong khi số thứ tư đóng vai trò là bộ đếm vòng lặp.

Phân tích bố cục bộ nhớ:

  • uint32_t map - 16 bit cho lưới trò chơi 4x4 (4 byte)
  • uint32_t vars - lưu trữ vị trí đầu (5 bit), vị trí đuôi (5 bit), độ dài (5 bit), vị trí quả táo (5 bit), hướng di chuyển (2 bit) (4 byte)
  • uint32_t shape - lưu trữ các hướng di chuyển, 2 bit cho mỗi hướng, tối đa 16 hướng (4 byte)
  • int8_t i - bộ đếm vòng lặp (1 byte)
  • Tổng cộng: 17 byte cho trạng thái cốt lõi của trò chơi

Cộng đồng đặt câu hỏi về tính thực tiễn

Cộng đồng lập trình đã nêu ra một số lo ngại về những tuyên bố đầy tham vọng của dự án. Các nhà phê bình chỉ ra rằng mặc dù trạng thái game cốt lõi vừa với bốn số nguyên, chương trình hoàn chỉnh vẫn cần thêm bộ nhớ để thực thi, bao gồm không gian stack, bộ đếm vòng lặp và thư viện curses được sử dụng cho đầu vào bàn phím và hiển thị.

Tuyên bố thực tế là bạn có thể giữ trạng thái game cho một bảng chơi 8x4 khá tối giản trong hai uint32_t, một uint64_t và một uint_8t. Đó không phải là toàn bộ trạng thái chương trình.

Một số nhà phát triển cho rằng tiêu đề đã thổi phồng thành tựu này, lưu ý rằng với những ràng buộc như vậy, ngay cả những game đơn giản hơn cũng trở nên khả thi. Một người bình luận hài hước nhận xét rằng việc giảm bảng game xuống chỉ còn 2x2 ô sẽ cho phép toàn bộ game vừa trong một số nguyên duy nhất.

Cách triển khai kỹ thuật nhận phản ứng trái chiều

Dự án phụ thuộc rất nhiều vào các định nghĩa macro phức tạp để thao tác từng bit trong các số nguyên. Khi những macro này được mở rộng trong quá trình biên dịch, chúng tạo ra code gần như không thể đọc được, đầy các phép toán bitwise và dịch chuyển bit. Tác giả thừa nhận cách tiếp cận này tạo ra những macro tệ hại và cảnh báo rằng kết quả nên được xem như một bài tập lập trình hơn là thực hành code tốt.

Việc nén hình dạng con rắn đặc biệt thu hút một số thành viên cộng đồng, họ lưu ý rằng nhiều mẫu bit về mặt vật lý là không thể có trong game rắn. Điều này cho thấy trạng thái game có thể được nén thêm nữa, mặc dù phải đánh đổi bằng độ phức tạp bổ sung.

Ràng buộc của trò chơi:

  • Lưới 4x4 = tổng cộng 16 ô
  • Chiều dài tối đa của con rắn bị giới hạn bởi khả năng lưu trữ hướng di chuyển
  • Sử dụng thư viện curses cho đầu vào/đầu ra (phụ thuộc bên ngoài)
  • Yêu cầu các macro thao tác bitwise để quản lý trạng thái

Cuộc tranh luận triết lý lập trình rộng hơn

Dự án đã khơi mào cuộc thảo luận về giá trị của những ràng buộc lập trình cực đoan. Trong khi một số nhà phát triển đánh giá cao nó như một bài tập tối ưu hóa thú vị, những người khác đặt câu hỏi liệu những giới hạn như vậy có phục vụ mục đích thực tiễn nào ngoài sự tò mò học thuật. Cuộc tranh luận phản ánh những căng thẳng rộng hơn trong lập trình giữa code dễ đọc, dễ bảo trì và các minh chứng kỹ thuật về việc sử dụng tài nguyên tối thiểu.

Mã nguồn hoàn chỉnh kéo dài khoảng 150 dòng và có sẵn trên GitHub , cho phép các lập trình viên khác kiểm tra các kỹ thuật thao tác bitwise được sử dụng. Bất chấp thành tựu kỹ thuật, sự đồng thuận cho rằng cách tiếp cận này hoạt động tốt hơn như một bài tập học tập hơn là một mẫu cho phát triển game thực tế.

Tham khảo: 4 integers are enough to write a Snake Game