Dùng game Prince of Persia để đo tiến bộ của các mô hình AI tiên tiến nhất

Công nghệ25 tháng 9, 2026·9 phút đọc

Một lập trình viên đã giao cùng một dự án cho nhiều thế hệ mô hình AI: chuyển mã assembly 6502 gốc của Prince of Persia sang C#. Qua bốn vòng thử nghiệm, từ Claude Opus 4.6 đến Opus 5.5, ông nhận ra bước nhảy vọt lớn nhất không chỉ đến từ việc mô hình thông minh hơn, mà từ việc cho chúng khả năng tự quan sát game gốc và tự kiểm tra kết quả.

Dùng game Prince of Persia để đo tiến bộ của các mô hình AI tiên tiến nhất

Một lập trình viên đã dùng chính tựa game huyền thoại Prince of Persia làm thước đo để đánh giá các mô hình AI tiên tiến nhất. Ông giao cho mỗi mô hình cùng một nhiệm vụ: chuyển mã assembly 6502 gốc sang C#, không tự tay sửa một dòng code nào. Kết quả sau bốn vòng thử nghiệm cho thấy một bức tranh thú vị về cả sự tiến bộ của AI lẫn những giới hạn còn lại của nó.

Xuất phát điểm: một thử nghiệm có chủ đích

Tác giả lần đầu chơi Prince of Persia năm 1995 trên một chiếc IBM PC XT. Ba mươi năm sau, cảm giác về những khung hình animation rotoscope, tư thế bám mép tường của hoàng tử, hay tiếng cổng sắt đóng sầm vẫn không hề phai nhạt.

Năm 2012, Jordan Mechner công bố mã nguồn assembly 6502 gốc của phiên bản Apple II, được phục hồi từ những đĩa mềm 3.5 inch nằm trong hộp suốt hơn 20 năm. Vì C# là ngôn ngữ yêu thích của mình, tác giả quyết định làm một thử nghiệm: đưa mã nguồn đó cho AI và yêu cầu chuyển sang C#.

Nhiệm vụ duy nhất của tôi là chơi thành quả và nói xem chỗ nào sai.

Mỗi mô hình mới ra đời đều nhận đúng dự án đó, chỉ bằng câu lệnh, không đọc code, không chỉnh sửa thủ công.

Vòng 1 — Claude Opus 4.6: đọc được assembly nhưng chọn sai kiến trúc

Câu lệnh đầu tiên rất đơn giản: dùng mã assembly 6502 gốc, đọc các tệp màn chơi đã lưu và thử làm lại bằng C# console.

Trong hai ngày, Opus 4.6 tạo ra một game console bằng C#, rồi một trình chỉnh sửa màn chơi, rồi một bản đồ họa dùng Raylib. Nó phân tích đúng các tệp màn chơi gốc: phòng, ô gạch, cổng, vị trí lính canh. Nó thậm chí dựng được hình ảnh trông giống phiên bản Apple II.

Nhưng nó không chơi giống Prince of Persia. Các câu lệnh của tác giả những ngày đó kể lại câu chuyện:

  • "tệ quá, không chơi được, đồ họa chạy loạn xạ"
  • "nhân vật đã xuất hiện nhưng mọi thứ di chuyển đều sai... hoàng tử không đứng trên sàn"
  • "giờ nó rơi xuống dưới sàn và phím mũi tên không di chuyển được"

Vấn đề cốt lõi nằm ở kiến trúc. Hoàng tử di chuyển từng ô một, nhảy từ ô này sang ô khác. Trong khi game thật chạy các khung animation vẽ tay với một bước dịch chuyển nhỏ mỗi khung hình.

Vòng 2 — OpenAI Codex: sửa đẹp bề mặt, nền móng vẫn sai

Tác giả thử Codex với cùng mã nguồn và yêu cầu khắc phục phần đồ họa. Mô hình này đưa ra những sửa chữa nhỏ nhưng hợp lý: lọc điểm ảnh sắc nét để hình không bị mờ, nền sprite trong suốt, cổng mở có thể đi qua, và đỉnh cột không còn chặn đường.

Nhưng hoàng tử vẫn đứng sai vị trí và vẫn bị kẹt. Nó đánh bóng bề mặt, còn cỗ máy bên dưới vẫn hỏng.

Vòng 3 — Claude Opus 5: cho AI biết cách tự kiểm tra

Đây là lúc tác giả thay đổi luật chơi. Ông viết hai kỹ năng cho Claude Code: một cái điều khiển DOSBox (chạy chương trình, gửi phím, chụp màn hình) và một cái điều khiển bất kỳ chương trình Windows nào. Sau đó ông trỏ Opus 5 vào bản DOS gốc của Prince of Persia và yêu cầu so sánh với bản thật, chạy cho đến khi thành công hoặc đến 6 giờ sáng.

Nó làm việc suốt đêm, và điều đầu tiên nó làm là chẩn đoán đúng vấn đề kiến trúc. Cỗ máy cũ dùng lưới ô, còn game thật chạy theo chuỗi khung hình. Thế là nó xây lại toàn bộ engine theo đúng thiết kế gốc.

Rồi nó đi xa hơn mong đợi. Nó tìm ra định dạng các tệp của game DOS và đọc trực tiếp dữ liệu thật: từng khung animation của hoàng tử, đồ họa ngục tối, và cả 15 màn chơi. Nó tìm thấy các bảng animation gốc bên trong PRINCE.EXE bằng cách dò các mẫu byte nhận ra từ mã nguồn Apple II, và xác minh từng bảng bằng một giá trị đã biết trước khi tin dùng.

Đáng chú ý, không có dữ liệu có bản quyền nào của game bị đưa vào kho mã. Chương trình C# đọc trực tiếp từ bản cài DOS của chính tác giả.

Sáng hôm sau, tác giả có một phiên bản chơi được. Hoàng tử rơi xuống, tiếp đất, quay người, chạy, nhảy, rơi qua khe hở và khom người khi hạ cánh, tất cả với animation thật. Trong một phiên thứ hai, Opus 5 quan sát ảnh chụp màn hình khi tác giả chơi trong DOSBox và phát hiện lỗi nhận diện mép tường: nó tìm mép ở sai ô. Nó sửa bằng cách quay về đúng thủ tục assembly gốc.

Nhưng các màn chơi vẫn chưa đúng. Gạch, cổng và họa tiết trang trí đều hơi lệch, vì Opus 5 đặt từng chi tiết bằng cách so với ảnh chụp, còn chỗ nào không giải thích được thì đoán.

Vòng 4 — Claude Opus 5.5: một câu lệnh duy nhất

Khi Opus 5.5 ra mắt, tác giả chỉ đưa một câu lệnh: nhân vật chạy nhảy được rồi nhưng vị trí cổng và gạch đều khác, hãy xem có gì cải thiện được.

Mô hình này chọn cách tiếp cận hoàn toàn khác. Thay vì tinh chỉnh vị trí bằng mắt, nó tìm ra routine vẽ phòng gốc của game, vốn được ghi lại trong SDLPoP — bản port mã nguồn mở của game DOS do Dávid Nagy và cộng đồng princed.org phục dựng từ quá trình dịch ngược — rồi port chính routine đó. Kết quả là tệp DosRoomDrawer.cs, một bản chuyển thẳng sang C# của mã vẽ phòng trong SDLPoP.

Tài liệu của SDLPoP giải thích những điều mà các phiên trước chỉ đoán mò:

  • Mẫu gạch trông "ngẫu nhiên" thực ra không hề ngẫu nhiên. Game gốc khởi tạo bộ sinh số ngẫu nhiên từ phòng, hàng và cột, nên mọi bức tường trông giống hệt nhau ở mọi lần chơi.
  • Cổng ở đầu màn 1 thực chất đang mở trong dữ liệu màn chơi. Game gốc nhấn một nút ẩn khi bạn rơi xuống, đó là lý do bạn nghe thấy tiếng cổng đóng sầm.

Opus 5.5 cũng tự tìm ra vài thứ bằng cách đối chiếu với tệp của tác giả và game thật:

  • PRINCE.EXE thực ra đã bị nén bằng Microsoft EXEPACK. Các bảng trước đó chỉ hoạt động được vì tình cờ nằm trong vùng mà trình nén để nguyên. Nó viết một công cụ giải nén và đọc bảng vẽ gạch từ chính bản EXE của tác giả.
  • Vùng cắt ảnh chụp dùng ở các phiên trước lệch một hàng điểm ảnh, và giả thuyết cũ về "màu stencil" là sai. Những màu đó chính là màu xanh mòng két thật của cửa thoát.

Sau đó nó kiểm tra kết quả từng điểm ảnh so với game thật đang chạy trong DOSBox. Ở màn đầu của level 1, số điểm ảnh khác biệt giảm từ 8.429 xuống còn 2 — chỉ là một ngọn đuốc bị chụp ở thời điểm khác. Phòng thứ hai và cửa thoát ở level 3 cũng khớp.

Nó không hoàn hảo. Nó thay đổi cả vị trí vẽ sprite của hoàng tử dựa trên mã gốc, nhưng chỉ kiểm tra với hướng mặt của nhân vật. Khi quay hướng ngược lại, hoàng tử lún vài điểm ảnh vào tường. Tác giả đưa lại bản sao lưu trước khi thay đổi; mô hình chứng minh chuyển động không đổi ở mọi khung thử, tìm ra lỗi sprite và chỉ hoàn tác phần đó.

Lần đầu tiên, các màn chơi trông giống Prince of Persia thật sự.

Điều rút ra từ thử nghiệm

Bảng tổng kết của tác giả:

  • Opus 4.6: đọc được assembly 6502 và viết được C#, nhưng chọn sai kiến trúc và không tự nhận ra.
  • Codex: sửa những lỗi nhỏ tốt, nhưng không đặt câu hỏi về nền móng và chưa bao giờ chạy thử game.
  • Opus 5: khi có công cụ để nhìn game thật, nó chẩn đoán đúng kiến trúc, xây lại và đào dữ liệu thật ra khỏi tệp gốc. Đây là phiên bản chơi được đầu tiên.
  • Opus 5.5: từ một câu lệnh, đi tìm cách game gốc thực sự làm thay vì xấp xỉ, và chứng minh kết quả từng điểm ảnh.

Cần công bằng mà nói, chìa khóa của phiên cuối là kiến thức đã tồn tại sẵn: routine vẽ phòng mà Dávid Nagy và cộng đồng SDLPoP đã ghi lại sau nhiều năm dịch ngược. Opus 5.5 biết tìm ở đâu, port về và xác minh.

Khi được hỏi liệu nó có thể tự tìm ra tất cả chỉ từ tệp nhị phân DOS, mô hình trả lời thẳng thắn rằng "thành thật thì có lẽ không, trong một câu lệnh. Tôi không dịch ngược mã vẽ. Tôi đọc bản phục dựng của SDLPoP và port nó."

Bước nhảy lớn nhất không chỉ đến từ việc mô hình thông minh hơn. Nó đến từ việc cho chúng cách nhìn thấy bản gốc và tự kiểm tra chính mình.

Từ Opus 5 trở đi, mô hình có thể tự kiểm tra công việc của mình, và tác giả không còn là người thử nghiệm duy nhất.

Vẫn còn nhiều việc phía trước: lính canh và đấu kiếm, các màn cung điện, và vị trí tiếp đất chính xác của hoàng tử. Tác giả cho biết sẽ chạy lại đúng thử nghiệm này trên mô hình tiếp theo.

Toàn bộ mã nguồn cùng lịch sử đầy đủ của từng phiên làm việc được công bố trên GitHub, dưới giấy phép GPL-3.0-or-later vì dự án dựa trên mã của SDLPoP. Đây là dự án của người hâm mộ, phi thương mại, không liên kết với Ubisoft hay Jordan Mechner. Không có dữ liệu gốc nào của game được đưa vào dự án; chương trình C# đọc mọi thứ từ bản cài DOS của người dùng khi chạy.

Với độc giả Việt Nam quan tâm đến AI lập trình, câu chuyện này là một minh chứng cụ thể cho thấy kỹ năng đặt vấn đề và thiết lập vòng phản hồi quan trọng không kém năng lực của mô hình. Việc để AI tự chạy thử, tự so sánh với chuẩn gốc và tự sửa sai đang trở thành yếu tố quyết định trong các dự án chuyển đổi mã nguồn phức tạp.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗