PlayPendium
Contraption · Thức ăn cho tư duy

Một cấp độ tự chứng minh là giải được

Trò chơi không bao giờ tự tay soạn một câu đố. Nó nuôi lớn câu đố từ một con số duy nhất, rồi tự chơi câu đố đó với chính mình để bảo đảm nó không quá tầm thường mà cũng không bất khả thi, trước khi bạn kịp nhìn thấy.

Ngày hôm nay 1 con số, được băm thành hạt giống
trở thành
Câu đố hàng ngày 1 sân y hệt cho tất cả mọi người

Được viết và biên tập bằng tiếng Anh. Bản tiếng Việt này được tạo ra bằng dịch máy; ở những chỗ cần độ chính xác, bản gốc tiếng Anh là bản có thẩm quyền. Đọc bản gốc bằng tiếng Anh →

01 · Mọi thứ từ một con số

Cả một thế giới gói trong một hạt giống

Một cấp độ Contraption không được lưu ở bất cứ đâu. Không có tệp nào liệt kê khung thành nằm ở chỗ nào hay các gờ được sắp xếp ra sao. Thay vào đó, toàn bộ cấp độ, điểm xuất phát của quả bóng, vị trí khung thành, số lượng và cách bố trí các bức tường cố định, kho bộ phận được trao cho bạn, đều được tính toán từ một con số khởi đầu duy nhất gọi là hạt giống. Đưa cho bộ sinh cùng một hạt giống và bạn sẽ nhận được, chính xác từng byte, cùng một câu đố. 1

Điều đó khả thi bởi nguồn "ngẫu nhiên" duy nhất của bộ sinh là một bộ sinh số giả ngẫu nhiên nhỏ và tất định. Bộ mà Contraption dùng là mulberry32, một bộ sinh 32 bit gọn nhẹ do Tommy Ettinger viết, bạn có thể nhận ra nó qua hằng số đặc trưng 0x6d2b79f5, được cộng vào trạng thái ở mỗi lần rút số. 2 Nó nhanh, chỉ gói gọn trong vài dòng, và, quan trọng nhất, nó hoàn toàn không ngẫu nhiên: đó là một dãy toán học cố định chỉ trông như bị xáo trộn. Cho nó một điểm bắt đầu và nó sẽ sinh ra mãi mãi cùng một dòng số. Bộ sinh cấp độ sau đó đọc dòng số ấy để quyết định đặt mọi thứ ở đâu.

02 · Câu đố hàng ngày

Một ngày tháng trở thành thử thách chung như thế nào

Chế độ Hàng ngày dựa vào tính tất định này để làm một việc mang tính cộng đồng. Hạt giống của nó không ngẫu nhiên, mà được chế tạo từ lịch. Trò chơi lấy ngày hôm nay theo giờ quốc tế, ghi vào một chuỗi ngắn như "contraption:2026-7-28", rồi đưa đoạn văn bản đó qua một hàm băm để cô đặc nó thành một số 32 bit. 1

Hàm băm là FNV-1a, một bộ trộn phi mật mã nổi tiếng: nó bắt đầu từ một giá trị bù cố định, số thập phân 2166136261, tức 0x811c9dc5, và với mỗi ký tự, nó trộn chữ cái vào bằng phép XOR rồi nhân với số nguyên tố FNV 16777619. 3 Kết quả là một con số ổn định cho một ngày nhất định và khác biệt hoàn toàn từ ngày này sang ngày khác, nên chỉ đổi một ký tự trong ngày tháng là hạt giống bị xáo trộn hoàn toàn. Vì lịch là như nhau với mọi người, nên hạt giống cũng như nhau, và câu đố cũng như nhau. Hai người xa lạ ở hai đầu thế giới mở Hàng ngày và đối mặt với cùng một sân y hệt, và chính điều đó khiến việc so sánh điểm số trở nên có ý nghĩa.

Thử thách hàng ngày công bằng không phải vì một máy chủ gửi cùng một cấp độ cho mọi người, mà vì bản sao của mỗi người tự tính lại cùng một cấp độ từ cùng một ngày tháng.

03 · Bộ sinh tự hoài nghi chính mình

Loại bỏ câu đố tự giải chính nó

Hình học ngẫu nhiên thì dễ; hình học ngẫu nhiên hay thì không. Một bộ sinh chỉ rải khung thành và vài cái gờ đôi khi sẽ tạo ra một cấp độ mà quả bóng, thả từ trên xuống, cứ thế rơi thẳng vào khung thành. Đó không phải câu đố, đó là một đoạn phim cắt cảnh. Vì vậy, trước khi Contraption chấp nhận một thế giới ứng viên, nó chạy một bài kiểm tra âm thầm mà mã nguồn gọi là preSolved: nó mô phỏng cấp độ khi chưa đặt bộ phận nào và kiểm tra xem quả bóng trần có tới được khung thành chỉ nhờ trọng lực hay không. Nếu có, cấp độ bị vứt bỏ và bộ sinh quay số lại. 1

Đây là một sự đảo ngược tinh tế so với cách bạn thường nghĩ về một động cơ vật lý. Chính hàm simulate() vốn diễn lại cỗ máy của bạn lại được quay vào trong, ngay lúc sinh cấp độ, để kiểm định độ khó của chính cấp độ đó. Động cơ vừa là trọng tài cho lời giải của bạn, vừa là người kiểm tra chất lượng của câu đố.

04 · Một bộ giải tí hon, tích hợp sẵn

"Có thể làm được với một bộ phận không?"

Loại bỏ cấp độ quá dễ mới chỉ là một nửa công việc. Mối nguy còn lại là cấp độ bất khả thi, một khung thành nép ở nơi không cách sắp xếp bộ phận nào chạm tới được. Contraption đề phòng điều này bằng một bộ giải vét cạn nhỏ tên là plausiblySolvable. Nó không suy nghĩ khéo léo gì. Nó chỉ thử. 1

Cụ thể, nó quét một đường dốc duy nhất qua một lưới các vị trí trên sân, và ở mỗi vị trí, thử nghiêng nó theo bốn hướng khác nhau. Với mỗi lần đặt thử như vậy, nó chạy mô phỏng đầy đủ và hỏi: đường dốc duy nhất đó có dẫn quả bóng về đích không? Ngay khi có một cách đặt thành công, cấp độ được tuyên bố là giải được và gửi tới bạn. Nếu không cách nào thành công sau cả lượt quét, bộ sinh ưu tiên bỏ cấp độ đó và thử một hạt giống mới.

Cuộc tìm kiếm của bộ giải một bộ phận, một lưới thô, mỗi vị trí bốn góc nghiêng
Tham số quétPhạm viÝ nghĩa
Đường dốc X15 → 85, bước 14các cột ngang sân
Đường dốc Y30 → 120, bước 18các hàng dọc sân
Các góc đã thử4±0.45 và ±0.8 radian
Kiểm tra mỗi lần đặt1 lần mô phỏng đầy đủquả bóng có tới được khung thành không?

Cần thành thật về điều mà bài kiểm tra này chứng minh, bởi mã nguồn cũng thành thật về nó: lời chú thích gọi đây là một "phép kiểm tra tính hợp lý rẻ tiền … không vét cạn." Một cấp độ vượt qua chắc chắn có ít nhất một lời giải thô sơ bằng một đường dốc. Một cấp độ không vượt qua vẫn có thể giải được bằng một cái quạt, một bánh răng, hay một đường dốc khéo hơn mà lưới chưa từng thử, nên bộ sinh không coi thất bại là bằng chứng của sự bất khả thi. Nó giữ lại thế giới không tầm thường đầu tiên tìm được làm phương án dự phòng, và nếu bốn mươi lần thử trôi qua mà không có lời giải một bộ phận nào gọn gàng, nó gửi phương án dự phòng đó thay vì lặp mãi không dừng. Kết quả là một bảo đảm thực dụng: không bao giờ có chiến thắng miễn phí, gần như luôn có một đường đi thật sự, và không bao giờ phải chờ đợi vô tận cho cấp độ "hoàn hảo". 1

05 · Ý tưởng sâu xa

Sinh-rồi-kiểm, dạng trí tuệ khiêm tốn nhất

Lùi lại một bước và bộ tạo cấp độ của Contraption là một ví dụ trong sáng cho một mẫu hình giải quyết vấn đề rất cũ và rất tổng quát: sinh và kiểm. Đề xuất một ứng viên ngẫu nhiên; đối chiếu nó với các yêu cầu của bạn; giữ lại nếu đạt, bỏ đi và đề xuất lại nếu không. Đó là vòng lặp đứng sau nội dung thủ tục trong vô số trò chơi, sau phần lớn tính toán tiến hóa, và, nếu nheo mắt một chút, sau cả chính chọn lọc tự nhiên: đột biến đề xuất, môi trường kiểm tra, kẻ sống sót tồn tại. 4

Điều khiến phiên bản của Contraption trở nên thanh lịch là bài kiểm tra không phải một thước đo gần đúng rẻ tiền cho tính chơi được, nó chính là tính chơi được. Bộ sinh không ước lượng một cấp độ có công bằng hay không bằng cách đếm gờ hay đo khoảng cách. Nó thực sự chơi cấp độ đó, hai lần: một lần với sân trống để chắc rằng đó không phải một món quà cho không, và một lần với một đường dốc thăm dò để chắc rằng có tồn tại một đường đi. Chính thứ vật lý tất định sẽ phán xét lời giải của bạn cũng là thứ vật lý đã thẩm định câu đố. Không có một "bộ kiểm định cấp độ" riêng biệt nào có thể lệch pha với luật chơi thật, bởi chỉ có một bộ luật duy nhất, được dùng cho mọi thứ.

Và vì tất cả đều tất định, cuộc kiểm định này không dính dáng đến may rủi theo cả hai chiều. Hạt giống hàng ngày không thể thông đồng để trao cho người chơi này một sân dễ hơn người chơi kia, và cũng không thể trao cho ai một sân bất công, bởi trước khi trở thành một thử thách, cấp độ đó đã sống sót qua việc được chơi, bởi chính trò chơi, với chính nó.

Sources & notes
  1. Seed-to-level generation, the preSolved rejection test, the plausiblySolvable one-ramp solver (grid ranges, four angles, up to 40 attempts, fallback world), and the daily-seed date string are all read directly from Contraption's own game engine and random-number code. Grounded in the game's code, not invented.
  2. mulberry32 is a compact 32-bit pseudo-random generator by Tommy Ettinger; it advances its state with the constant 0x6d2b79f5 and has a period of 2³². Author's reference gist (with his own later caveats on its equidistribution). gist.github.com/tommyettinger/46a874533244883189143505d203312c
  3. "Fowler–Noll–Vo hash function." Wikipedia, the 32-bit FNV offset basis is 2166136261 (0x811c9dc5) and the FNV prime is 16777619 (0x01000193); FNV-1a XORs each byte into the hash first and then multiplies by the prime. en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function
  4. On generate-and-test / "generation followed by evaluation" as a general search and problem-solving strategy, and its kinship with procedural generation and evolutionary methods. See "Procedural generation," Wikipedia. en.wikipedia.org/wiki/Procedural_generation
  5. Further reading on Procedural generation, [2410.15644] Procedural Content Generation in Games: A Survey with Insights on Emerging LLM Integration. arxiv.org.
  6. Further reading on Procedural generation, Procedural Content Generation in Games: A Survey with Insights on Emerging LLM Integration. doi.org.
  7. Further reading on Procedural generation, "Procedural City Generation with Combined Architectures for Real-time V" by Gr. open.clemson.edu.
Was this worth reading?
← Back to Contraption
PlayPendium · About · Contact · Privacy · Terms · Cookies · Accessibility · Copyright · Browse all games · Inspirations · © 2026