Salvo · خوراک اندیشه
در زیر عمل سادهی کلیک کردن روی خانهها، موتوری قطعی نهفته است که ناوگانهای پنهان، استدلال وزندهیشده با احتمال و نبرد کلاسیک پنهانکاری و کشف را مدل میکند. 3
به انگلیسی نوشته و ویرایش شده است. این نسخهٔ فارسی با ترجمهٔ ماشینی تهیه شده است؛ هر جا دقت اهمیت دارد، متن اصلی انگلیسی معتبر است. خواندن متن اصلی به انگلیسی ←
در قلب بازی، جفتی از اشیای Board قرار دارد؛ یکی نمایانگر موقعیت پنهان شما و دیگری نمایانگر موقعیت پنهان حریف. هر صفحه ناوگانی از کشتیها را در بر دارد که روی شبکهای خطکشیشده چیده شدهاند، اما محل آنها از دید طرف مقابل پنهان میماند. شما به شبکهی دشمن شلیک میکنید و هوش مصنوعی به شبکهی شما، و هر شلیک یا به کشتیای اصابت میکند یا در آب خالی فرود میآید. این معماری دوصفحهای، عدم تقارن اطلاعاتی بنیادین نبرد ناوگان پنهان را برقرار میکند: هر طرف صفحهی خود را بهطور کامل میشناسد، اما آرایش طرف مقابل را تنها میتواند از الگوی شلیکهای خود استنباط کند. 3
تقارن این چیدمان همان چیزی است که به بازی شخصیت میبخشد. هیچیک از دو طرف کشتیهای طرف دیگر را مستقیماً نمیبیند. در عوض، هر دو طرف باید از بازخورد پراکندهی اصابتها و خطاها، مدلی ذهنی از شبکهی پنهان بسازند. هر شلیک به داده تبدیل میشود، هر اصابت دامنهی احتمالات را تنگتر میکند و هر خطا بخشی از قلمرو را از دایرهی بررسی حذف میکند. هماهنگکنندهی بازی در موتور، این دو صفحه را مدیریت میکند و اطمینان مییابد که شلیکها ثبت میشوند، اصابتها بهدرستی نسبت داده میشوند و بازی تنها زمانی پایان مییابد که کل ناوگان یکی از دو طرف غرق شده باشد. 3
پیش از آغاز بازی، موتور randomFleet را فراخوانی میکند تا کشتیهای هوش مصنوعی را به شکلی تصادفی بچیند. این تصادفی بودن دلبخواهی نیست؛ بذردار است، یعنی یک مقدار بذر معین همیشه همان چیدمان را تولید میکند. این قطعیت بذردار یک انتخاب طراحی است که بازی را تکرارپذیر و آزمونپذیر میسازد. اگر بازی را با همان بذر اجرا کنید، همان جایگذاری کشتیها، همان توالی تصمیمهای هوش مصنوعی و همان نتیجه را به دست خواهید آورد. این ویژگی برای اشکالزدایی و برای درک رفتار هوش مصنوعی در شرایط گوناگون ارزشمند است. 3
پس از چیده شدن ناوگان، قواعدی که بر بازی حاکماند ثابت و قطعی هستند. هوش مصنوعی تاس نمیریزد و موتور در میانهی بازی تصادفی بودن وارد نمیکند. هر تصمیمی که هوش مصنوعی میگیرد از مدل احتمالیای که نگه میدارد پیروی میکند و هر شلیکی که شما میکنید ثبت و تحلیل میشود. تنها منبع تنوع، بذری است که جایگذاری اولیهی ناوگان را تعیین میکند. این یعنی بازی در نهایت یک معماست: با توجه به محدودیتهای قواعد و بازخورد شلیکها، آیا میتوانید آرایش پنهان را پیش از آنکه هوش مصنوعی آرایش شما را استنتاج کند، استنتاج کنید؟ 3
وقتی شلیک میکنید، موتور آن را روی صفحهی هدف ثبت میکند و بررسی میکند که شلیک اصابت کرده یا خطا رفته است. این کار از طریق تابع fire انجام میشود که وضعیت صفحه را بهروز میکند و نتیجه را تعیین میکند. اصابت، خانه را بهعنوان خانهای اشغالشده توسط کشتی علامت میزند، در حالی که خطا آن را بهعنوان آب خالی علامت میزند. سپس موتور با بررسی همهی خانههای کشتیای که آن خانه را در بر میگیرد، وارسی میکند که آیا آن کشتی بهطور کامل غرق شده است یا نه. اگر همهی خانههای یک کشتی مورد اصابت قرار گرفته باشند، کشتی غرق شده است و این اطلاعات به هر دو طرف اعلام میشود. 3
شرط پیروزی ساده اما پیامددار است. یک طرف زمانی برنده میشود که همهی کشتیهای حریف غرق شده باشند. این شرط از طریق تابع allSunk بررسی میشود که وارسی میکند آیا هر کشتی روی صفحهی حریف بهطور کامل مورد اصابت قرار گرفته است یا نه. به محض برآورده شدن این شرط، بازی بلافاصله پایان مییابد. این ماهیت همهیاهیچ شرط پیروزی به این معناست که هر شلیک اهمیت دارد و فشار برای غرق کردن سریع کشتیها با نیاز به لو ندادن آرایش خودتان متوازن میشود. 3
حریف در این بازی یک تیرانداز تصادفی ساده نیست. هوش مصنوعیای است با هدفگیری احتمالی که میسنجد هر خانهی پنهان با چه احتمالی حاوی کشتی است. هوش مصنوعی مدلی احتمالی از شبکهی دشمن نگه میدارد و با هر شلیک و دریافت بازخورد، آن را بهروز میکند. خانههایی که به دلیل محدودیتهای جایگذاری کشتیهای باقیمانده نمیتوانند حاوی کشتی باشند، نامحتمل علامتگذاری میشوند، در حالی که خانههایی که برای جا دادن جایگذاریهای باقیمانده باید حاوی کشتی باشند، محتمل علامتگذاری میشوند. سپس هوش مصنوعی به خانهای با بالاترین احتمال شلیک میکند و حدس کورکورانه را به جستوجویی آگاهانه بدل میسازد. 3
این مدل احتمالی بر ریاضیات احتمال استوار است، جایی که رویدادها با اعدادی میان صفر و یک توصیف میشوند 2. احتمال صفر یعنی رویدادی نمیتواند رخ دهد، در حالی که احتمال یک یعنی حتماً باید رخ دهد. هوش مصنوعی از این توصیفهای عددی برای هدایت شلیکهای خود بهره میگیرد و خانههایی را ترجیح میدهد که احتمال یافتن کشتی در آنها بیشترین است. همین رویکرد است که هوش مصنوعی را از یک تیرانداز صرفاً تصادفی متمایز میکند و رفتار شکارگرانهی ویژهاش را به آن میبخشد.
رفتار هوش مصنوعی را میتوان در دو مرحله توصیف کرد: شکار و هدف. در مرحلهی شکار، هوش مصنوعی با شلیک به خانههایی که کشتیهای کشفنشده به احتمال زیاد در آنها قرار دارند، به دنبال کشتیها میگردد. این جستوجویی گسترده است که هدفش یافتن نخستین تماس با کشتیهای دشمن است. به محض ثبت یک اصابت، هوش مصنوعی به مرحلهی هدف میرود و در آن روی خانههای مجاور اصابت تمرکز میکند تا غرق کردن آن کشتی را به پایان برساند. این رویکرد دومرحلهای بازتاب شیوهای است که بازیکنان انسانی به بازی نزدیک میشوند: نخست کشتیها را بیابید، سپس آنها را غرق کنید. 3
گذار میان شکار و هدف بر اساس این تعیین میشود که آخرین شلیک اصابت بوده است یا خطا. اگر آخرین شلیک خطا رفته باشد، هوش مصنوعی به حالت شکار بازمیگردد و به دنبال خانههایی با بالاترین احتمال میگردد. اگر آخرین شلیک اصابت کرده باشد، هوش مصنوعی وارد حالت هدف میشود و به خانههای مجاور اصابت شلیک میکند. این قاعدهی ساده، در ترکیب با مدل احتمالی، راهبردی منسجم میآفریند که اکتشاف و بهرهبرداری را متوازن میکند. هوش مصنوعی شبکه را برای یافتن کشتیها کاوش میکند و از دانستهاش دربارهی یک اصابت بهره میبرد تا آن کشتی را بهشکلی کارآمد غرق کند. 3
هوش مصنوعی سه سطح قدرت دشواری دارد که رفتارش را تنظیم میکنند. این سطوح بر نحوهی وزندهی احتمالات و تصمیمگیری هوش مصنوعی اثر میگذارند. در سطوح پایینتر، هوش مصنوعی ممکن است اشتباههای بیشتری بکند یا در هدفگیری کمتر تهاجمی باشد. در سطوح بالاتر، هوش مصنوعی در محاسبات احتمالیاش سازگارتر و در هدفگیریاش بیرحمتر است. این تنوع سطوح به بازیکنان امکان میدهد سطح چالشی متناسب با خود بیابند، از بازی تفننی گرفته تا رقابت جدی.
پیادهسازی دقیق این سطوح در مؤلفهی هوش مصنوعی موتور، یعنی کلاس SalvoAI، قرار دارد. سطوح دشواری نحوهی تفسیر مدل احتمالی توسط هوش مصنوعی و نحوهی توازن میان اکتشاف و بهرهبرداری را تغییر میدهند. این طراحی به هوش مصنوعی اجازه میدهد هم برای بازیکنان تفننی دسترسپذیر و هم برای بازیکنان باتجربه چالشبرانگیز باشد، بیآنکه سازوکارهای بنیادین بازی تغییر کند. 3
بر فراز قواعد کلاسیک، یک پیچش تازه نشسته است: پینگ سونار. این توانایی به یک طرف اجازه میدهد به بهای شلیک همان نوبت، خوانشی 3×3 از شبکهی دشمن را آشکار کند. پینگ سونار نشان میدهد که هر خانه در ناحیهی 3×3 حاوی کشتی است یا آب خالی. این اطلاعات میتواند برای محدود کردن محل کشتیها بسیار ارزشمند باشد، اما بهایش از دست دادن شلیک شما در آن نوبت است. 3
تصمیم به استفاده از پینگ سونار تصمیمی راهبردی است. چه زمانی اطلاعات به بهایش میارزد؟ اگر در یافتن کشتیها درماندهاید، پینگ سونار میتواند گشایشی را که نیاز دارید فراهم کند. اگر به غرق کردن یک کشتی نزدیک هستید، بهای از دست دادن شلیک ممکن است بیش از حد گران باشد. پینگ سونار لایهای از مدیریت منابع به بازی میافزاید و بازیکنان را وامیدارد ارزش اطلاعات را در برابر ارزش عمل بسنجند. 3
پیچش دیگری بر قواعد کلاسیک، جابهجایی یکبار در هر بازی است. هر طرف میتواند یکی از کشتیهای خود را یک بار در طول بازی جابهجا کند. این جاخالی دفاعی نوبتی هزینه ندارد، یعنی میتوانید جابهجا کنید و همچنان در نوبت خود شلیک کنید. توانایی جابهجایی به شما امکان میدهد کشتیای را که در معرض تهدید است از خطر دور کنید، یا آن را به جایی قابلدفاعتر منتقل کنید. 3
توانایی جابهجایی گزینهای یکباره است و همین آن را گرانبها میکند. چه زمانی باید از آن استفاده کنید؟ اگر کشتیای در آستانهی غرق شدن است، جابهجایی میتواند آن را نجات دهد. اگر به موقعیت فعلی خود اطمینان دارید، جابهجایی ممکن است هدر دادن آن باشد. تصمیم به جابهجایی تصمیمی راهبردی است که مستلزم سنجش دقیق وضعیت فعلی بازی و اقدامهای محتمل حریف شماست. 3
در زیربنای همهی این سازوکارها، قاعدهی کلاسیک یک شلیک در هر نوبت قرار دارد. هر طرف در هر نوبت دقیقاً یک شلیک میکند و نوبتها یکیدرمیان جابهجا میشوند. این قاعده ضرباهنگ بازی را برقرار میکند و تضمین میکند که هر دو طرف فرصتی برابر برای عمل دارند. قاعدهی «یک شلیک در هر نوبت» همان چیزی است که بازی را به نبرد خرد بدل میکند، نه مسابقهی سرعت. 3
همین قاعدهی کلاسیک است که بازی را در سنت «جنگ دریایی» ریشهدار میکند؛ بازی حدسی از نوع راهبردی برای دو بازیکن که روی شبکههای خطکشیشده انجام میشود و در آن ناوگان هر بازیکن از دید حریف پنهان است 1. قاعدهی یک شلیک در هر نوبت همان چیزی است که بازی را به آزمونی از استنتاج و احتمال بدل میکند، نه آزمونی از واکنش سریع. قاعدهای ساده است، اما همین قاعده است که شخصیت و چالش بازی را به آن میبخشد.
موتور خالص و بذردار-قطعی است و با مولد اعداد تصادفی بذردار خودش پیش میرود. این یعنی هر جنبهای از بازی با مقدار بذری که در آغاز داده میشود تعیین میشود. با بذر یکسان، بازی همیشه همان توالی رویدادها را تولید میکند، از جایگذاری اولیهی ناوگان تا آخرین شلیک. این ویژگی بازی را آزمونپذیر میسازد، چرا که میتوان همان سناریو را بازتولید و بررسی کرد. 3
قطعیت بذردار برای درک بازی نیز پیامدهایی دارد. اگر میخواهید بدانید هوش مصنوعی در سناریویی خاص چگونه رفتار میکند، میتوانید بازی را با بذری مشخص اجرا کنید و نتیجه را مشاهده کنید. اگر میخواهید راهبردی خاص را بیازمایید، میتوانید بازی را چند بار با همان بذر اجرا کنید و ببینید چگونه عمل میکند. این تکرارپذیری ویژگی ارزشمندی برای بازیکنان و توسعهدهندگان، هر دو، است.
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.