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.
Đượ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 →
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.
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.
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 đố.
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.
| Tham số quét | Phạm vi | Ý nghĩa |
|---|---|---|
| Đường dốc X | 15 → 85, bước 14 | các cột ngang sân |
| Đường dốc Y | 30 → 120, bước 18 | cá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 đặt | 1 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
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ó.