Salvo · Thức ăn cho tư duy
Bên dưới thao tác đơn giản là nhấp vào các ô có một cỗ máy tất định, mô hình hóa những hạm đội ẩn giấu, lối suy luận có trọng số xác suất, và cuộc đấu tay đôi kinh điển giữa che giấu và khám phá. 3
Đượ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 →
Ở trung tâm của trò chơi là một cặp đối tượng Board, một đại diện cho thế trận ẩn của bạn và một đại diện cho thế trận ẩn của đối thủ. Mỗi bàn cờ mang một hạm đội tàu được bố trí trên một lưới kẻ ô, nhưng vị trí của chúng vẫn được che giấu khỏi phía bên kia. Bạn bắn vào lưới địch trong khi AI bắn vào lưới của bạn, và mỗi phát bắn hoặc trúng tàu hoặc rơi xuống vùng nước trống. Kiến trúc hai bàn cờ này thiết lập sự bất đối xứng thông tin căn bản của cuộc đấu hạm đội ẩn: mỗi bên biết trọn vẹn bàn cờ của mình, nhưng chỉ có thể suy ra cách bố trí của đối phương từ mẫu hình các phát bắn của mình. 3
Tính đối xứng của cách sắp đặt này chính là điều tạo nên cá tính của trò chơi. Không bên nào nhìn thấy trực tiếp tàu của bên kia. Thay vào đó, cả hai bên phải dựng lên một mô hình trong đầu về lưới ẩn từ những phản hồi thưa thớt là các phát trúng và trượt. Mỗi phát bắn trở thành dữ liệu, mỗi phát trúng thu hẹp các khả năng, và mỗi phát trượt loại bỏ một vùng lãnh thổ khỏi diện cân nhắc. Bộ điều phối ván chơi của cỗ máy quản lý hai bàn cờ này, bảo đảm rằng các phát bắn được ghi lại, các phát trúng được quy đúng chỗ, và ván chơi chỉ kết thúc khi toàn bộ hạm đội của một bên đã bị đánh chìm. 3
Trước khi ván chơi bắt đầu, cỗ máy gọi randomFleet để bố trí tàu của AI theo cách ngẫu nhiên. Sự ngẫu nhiên này không tùy tiện; nó được gieo hạt giống, nghĩa là một giá trị hạt giống nhất định sẽ luôn tạo ra cùng một cách bố trí. Tính tất định theo hạt giống này là một lựa chọn thiết kế giúp trò chơi có thể tái lập và kiểm thử được. Nếu bạn chạy ván chơi với cùng một hạt giống, bạn sẽ nhận được cùng những vị trí tàu, cùng chuỗi quyết định của AI, và cùng kết cục. Tính chất này rất có giá trị cho việc gỡ lỗi và cho việc hiểu AI hành xử ra sao trong những điều kiện khác nhau. 3
Một khi hạm đội đã được bố trí, các luật chi phối ván chơi là cố định và tất định. AI không gieo xúc xắc, và cỗ máy không đưa thêm ngẫu nhiên vào giữa ván. Mọi quyết định của AI đều xuất phát từ mô hình xác suất mà nó duy trì, và mọi phát bắn của bạn đều được ghi lại và phân tích. Nguồn biến thiên duy nhất là hạt giống quyết định cách bố trí hạm đội ban đầu. Điều này có nghĩa là trò chơi rốt cuộc là một câu đố: với những ràng buộc của luật chơi và phản hồi từ các phát bắn, bạn có thể suy ra cách bố trí ẩn trước khi AI suy ra cách bố trí của bạn không? 3
Khi bạn bắn một phát, cỗ máy ghi nó lên bàn cờ mục tiêu và kiểm tra xem phát bắn trúng hay trượt. Việc này được thực hiện qua hàm fire, hàm cập nhật trạng thái của bàn cờ và xác định kết quả. Một phát trúng đánh dấu ô đó là có tàu chiếm giữ, còn một phát trượt đánh dấu nó là vùng nước trống. Sau đó cỗ máy kiểm tra xem con tàu chứa ô đó đã bị đánh chìm hoàn toàn chưa bằng cách xem xét tất cả các ô của nó. Nếu mọi ô của một con tàu đều đã bị bắn trúng, con tàu bị đánh chìm, và thông tin này được truyền đến cả hai bên. 3
Điều kiện thắng đơn giản nhưng hệ trọng. Một bên thắng khi toàn bộ tàu của đối thủ đã bị đánh chìm. Điều này được kiểm tra qua hàm allSunk, hàm xem xét liệu mọi con tàu trên bàn cờ của đối thủ đã bị bắn trúng hoàn toàn hay chưa. Ván chơi kết thúc ngay lập tức khi điều kiện này được thỏa mãn. Bản chất được ăn cả ngã về không của điều kiện thắng có nghĩa là mỗi phát bắn đều quan trọng, và áp lực phải đánh chìm tàu nhanh chóng được cân bằng với nhu cầu tránh để lộ cách bố trí của chính bạn. 3
Đối thủ trong trò chơi này không phải là một tay bắn ngẫu nhiên đơn thuần. Đó là một AI nhắm bắn theo xác suất, cân nhắc mức độ khả năng mỗi ô ẩn có chứa tàu. AI duy trì một mô hình xác suất về lưới địch, cập nhật nó khi các phát bắn được thực hiện và phản hồi được nhận về. Những ô không thể chứa tàu do các ràng buộc bố trí của những con tàu còn lại được đánh dấu là ít khả năng, còn những ô bắt buộc phải chứa tàu để dung nạp các cách bố trí còn lại được đánh dấu là nhiều khả năng. AI sau đó bắn vào ô có xác suất cao nhất, biến việc đoán mò thành tìm kiếm có cơ sở. 3
Mô hình xác suất này bắt nguồn từ toán học về khả năng xảy ra, trong đó các sự kiện được mô tả bằng những con số nằm giữa 0 và 1 2. Xác suất bằng 0 nghĩa là một sự kiện không thể xảy ra, còn xác suất bằng 1 nghĩa là nó chắc chắn xảy ra. AI dùng những mô tả bằng số này để định hướng các phát bắn của mình, ưu tiên những ô có xác suất tìm thấy tàu cao nhất. Cách tiếp cận này là điều phân biệt AI với một tay bắn thuần ngẫu nhiên và tạo cho nó hành vi săn lùng đặc trưng.
Hành vi của AI có thể được mô tả theo hai giai đoạn: săn và nhắm. Trong giai đoạn săn, AI tìm tàu bằng cách bắn vào những ô mà các con tàu chưa bị phát hiện có nhiều khả năng nằm nhất. Đây là một cuộc tìm kiếm trên diện rộng nhằm tạo ra tiếp xúc đầu tiên với tàu địch. Một khi ghi nhận được một phát trúng, AI chuyển sang giai đoạn nhắm, nơi nó tập trung vào các ô lân cận của phát trúng để đánh chìm hẳn con tàu đó. Cách tiếp cận hai giai đoạn này phản ánh cách người chơi tiếp cận trò chơi: trước tiên tìm tàu, rồi đánh chìm chúng. 3
Việc chuyển đổi giữa săn và nhắm được quyết định bởi phát bắn cuối cùng là trúng hay trượt. Nếu phát cuối trượt, AI quay về chế độ săn và tìm những ô có xác suất cao nhất. Nếu phát cuối trúng, AI vào chế độ nhắm và bắn vào các ô lân cận của phát trúng. Quy tắc đơn giản này, kết hợp với mô hình xác suất, tạo nên một chiến lược mạch lạc cân bằng giữa thăm dò và khai thác. AI thăm dò lưới để tìm tàu và khai thác hiểu biết về một phát trúng để đánh chìm con tàu đó một cách hiệu quả. 3
AI có ba mức sức mạnh theo độ khó để tinh chỉnh hành vi của nó. Các mức này ảnh hưởng đến cách AI cân nhắc xác suất và ra quyết định. Ở mức thấp, AI có thể mắc nhiều sai lầm hơn hoặc ít quyết liệt hơn khi nhắm bắn. Ở mức cao, AI nhất quán hơn trong các phép tính xác suất và tàn nhẫn hơn khi nhắm bắn. Sự đa dạng về mức sức mạnh này cho phép người chơi tìm được mức thử thách phù hợp với mình, từ chơi giải trí đến thi đấu nghiêm túc.
Cách hiện thực chính xác của các mức sức mạnh này nằm trong thành phần AI của cỗ máy, lớp SalvoAI. Các mức độ khó thay đổi cách AI diễn giải mô hình xác suất và cách nó cân bằng giữa thăm dò và khai thác. Thiết kế này cho phép AI vừa dễ tiếp cận với người chơi giải trí vừa thách thức với người chơi giàu kinh nghiệm, mà không thay đổi cơ chế nền tảng của trò chơi. 3
Bên trên luật chơi kinh điển là một biến tấu: xung sonar. Khả năng này cho phép một bên hé lộ một vùng đọc 3×3 trên lưới địch với cái giá là phát bắn của lượt đó. Xung sonar cho biết mỗi ô trong vùng 3×3 có chứa tàu hay là vùng nước trống. Thông tin này có thể vô giá trong việc thu hẹp vị trí của các con tàu, nhưng nó phải trả bằng cái giá là mất phát bắn của lượt đó. 3
Quyết định dùng xung sonar là một quyết định chiến lược. Khi nào thông tin đáng với cái giá phải trả? Nếu bạn đang chật vật tìm tàu, xung sonar có thể mang lại bước đột phá bạn cần. Nếu bạn sắp đánh chìm được một con tàu, cái giá của việc mất phát bắn có thể là quá cao. Xung sonar thêm một lớp quản lý tài nguyên vào trò chơi, buộc người chơi phải cân nhắc giá trị của thông tin so với giá trị của hành động. 3
Một biến tấu khác trên luật chơi kinh điển là quyền di chuyển một lần mỗi ván. Mỗi bên có thể dời một trong những con tàu của mình một lần trong suốt ván chơi. Cú né phòng thủ này không tốn lượt, nghĩa là bạn có thể di chuyển tàu và vẫn bắn một phát trong lượt của mình. Khả năng di chuyển cho phép bạn đưa một con tàu ra khỏi vùng nguy hiểm khi nó đang bị đe dọa, hoặc dời nó đến một vị trí dễ phòng thủ hơn. 3
Khả năng di chuyển là một lựa chọn chỉ dùng được một lần, điều khiến nó trở nên quý giá. Khi nào bạn nên dùng nó? Nếu một con tàu sắp bị đánh chìm, di chuyển có thể cứu nó. Nếu bạn tự tin vào vị trí hiện tại, di chuyển có thể là lãng phí. Quyết định di chuyển là một quyết định chiến lược đòi hỏi cân nhắc kỹ lưỡng trạng thái hiện tại của ván chơi và những hành động có khả năng xảy ra của đối thủ. 3
Nền tảng của tất cả những cơ chế này là luật kinh điển mỗi lượt một phát bắn. Mỗi bên bắn đúng một phát mỗi lượt, luân phiên qua lại. Luật này thiết lập nhịp điệu của ván chơi và bảo đảm cả hai bên có cơ hội hành động ngang nhau. Luật mỗi lượt một phát bắn chính là điều khiến trò chơi trở thành cuộc đấu trí thay vì cuộc đua tốc độ. 3
Luật kinh điển này là điều neo trò chơi vào truyền thống của Battleship (Bắn tàu), một trò chơi đoán mang tính chiến lược dành cho hai người chơi trên những lưới kẻ ô, trong đó hạm đội của mỗi người chơi được che giấu khỏi đối thủ 1. Luật mỗi lượt một phát bắn là điều khiến trò chơi trở thành bài kiểm tra về suy luận và xác suất thay vì bài kiểm tra về phản xạ. Đó là một luật đơn giản, nhưng chính nó tạo cho trò chơi cá tính và sự thử thách.
Cỗ máy này thuần túy và tất định theo hạt giống, được điều khiển bởi bộ sinh số ngẫu nhiên có gieo hạt giống của riêng nó. Điều này có nghĩa là mọi khía cạnh của ván chơi đều được quyết định bởi giá trị hạt giống cung cấp lúc bắt đầu. Với cùng một hạt giống, ván chơi sẽ luôn tạo ra cùng một chuỗi sự kiện, từ cách bố trí hạm đội ban đầu đến phát bắn cuối cùng. Tính chất này giúp trò chơi kiểm thử được, vì cùng một kịch bản có thể được tái lập và xem xét. 3
Tính tất định theo hạt giống cũng có ý nghĩa đối với việc hiểu trò chơi. Nếu bạn muốn hiểu AI hành xử ra sao trong một kịch bản cụ thể, bạn có thể chạy ván chơi với một hạt giống xác định và quan sát kết cục. Nếu bạn muốn thử nghiệm một chiến lược cụ thể, bạn có thể chạy ván chơi nhiều lần với cùng một hạt giống và xem nó vận hành thế nào. Khả năng tái lập này là một tính năng có giá trị cho cả người chơi lẫn nhà phát triển.
Board with a hidden fleet, the human fires at the enemy fleet and the AI at the human's, one shot per turn (classic rules), fire records a hit or miss, and a side wins when the opponent's ships are all sunk (allSunk); the opponent is a probability-targeting SalvoAI with three difficulty strengths that "hunts" for ships by favouring the cells where an undiscovered ship is most likely to sit and then "targets" the neighbours of a hit to finish it; two twists sit on the classic rules, a sonar ping reveals a 3×3 ship/empty readout but costs that turn's shot, and each side may reposition one of its own ships once per game (a dodge that does not cost the turn); and the engine is pure and seeded-deterministic.