all writing

Xoá PUBG, tự làm game với Claude

Tại sao nên đọc bài này?

  • Kiến thức làm game = 0 thì có làm game được không, và quá trình mình làm thử.

  • Xem Claude bá khí thế nào?

  • Tản mạn chút xíu.

Giật tít thế thôi chứ mình không phải game developer với cũng không có kiến thức gì với việc làm game cả.

Mình chơi PUBG từ hồi nó mới ra mắt và khá là thích game này, tính đến nay đã gần 8 năm. Nhưng dạo này đang dính phốt nên mình xóa PUBG rồi, game này mình làm 2 tuần trước khi PUBG bị tẩy chay ở VN.

Bài này không phải để khoe và kêu gọi mọi người chơi game nha. Game vibe code, đồ hoạ miễn phí trên mạng, chủ yếu chia sẻ quá trình mình làm như thế nào thôi.

Bắt đầu từ con số 0

Một ngày đang lướt mấy trang tin công nghệ coi có gì mới, thấy mấy cái 3D animation hay hay làm bằng PlayCanvas, một framework làm 3D chạy trên web, vào coi mấy game mẫu làm bằng nó thấy cũng xịn eyes emoji. Rồi bỗng nghĩ hay là làm game nhỉ? Xong mình bật Claude rồi gõ luôn:

"I want to build a game. I'm a software engineer and I don't have any knowledge about game engines. Onboard me."

Claude giải thích cho mình mấy khái niệm cơ bản khi làm game trước. Cái nào không hiểu thì mình hỏi, kêu nó giải thích lại. Mình cũng phải tự đi tìm hiểu xem mấy cái thuật ngữ game đó là gì?

Gameplay thì lúc đó chưa bàn tới, việc đầu tiên là chọn framework. Mình kể cho Claude về PlayCanvas với mấy game mẫu, hỏi có cái nào tương tự không. Nó đưa thêm Three.js với Babylon.js, so sánh ba cái rồi khuyên dùng Babylon.js. Chat chit thêm một lúc thì mình chọn Babylon, dù sao mình cũng không có kiến thức gì để cãi, với lại thấy star trên git của Babylon.js cao hơn upside_down_face emoji.

Bước đầu chưa có súng ống gì, chỉ cần nhân vật đi lại được trong một cái đấu trường dựng tạm bằng khối hộp:

"Ok, dùng Babylon.js, bắt đầu milestone 1. Spawn một team làm cho mình. Mình thích game bắn súng góc nhìn thứ nhất chạy trên trình duyệt, đồ hoạ khối hình đơn giản, màu sắc sặc sỡ."

"Spawn một team" là kêu Claude chia việc cho nhiều agent, tức là mấy bản Claude khác chạy song song, mỗi bản lo một phần: bản đồ, di chuyển, giao diện. Con Claude chính (con mình đang chat) đứng giữa điều phối, xong thì ráp lại, test rồi lưu.

Mình không đọc code, chỉ xem cấu trúc thư mục với công nghệ nó dùng để biết nó đang dựng gì, còn lại là mở game lên chơi rồi feedback.

Khoảng 1 tiếng sau nhân vật đã đi lại được. Lỗi cũng có liền, buồn cười nhất là phím ngồi ban đầu có cả Ctrl, mà bấm Ctrl + W (ngồi + đi tới) thì… trình duyệt đóng luôn cái tab joy emoji.

Đi được, bắn được, nhưng trông như Minecraft

Vài tiếng sau đã có hình nộm để bắn, có màn hình vào game, đi lại, nhảy, ngồi được. Cũng wow phết.

Màn hình vào game của bản đầu tiên

Súng ở đây không phải kiểu bấm là trúng đâu nha, viên đạn bay thật và rơi theo trọng lực, bắn xa thì phải ngắm cao lên. Còn tiếng súng thì chưa có file nào, toàn do code tự chế ra.

Đúng kiểu game bắn súng khối hình mình nói lúc đầu. Nhưng chơi một hồi thì thấy không ổn sweat_smile emoji, mình nhắn:

"Có thể dùng nhân vật, súng thật hơn không, thay vì mấy khối hình (trông như Minecraft). Mình muốn chân thực."

Chưa tới 2 tiếng mà mình đã tự chê chính cái gu mình vừa chọn upside_down_face emoji.

Claude có nói trước mấy cái phải đánh đổi: đại khái là phải sử dụng model 3D để thay thế cái nó đang tự dựng.

Đoạn này phải ngồi research về 3D model một tí mới hiểu là gì và kêu con Claude đi tìm, recommend một số nguồn miễn phí.

Sau đó nó cho một agent đi tìm asset miễn phí, kiểm bản quyền từng món. Claude liệt kê danh sách 25 file cần tải, mình duyệt xong nó kêu mình tự tải nhưng mình lười, mình bảo nó dùng computer-use skill để tự tải. Nguồn thì từ Sketchfab với Mixamo (chỗ tải model 3D và animation nhân vật).

Súng thật, lính thật

Cùng cái đấu trường đó, giờ đã có súng thật với lính thật:

Đây là chỗ mình bất ngờ nhất. Tải model về, đổi định dạng, nén mỗi cây súng từ khoảng 25 MB xuống 4 MB, cắt animation, gắn vào tay, căn ống ngắm,… mấy cái này mình không biết làm, và cũng không phải làm exploding_head emoji. Mình wow quá nên quay lại video để viết blog với gửi cho bạn bè coi sunglasses emoji.

Mấy chi tiết nhỏ cũng làm kỹ: lính trúng đạn thì giật người, bắn 5 viên thì ngã sấp xuống, lộ chữ SWAT sau lưng luôn.

Âm thanh, máu và lựu đạn

Chơi tiếp thì lại feedback tiếp. Đầu tiên là âm thanh, Claude thay tiếng súng tự chế bằng bản thu thật, nghe được cả hướng súng bắn. Bị bắn tỉa từ xa thì phải hơn 1 giây sau mới nghe tiếng nổ, y như ngoài đời luôn. Nó còn cảnh báo trước tiếng rút chốt lựu đạn thật ra là… tiếng chìa khoá joy emoji.

Nghe thử xong mình nhắn:

"The sniper sound is too quiet. Enhance it."

Hoá ra lúc chỉnh âm lượng cho đều, sniper bị kéo xuống còn nhỏ hơn cả súng trường. Sửa xong thì sniper nổ to hẳn, có thêm cả tiếng dội.

Tiếp là máu:

"Shooting the body should show blood instead of a highlight."

Lúc test thì phát đầu tiên không thấy máu đâu, vì đạn trúng tấm tôn đứng trước con lính upside_down_face emoji.

Làm xong thì máu có, nhưng Claude tự nhận là "khá kín đáo" trên bộ đồ màu tối. Đậm cỡ nào thì nó để mình tự chỉnh, vì "đủ rõ chưa" là cảm giác, nó không đoán thay được.

Rồi đến phần equipment, mình lại chat: "Spawn a team for equipment after the map.". Ra một đội 4 agent làm đủ thứ: lựu đạn, khói, bom xăng, medkit, giáp, túi đồ kéo thả kiểu PUBG.

Nhưng nhìn thì vẫn giả:

"The equipment, the effects & the throwing animation look fake. Can we use open 3D models downloaded from the internet?"

Claude đi tìm tiếp. Tay ném thì may mắn tìm được của đúng tác giả làm bộ súng, cùng găng tay đen, cùng tay áo, ráp vào khớp luôn, phần rút chốt với thìa lựu đạn bật ra là nó tự làm thêm bằng code.

Bản đồ, phần khoai nhất

Cái đấu trường 70×70 m chơi một hồi thấy chật. Mình muốn một bản đồ không cần to như PUBG nhưng đủ cho 10 người chạy nhảy.

Claude tính theo mật độ người chơi của mấy map PUBG rồi đề xuất 600×600 m, chạy băng qua mất khoảng 1 phút. Mình chọn luôn 1×1 km cho rộng sunglasses emoji. Chọn thì dễ, làm mới thấy khoai.

Không có nhà để xài. Asset miễn phí thì có súng, có lính, nhưng nhà thật mà bản quyền rõ ràng, vào được bên trong thì tìm không ra. Thế là Claude cho agent tự dựng nhà bằng code, ra được 12 kiểu: nhà nhỏ, nhà 2 tầng, kho thóc, doanh trại, tháp canh, trạm radar,… Test kỹ tới mức ngồi thì nhảy qua cửa sổ được, còn đứng thì không.

Bộ nhà Claude tự dựng, xem thử trước khi đặt lên bản đồ

Xong thì bản đồ có thị trấn, nông trại, căn cứ quân sự, đồi radar, mỏ đá, rừng, còn cái đấu trường cũ thì giữ lại làm bãi tập.

Đứng trên tháp radar nhìn xuống bản đồ 1 km

Rồi tới FPS. Mình chơi thử rồi báo "It's about 70 fps.", chơi được nhưng chưa đã. Claude không tối ưu mò mà làm một bài đo trước, mỗi lượt tắt bớt một thứ để coi thứ nào nặng.

Mà agent không có card đồ hoạ, nên người ngồi chạy bài đo là… mình, chạy xong copy kết quả dán lại cho nó upside_down_face emoji.

Bài đo đang chạy, góc trên bên trái đang 73 FPS

Kết quả khá bất ngờ: thứ làm game chậm không phải cây hay lính, mà là màn hình Retina bắt game vẽ quá nhiều điểm ảnh. Hạ độ phân giải xuống chút xíu là game mượt hẳn luôn exploding_head emoji.

Cây rung, nhìn xuyên tường. Chạy trong rừng thì cây cứ nháy nháy, agent đếm thử thì có chỗ đứng nhích qua lại 20 giây mà cây nháy tới 2.016 lần exploding_head emoji. Sửa xong thì hết nháy, còn vụ ngắm sniper thấy xuyên tường là do hàng rào với tường bị dựng sai. Nhân tiện mình kêu rải thêm chỗ để nấp: cây gốc to, đá tảng, xác xe, bao cát.

Rồi chạy thì màn hình cứ giật. Hoá ra sau một lần sửa code, mặt đất có mấy chỗ gồ lên như những bức tường tí hon, làm nhân vật vấp chân liên tục.

Backend, team "chuyên nghiệp"

Game nhiều người chơi thì phải có backend. Mình nhắn:

"Spawn một team thiết kế backend chuyên nghiệp hỗ trợ nhiều người chơi. Yêu cầu backend hiệu năng cao"

Claude dựng một đội 4 vai: người lo đường truyền mạng, người lo hiệu năng, người lo hạ tầng, và một kiến trúc sư trưởng đứng trên cùng. Mấy agent này chỉ viết tài liệu với chạy thử.

Vui nhất là kiến trúc sư trưởng đọc bài của ba đứa kia và tìm ra 33 chỗ tụi nó mâu thuẫn nhau. Y như làm đồ án nhóm, mỗi đứa làm một kiểu, tới lúc ráp mới cãi nhau, xong một AI khác phải đứng ra làm trọng tài joy emoji.

Agent còn nhắc tới luật phát hành game ở Việt Nam, mình trả lời không cần vì game chỉ chơi nội bộ. Luật chơi thì mình chốt: bắn đồng đội được, người chơi chắn nhau được, gục thì đồng đội giữ phím 5 giây để đỡ dậy.

Kế hoạch ghi phần này mất khoảng 5 tuần, tính cho một đội người. Thực tế chưa tới 5 tiếng sau đã mở được hai tab trình duyệt nhìn thấy nhau chạy qua lại. Rồi bắn nhau qua mạng được luôn.

Có bot

Yêu cầu của mình với bot là không được ăn gian. Bot chỉ được "bấm phím" giống người, chỉ biết những gì nó nhìn thấy với nghe thấy, bị khói chặn thì cũng không thấy gì. Nhờ vậy sau này server dùng lại đúng mấy con bot đó được.

Vòng đầu thì fail thật sự: bot không tự nhặt được súng, cả trận bắn đúng… 0 viên joy emoji. Sửa lại cho bot biết lục nhà tìm súng, bị kẹt thì nhảy hoặc lùi lại, dừng né trước khi bắn. Mixamo không có animation đỡ đồng đội dậy, nên agent xài tạm animation hô hấp nhân tạo, giờ bot làm CPR cho nhau sweat_smile emoji.

Claude nhắn báo "Tonight I landed 31 commits", bot có rồi, trang bị thật có rồi, bắn nhau qua mạng có rồi. Câu đầu tiên mình hỏi là:

"How do I play a bot match?"

Nó làm xong cả hệ thống bot, còn mình thì hỏi nút Start nằm đâu joy emoji. Chơi được rồi thì mình cầm sniper ăn top 1 video_game emoji

Đưa Sài Gòn vào game

Thật ra từ trước đó mình đã tò mò chuyện lấy một chỗ có thật làm bản đồ, nên nhờ Claude khảo sát thử lấy data từ Google Maps để làm bản đồ. Cái nó check đầu tiên là có được phép dùng hay không: Google Maps thì cấm, còn OpenStreetMap là bản đồ mở do cộng đồng vẽ, chỉ cần ghi credit là dùng được.

Rồi mình gửi một tin dài, trong đó có câu "let me pick a real-life location in the MVP too", xong đi ngủ. Sáng dậy có 4 cái map lạ hoắc. Vậy thì mình nhắn luôn "Please build a map called Ngã Tư Hàng Xanh… can we have that feature?", rồi thêm một chỗ ở Phú Nhuận.

Ngã Tư Hàng Xanh trong game, dựng từ OpenStreetMap

Đường là đường thật, chùa Phước Viên, nhà thờ Hàng Xanh, chung cư Mỹ Đức cũng nằm đúng chỗ. Nhà ống hai bên đường thì Claude tự sinh thêm cho đông.

Có một chuyện khá buồn cười. Mình kêu "Remove political names from the map." để tránh mấy địa danh nhạy cảm, xong lại kêu "Show road names on the map (for big, long roads only).". Mà đường lớn ở Sài Gòn phần lớn mang tên nhân vật lịch sử, nên Điện Biên Phủ, Xô Viết Nghệ Tĩnh mất tên, còn "Đường nội bộ Khu du lịch Văn Thánh" thì được hiện như đường lớn joy emoji. Claude có báo trước chỗ mâu thuẫn này để mình chọn, cuối cùng mình giữ tên đường thật.

Bản đồ thật cũng nặng hơn nhiều, mình phải nhắn "The game takes too much CPU. Please optimize it.", lại một vòng đo rồi sửa. Đất trống quanh phố thì mình kêu làm thành rừng với đồi, trồng dừa, tre, chuối cho có chất Việt Nam.

Lên server

Mình hỏi "How do I play online?" rồi hỏi cách dựng server. Claude viết một bài hướng dẫn rất chi tiết cho người mới, từ bảo mật server tới tự động build, kèm một bộ deploy khá đồ sộ mà chưa chạy thật lần nào. Trước đó agent còn ngồi so giá VPS ở Singapore, trong khi mình có VPS sẵn rồi, chỉ là chưa ai hỏi.

Tới đây thì mình không còn là học trò nữa, phần này mình làm quen rồi:

"I already know DevOps. I will SSH into the VPS and do it myself. Just clean up the release document and make it shorter."

Phần hạ tầng từ 419 dòng còn 95 dòng. Được nước làm tới, nó cắt luôn file cấu hình mẫu còn 10 cài đặt, mình phải kêu giữ lại: "You removed too much from .env.example.". Phức tạp quá thì bảo gọn lại, gọn quá thì bảo giữ lại.

Rồi game lên twobullets.huydang.me:

Game đã chạy trên server thật, đang chờ đủ người vào trận

Đoạn này mình thấy rõ nhất một điều: nếu không biết devops thì mình đã nhận nguyên bộ hạ tầng phức tạp kia mà không biết nó thừa chỗ nào. Claude giúp mình đi được phần game vì mình có nền software để hiểu nó đang nói gì, còn phần mình rành hơn thì mình phải chỉnh lại nó.

Chơi thật thì lỗi thật

Từ lúc chơi với bot tới lúc lên server, mình chơi rồi chụp màn hình, nhắn cho Claude bug emoji

  • "Medkits, drinks and healing items don't restore health. Please fix it."

  • "Dead players are standing now?? They should be lying down."

  • "Still not enough weapons. Spawn lots more for me."

Vụ súng thì Claude đưa số liệu nói lục 3 căn nhà là gần như chắc chắn có súng. Nhưng người chơi đâu có đo bằng con số, người chơi đo bằng cảm giác mở cửa ra có thấy súng hay không joy emoji.

Lỗi mất thời gian nhất là màn hình nghiêng. Đang chơi thì random cả khung cảnh bị nghiêng, như nhân vật đang nghẹo đầu:

Đường chân trời bị nghiêng

Claude thử đủ trò mà không tái hiện được, đoán bừa một nguyên nhân rồi sửa, chơi tiếp thì vẫn nghiêng, bực muốn xỉu facepalm emoji. Mấy tiếng sau mình mô tả kỹ hơn:

"The tilt bug happens when I move the mouse left or right from the starting position."

Có câu này thì agent làm lại đúng thao tác, tìm ra lỗi và sửa bằng một dòng code, chưa tới 5 phút.

Có một kiểu lỗi lặp lại tới 3 lần: medkit không hồi máu, không thấy súng dưới đất, lựu đạn biến mất. Lần nào cũng vậy, tính năng chạy ngon ở chế độ chơi với bot, còn online thì server chưa làm. Lần thứ hai mình còn báo rất dữ:

"After the update, I don't see weapons or equipment on the ground anymore :))) This is a critical bug."

Claude lục 8 phút mới hỏi mình đang chơi chế độ nào. Nhưng vì mình gọi là "critical" nên phần nhặt đồ online được làm luôn trong một buổi tối joy emoji. Tới lần thứ ba thì Claude đo trước, trả lời trong 30 giây. Từ đó mỗi lần báo lỗi mình ghi rõ đang chơi chế độ nào, bản đồ nào, vừa làm gì.

Thêm chút chất meme Việt Nam

Game bắn súng mà toàn tiếng Anh thì hơi nhạt. Mình gửi Claude hai file mp3: "trinh-la-gi.mp3: play this when the game ends and shows the rank." và "chay-di-cac-chau-oi.mp3: play this when throwing a grenade.". Cho nó có cảm giác Vietnamese, với lại tại mình nhây joy emoji.

Phần buồn cười là Claude làm cái này nghiêm túc vkl: tiếng hô phát lúc thả tay chứ không phải lúc rút chốt, bot ném cũng hô, tiếng phát ra từ chỗ con bot đứng, nhỏ dần theo khoảng cách, bị tường chắn thì nghe nhỏ lại. Mỗi người còn chỉ được hô một lần, để cả bản đồ khỏi… đồng thanh joy emoji.

Tưởng tượng một con bot núp sau tường ở Hàng Xanh, rút chốt, hét "chạy đi các cháu ơi" trước khi quả lựu đạn lăn tới chân bạn.

Mình còn nhờ agent đi tìm model 3D đồ vật đường phố Việt Nam, được 66 món. Nhưng mấy món Việt Nam nhất như xe Cub, xe bánh mì, ghế nhựa, cột điện dây rối thì đều phải đăng nhập Sketchfab mới tải được, còn xe Wave với xích lô thì không có ở đâu cả.

Nặng quá thì cắt

Game càng thêm đồ thì càng nặng, chơi trên web bắt đầu lag. Mình quyết định thu nhỏ bản đồ:

"I think we should keep only Map v1, the Hàng Xanh map and the Phan Đăng Lưu map, and remove the others. Reduce the map size to 500 m × 500 m, because it's laggy on the web. Too many details."

Claude cảnh báo 20 người trên bản đồ nhỏ hơn sẽ chật, rồi làm theo. Game nhẹ hẳn, đổi lại bản đồ Sài Gòn mất luôn con sông vì nó nằm ngoài vùng mới upside_down_face emoji.

Nhớ lúc đầu Claude đề xuất 600 m mà mình chê nhỏ, đòi 1 km không? Cuối cùng còn 500 m, nhỏ hơn cả đề xuất ban đầu sweat_smile emoji.

Vậy Claude có onboard được mình không?

Được, và tốt hơn mình nghĩ. Lúc đầu mình nghĩ nó làm được nhưng sẽ nhiều lỗi.

Những cái Claude làm tốt: hướng dẫn, nghiên cứu, giải thích, viết code, tìm asset, tối ưu, viết test. Những cái vẫn phải là mình: cảm giác khi chơi, nhìn bằng mắt thấy chỗ nào xấu hay lag, và quyết định giữ gì bỏ gì.

Người không có kinh nghiệm làm game thì vẫn làm được, nhưng phải có kiến thức nền và phải chịu học. Có cái mình hiểu sẵn nhờ việc cũ, ví dụ LOD (vật ở xa thì vẽ sơ, lại gần mới vẽ kỹ) vì trước đó có làm cái map 10.000 chỗ cho Skynote, còn lại thì vừa làm vừa hỏi. Mấy phần như chơi nhiều người qua mạng mà không có nền thì bạn sẽ không hiểu Claude đang làm gì, cũng không biết nó làm đúng hay sai.

Vài lưu ý nếu bạn muốn thử:

  • Mình dùng gói Claude Max, chạy nhiều agent cùng lúc thì tốn khá nhiều

  • Máy mình RAM 16 GB, chạy 4–5 agent cùng Chrome thì có lúc máy đơ, agent bị treo

  • Báo lỗi càng cụ thể càng tốt: chế độ nào, bản đồ nào, thao tác gì

  • Kêu Claude commit sau mỗi bước để lỡ hỏng thì còn quay lại được

Game hiện vẫn chạy, mình hay rủ mọi người ở công ty chơi lúc rảnh. PUBG thì mình xoá rồi, còn twobullets thì vẫn còn sunglasses emoji.

Code thì Claude viết hết, còn biết chỗ nào chưa ổn để feedback thì phải là người chơi. Mình vẫn không đọc dòng code nào, nhưng tới cuối thì mình biết mình muốn game như thế nào.

Đây là trải nghiệm của mình với một dự án vui vẻ thôi, mình không có kiến thức về game, mỗi người dùng chắc sẽ thấy khác. Bạn có thử làm cái gì mà trước giờ không biết gì với Claude chưa? Comment chia sẻ với mình nhé wink emoji.

Bình luận

Đang tải bình luận…

Để lại bình luận

Nhận bài mới qua email

Có bài mới thì mình gửi một email. Không quảng cáo, không spam, hủy lúc nào cũng được.