Salvo · อาหารสมอง
ใต้การกระทำง่ายๆ อย่างการคลิกช่องต่างๆ มีเอนจินแบบกำหนดแน่นอนซ่อนอยู่ ซึ่งจำลองกองเรือที่ซ่อนอยู่ การให้เหตุผลที่ถ่วงน้ำหนักด้วยความน่าจะเป็น และการดวลคลาสสิกระหว่างการซ่อนตัวกับการค้นพบ 3
เขียนและเรียบเรียงเป็นภาษาอังกฤษ ฉบับภาษาไทยนี้จัดทำขึ้นด้วยการแปลด้วยเครื่อง ในจุดที่ความแม่นยำมีความสำคัญ ให้ถือต้นฉบับภาษาอังกฤษเป็นหลัก อ่านต้นฉบับภาษาอังกฤษ →
หัวใจของเกมคืออ็อบเจ็กต์ Board คู่หนึ่ง แผ่นหนึ่งแทนตำแหน่งที่ซ่อนอยู่ของคุณ อีกแผ่นแทนตำแหน่งที่ซ่อนอยู่ของฝ่ายตรงข้าม แต่ละกระดานบรรจุกองเรือที่วางอยู่บนตารางตีเส้น แต่ตำแหน่งจะถูกปิดบังจากอีกฝ่าย คุณยิงไปที่กริดของศัตรูขณะที่ AI ยิงมาที่กริดของคุณ และแต่ละนัดจะโดนเรือหรือไม่ก็ตกลงในน่านน้ำว่างเปล่า สถาปัตยกรรมกระดานคู่นี้สร้างความไม่สมมาตรของข้อมูลขั้นพื้นฐานของการดวลกองเรือที่ซ่อนอยู่: แต่ละฝ่ายรู้กระดานของตนเองอย่างสมบูรณ์ แต่อนุมานการจัดวางของอีกฝ่ายได้จากรูปแบบการยิงของตนเท่านั้น 3
ความสมมาตรของการจัดวางเช่นนี้คือสิ่งที่ให้บุคลิกแก่เกม ไม่มีฝ่ายใดมองเห็นเรือของอีกฝ่ายโดยตรง ทั้งสองฝ่ายต้องสร้างแบบจำลองในใจของกริดที่ซ่อนอยู่จากผลตอบกลับอันเบาบางของการโดนและการพลาด ทุกนัดกลายเป็นข้อมูล ทุกครั้งที่โดนจะจำกัดความเป็นไปได้ให้แคบลง และทุกครั้งที่พลาดจะตัดพื้นที่ออกจากการพิจารณา ตัวประสานงานเกมของเอนจินจัดการกระดานทั้งสองนี้ โดยรับประกันว่าการยิงถูกบันทึกไว้ การโดนถูกระบุอย่างถูกต้อง และเกมจะจบลงก็ต่อเมื่อกองเรือทั้งหมดของฝ่ายใดฝ่ายหนึ่งจมลงเท่านั้น 3
ก่อนเริ่มเล่น เอนจินจะเรียก randomFleet เพื่อจัดวางเรือของ AI แบบสุ่ม ความสุ่มนี้ไม่ได้เกิดขึ้นตามอำเภอใจ แต่มีซีดกำกับ หมายความว่าค่าซีดค่าหนึ่งจะให้การจัดวางแบบเดิมเสมอ ความกำหนดแน่นอนจากซีดนี้เป็นทางเลือกในการออกแบบที่ทำให้เกมทำซ้ำได้และทดสอบได้ หากคุณรันเกมด้วยซีดเดียวกัน คุณจะได้การวางเรือแบบเดียวกัน ลำดับการตัดสินใจของ AI แบบเดียวกัน และผลลัพธ์แบบเดียวกัน คุณสมบัตินี้มีค่าสำหรับการดีบักและสำหรับการทำความเข้าใจว่า AI ประพฤติตัวอย่างไรภายใต้เงื่อนไขที่ต่างกัน 3
เมื่อจัดวางกองเรือแล้ว กฎที่ควบคุมการเล่นจะตายตัวและกำหนดแน่นอน AI ไม่ทอยลูกเต๋า และเอนจินไม่นำความสุ่มเข้ามากลางเกม ทุกการตัดสินใจของ AI ล้วนตามมาจากแบบจำลองความน่าจะเป็นที่มันดูแลอยู่ และทุกนัดที่คุณยิงจะถูกบันทึกและวิเคราะห์ แหล่งที่มาเดียวของความแปรผันคือซีดที่กำหนดการวางกองเรือเริ่มต้น นี่หมายความว่าในท้ายที่สุดเกมนี้คือปริศนา: ภายใต้ข้อจำกัดของกฎและผลตอบกลับจากการยิง คุณจะอนุมานการจัดวางที่ซ่อนอยู่ได้ก่อนที่ AI จะอนุมานของคุณได้หรือไม่ 3
เมื่อคุณยิงนัดหนึ่ง เอนจินจะบันทึกนัดนั้นไว้บนกระดานเป้าหมายและตรวจสอบว่าโดนหรือพลาด ซึ่งทำผ่านฟังก์ชัน fire ที่อัปเดตสถานะของกระดานและตัดสินผลลัพธ์ การโดนจะทำเครื่องหมายช่องนั้นว่ามีเรืออยู่ ส่วนการพลาดจะทำเครื่องหมายว่าเป็นน่านน้ำว่างเปล่า จากนั้นเอนจินจะตรวจสอบว่าเรือที่มีช่องนั้นจมลงโดยสมบูรณ์แล้วหรือยัง โดยตรวจดูช่องทั้งหมดของมัน หากทุกช่องของเรือลำหนึ่งถูกยิงโดนหมดแล้ว เรือลำนั้นจะจม และข้อมูลนี้จะถูกแจ้งให้ทั้งสองฝ่ายทราบ 3
เงื่อนไขการชนะนั้นตรงไปตรงมาแต่มีผลสำคัญ ฝ่ายหนึ่งจะชนะเมื่อเรือของฝ่ายตรงข้ามจมทั้งหมด ซึ่งตรวจสอบผ่านฟังก์ชัน allSunk ที่ตรวจดูว่าเรือทุกลำบนกระดานของฝ่ายตรงข้ามถูกยิงโดนครบทุกช่องแล้วหรือไม่ เกมจะจบลงทันทีเมื่อเงื่อนไขนี้เป็นจริง ธรรมชาติแบบได้ทั้งหมดหรือไม่ได้เลยของเงื่อนไขการชนะนี้หมายความว่าทุกนัดมีความหมาย และแรงกดดันที่จะจมเรือให้เร็วต้องถ่วงดุลกับความจำเป็นที่จะไม่เปิดเผยการจัดวางของคุณเอง 3
คู่ต่อสู้ในเกมนี้ไม่ใช่ผู้ยิงสุ่มธรรมดา แต่เป็น AI แบบเล็งเป้าด้วยความน่าจะเป็น ซึ่งชั่งน้ำหนักว่าแต่ละช่องที่ซ่อนอยู่มีโอกาสมีเรืออยู่มากเพียงใด AI ดูแลแบบจำลองความน่าจะเป็นของกริดศัตรู และอัปเดตมันเมื่อมีการยิงและได้รับผลตอบกลับ ช่องที่ไม่อาจมีเรืออยู่ได้เนื่องจากข้อจำกัดในการวางเรือที่เหลือจะถูกทำเครื่องหมายว่าไม่น่าเป็นไปได้ ส่วนช่องที่ต้องมีเรืออยู่เพื่อรองรับการวางที่เหลือจะถูกทำเครื่องหมายว่าน่าจะเป็นไปได้ จากนั้น AI จะยิงไปที่ช่องที่มีความน่าจะเป็นสูงสุด เปลี่ยนการเดาสุ่มให้กลายเป็นการค้นหาอย่างมีข้อมูล 3
แบบจำลองความน่าจะเป็นนี้มีรากฐานอยู่บนคณิตศาสตร์ของภาวะน่าจะเป็น ซึ่งเหตุการณ์ต่างๆ ถูกอธิบายด้วยตัวเลขระหว่างศูนย์กับหนึ่ง 2 ความน่าจะเป็นเท่ากับศูนย์หมายความว่าเหตุการณ์นั้นไม่อาจเกิดขึ้นได้ ส่วนความน่าจะเป็นเท่ากับหนึ่งหมายความว่ามันต้องเกิดขึ้น AI ใช้คำอธิบายเชิงตัวเลขเหล่านี้นำทางการยิงของมัน โดยเลือกช่องที่ความน่าจะเป็นในการพบเรือสูงที่สุด แนวทางนี้คือสิ่งที่แยก AI ออกจากผู้ยิงแบบสุ่มล้วนๆ และให้พฤติกรรมการล่าอันเป็นเอกลักษณ์แก่มัน
พฤติกรรมของ AI อธิบายได้เป็นสองระยะ: ล่าและเล็งเป้า ในระยะล่า AI จะค้นหาเรือโดยยิงไปที่ช่องที่เรือที่ยังไม่ถูกค้นพบมีโอกาสอยู่มากที่สุด นี่คือการค้นหาแบบกว้างที่มุ่งหาการสัมผัสครั้งแรกกับเรือศัตรู เมื่อยิงโดนแล้ว AI จะเปลี่ยนเข้าสู่ระยะเล็งเป้า โดยมุ่งไปที่ช่องข้างเคียงของจุดที่โดนเพื่อจมเรือลำนั้นให้สำเร็จ แนวทางสองระยะนี้สะท้อนวิธีที่ผู้เล่นมนุษย์เข้าหาเกม: หาเรือให้เจอก่อน แล้วค่อยจมมัน 3
การเปลี่ยนระหว่างล่ากับเล็งเป้าถูกกำหนดโดยว่านัดล่าสุดโดนหรือพลาด หากนัดล่าสุดพลาด AI จะกลับสู่โหมดล่าและค้นหาช่องที่มีความน่าจะเป็นสูงสุด หากนัดล่าสุดโดน AI จะเข้าสู่โหมดเล็งเป้าและยิงไปที่ช่องข้างเคียงของจุดที่โดน กฎง่ายๆ ข้อนี้ เมื่อรวมกับแบบจำลองความน่าจะเป็น จะสร้างกลยุทธ์ที่สอดคล้องกันซึ่งสมดุลระหว่างการสำรวจกับการใช้ประโยชน์ AI สำรวจกริดเพื่อหาเรือ และใช้ประโยชน์จากความรู้เรื่องจุดที่โดนเพื่อจมเรือลำนั้นอย่างมีประสิทธิภาพ 3
AI มีระดับความยากสามระดับที่ปรับจูนพฤติกรรมของมัน ระดับเหล่านี้ส่งผลต่อวิธีที่ AI ชั่งน้ำหนักความน่าจะเป็นและตัดสินใจ ในระดับต่ำ AI อาจทำผิดพลาดมากกว่าหรือเล็งเป้าอย่างดุดันน้อยกว่า ในระดับสูง AI จะคำนวณความน่าจะเป็นอย่างสม่ำเสมอกว่าและเล็งเป้าอย่างไร้ความปรานีกว่า ความหลากหลายของระดับเช่นนี้ช่วยให้ผู้เล่นหาระดับความท้าทายที่เหมาะกับตนได้ ตั้งแต่การเล่นสบายๆ ไปจนถึงการแข่งขันอย่างจริงจัง
การนำระดับเหล่านี้ไปใช้จริงอยู่ในองค์ประกอบ AI ของเอนจิน นั่นคือคลาส SalvoAI ระดับความยากจะปรับเปลี่ยนวิธีที่ AI ตีความแบบจำลองความน่าจะเป็นและวิธีที่มันสมดุลระหว่างการสำรวจกับการใช้ประโยชน์ การออกแบบนี้ทำให้ AI ทั้งเข้าถึงได้สำหรับผู้เล่นสบายๆ และท้าทายสำหรับผู้เล่นที่มีประสบการณ์ โดยไม่ต้องเปลี่ยนกลไกพื้นฐานของเกม 3
เหนือกฎคลาสสิกมีลูกเล่นเพิ่มเข้ามา: การยิงโซนาร์ ความสามารถนี้ให้ฝ่ายหนึ่งเปิดเผยผลอ่านพื้นที่ 3×3 ของกริดศัตรู โดยแลกกับการยิงของเทิร์นนั้น การยิงโซนาร์เผยว่าแต่ละช่องในพื้นที่ 3×3 มีเรืออยู่หรือเป็นน่านน้ำว่างเปล่า ข้อมูลนี้อาจมีค่ามหาศาลในการจำกัดตำแหน่งของเรือให้แคบลง แต่ต้องแลกด้วยการเสียการยิงของคุณในเทิร์นนั้น 3
การตัดสินใจใช้โซนาร์เป็นเรื่องเชิงกลยุทธ์ ข้อมูลคุ้มค่ากับต้นทุนเมื่อใด หากคุณกำลังหาเรือไม่เจอ การยิงโซนาร์อาจให้จุดพลิกผันที่คุณต้องการ หากคุณใกล้จะจมเรือลำหนึ่งแล้ว ต้นทุนของการเสียการยิงอาจสูงเกินไป การยิงโซนาร์เพิ่มชั้นของการจัดการทรัพยากรเข้ามาในเกม บังคับให้ผู้เล่นชั่งน้ำหนักคุณค่าของข้อมูลกับคุณค่าของการลงมือทำ 3
ลูกเล่นอีกอย่างที่เพิ่มจากกฎคลาสสิกคือการย้ายตำแหน่งครั้งเดียวต่อเกม แต่ละฝ่ายอาจย้ายเรือของตนเองหนึ่งลำได้หนึ่งครั้งระหว่างเกม การหลบหลีกเชิงรับนี้ไม่เสียเทิร์น หมายความว่าคุณสามารถย้ายตำแหน่งแล้วยังยิงในเทิร์นของคุณได้ ความสามารถในการย้ายตำแหน่งช่วยให้คุณย้ายเรือออกจากอันตรายเมื่อมันถูกคุกคาม หรือย้ายไปยังตำแหน่งที่ป้องกันได้ดีกว่า 3
ความสามารถในการย้ายตำแหน่งเป็นตัวเลือกที่ใช้ได้ครั้งเดียว ซึ่งทำให้มันมีค่ายิ่ง คุณควรใช้มันเมื่อใด หากเรือลำหนึ่งกำลังจะจม การย้ายตำแหน่งอาจช่วยมันไว้ได้ หากคุณมั่นใจในตำแหน่งปัจจุบัน การย้ายตำแหน่งอาจเป็นการสิ้นเปลือง การตัดสินใจย้ายตำแหน่งเป็นเรื่องเชิงกลยุทธ์ที่ต้องพิจารณาสถานะปัจจุบันของเกมและการกระทำที่น่าจะเกิดขึ้นของฝ่ายตรงข้ามอย่างรอบคอบ 3
รองรับกลไกทั้งหมดนี้อยู่คือกฎคลาสสิกว่าด้วยหนึ่งนัดต่อเทิร์น แต่ละฝ่ายยิงหนึ่งนัดพอดีต่อเทิร์น สลับกันไปมา กฎข้อนี้กำหนดจังหวะของเกมและรับประกันว่าทั้งสองฝ่ายมีโอกาสลงมือเท่าเทียมกัน กฎหนึ่งนัดต่อเทิร์นคือสิ่งที่ทำให้เกมนี้เป็นการดวลไหวพริบ ไม่ใช่การแข่งความเร็ว 3
กฎคลาสสิกข้อนี้คือสิ่งที่หยั่งรากเกมไว้ในขนบของ Battleship (เกมเรือรบ) เกมทายแนวกลยุทธ์สำหรับผู้เล่นสองคนที่เล่นบนตารางตีเส้น โดยกองเรือของผู้เล่นแต่ละคนถูกปิดบังจากฝ่ายตรงข้าม 1 กฎหนึ่งนัดต่อเทิร์นคือสิ่งที่ทำให้เกมนี้เป็นบททดสอบการอนุมานและความน่าจะเป็น ไม่ใช่บททดสอบปฏิกิริยาตอบสนอง มันเป็นกฎง่ายๆ แต่เป็นกฎที่ให้บุคลิกและความท้าทายแก่เกม
เอนจินเป็นแบบบริสุทธิ์และกำหนดแน่นอนจากซีด ขับเคลื่อนด้วยตัวสร้างเลขสุ่มแบบมีซีดของมันเอง หมายความว่าทุกแง่มุมของเกมถูกกำหนดโดยค่าซีดที่ให้ไว้ตอนเริ่มต้น เมื่อได้ซีดเดียวกัน เกมจะให้ลำดับเหตุการณ์แบบเดิมเสมอ ตั้งแต่การวางกองเรือเริ่มต้นไปจนถึงนัดสุดท้าย คุณสมบัตินี้ทำให้เกมทดสอบได้ เพราะสถานการณ์เดียวกันสามารถทำซ้ำและตรวจสอบได้ 3
ความกำหนดแน่นอนจากซีดยังมีนัยต่อการทำความเข้าใจเกมด้วย หากคุณอยากเข้าใจว่า AI ประพฤติตัวอย่างไรในสถานการณ์หนึ่งๆ คุณสามารถรันเกมด้วยซีดเฉพาะแล้วสังเกตผลลัพธ์ หากคุณอยากทดสอบกลยุทธ์หนึ่งๆ คุณสามารถรันเกมหลายครั้งด้วยซีดเดียวกันแล้วดูว่ามันทำได้ดีเพียงใด ความสามารถในการทำซ้ำนี้เป็นคุณสมบัติที่มีค่าสำหรับทั้งผู้เล่นและนักพัฒนา
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.