การคำนวณผลลัพธ์ของการต่อสู้ของกองทัพทั้งสอง


20

ฉันกำลังเขียนโปรแกรมเกมกลยุทธ์โดยใช้ Flash เกมนี้ทำงานคล้ายกับเกม "ทราเวียน" ที่มีชื่อเสียง

ปัญหาของฉันมีดังนี้: ฉันพยายามคำนวณกองทหารที่แพ้เนื่องจากการต่อสู้ระหว่างกองทัพทั้งสอง กองทัพทั้งสองนั้นมีหน่วยต่างกัน บางส่วนของพวกเขาแข็งแกร่งขึ้นเมื่อเทียบกับหน่วยอื่นและปรับตัวลดลงกับประเภทอื่น

ฉันจะวางผลของความแตกต่างนี้ในสมการการต่อสู้ได้อย่างไร?

ดูเหมือนว่าจะง่ายถ้าพวกเขามีเพียง att และ def เท่านั้น แต่เมื่อมันมาถึงการพึ่งพาประเภทหน่วยฉันก็หายไป


6
ผลการต่อสู้ของคุณควรกำหนดอย่างหมดจดหรือคุณต้องการใช้การสุ่มแบบ?
sum1stolemyname

4
ฉันไม่คิดว่ามันควรจะติดแท็กเป็นเกมที่มีผู้เล่นหลายคนเนื่องจาก OP ไม่ได้รับมันอาจเป็นมนุษย์กับ AI ได้ และโดย 'การพึ่งพาประเภท' เรากำลังพูดถึงร็อคคลาสสิค -> กรรไกร -> กระดาษ -> สิ่งประเภทร็อคหรือไม่?
The Duck Communist

คำตอบ:


10

นอกเหนือจากการสนับสนุนข้อเสนอแนะของ Amit ในการดูสมการของ Lanchester แล้วฉันต้องการเพิ่มว่านี่เป็นการตัดสินใจออกแบบเกมไม่ใช่ความจริงเชิงประจักษ์ที่เราสามารถให้คุณได้ หากคุณต้องการคำนึงถึงประเภทของหน่วยคุณต้องตัดสินใจว่ามันหมายถึงอะไร ซึ่งหมายความว่าการเลือกสมการที่รวมปัจจัยทั้งหมดที่คุณต้องการให้เกมของคุณรวมไว้ด้วย หากคุณต้องการให้ทหารราบเก่งกว่าทหารม้าคุณต้องตัดสินใจว่าควรหมายถึงอะไรเช่น คุณต้องทหารม้าเท่าไหร่กับทหารราบ 100 นาย แล้วใครล่ะที่โจมตีใคร คุณดูเหมือนจะบอกเป็นนัยว่าเพียงแค่ให้ค่าการโจมตีและการป้องกันที่แตกต่างจากทหารราบและทหารม้านั้นไม่ดีพอ - ทำไมจึงเป็นเช่นนั้น คุณกำลังพยายามที่จะเป็นตัวแทนของอะไรที่ไม่สามารถจับได้โดยค่าเหล่านั้น?

คุณต้องตัดสินใจว่าปัจจัยใดที่คุณต้องการสร้างแบบจำลองในเกมของคุณเนื่องจากจะมีผลต่อวิธีที่ผู้เล่นจะเข้าใกล้ สิ่งเหล่านี้อาจรวมถึงขนาด / ปริมาณหน่วยประเภทหน่วยประสบการณ์ของหน่วย (เช่นสถานะทหารผ่านศึก) ภูมิประเทศและผลกระทบสิ่งแวดล้อมความแตกต่างระหว่างการโจมตีและการป้องกันหากมีไม่ว่าจะเป็นแบบจำลองความเสียหายและการขัดสีหรือไม่ การต่อสู้ความสามารถในการถอนหรือหนี (อาจรวมถึงการสร้างแบบจำลองของขวัญกำลังใจ) การสุ่มที่คุณต้องการในสมการและอื่น ๆ

เมื่อคุณรู้ทั้งหมดนี้มีวิธีการทางคณิตศาสตร์พื้นฐานหลายประการที่คุณสามารถทำได้ คุณสามารถทำระบบ "มีโอกาสที่จะชน" ได้โดยรอบเหมือนกับที่มีเกมสวมบทบาทมากมายเช่น ระบบการต่อสู้ d20 คุณสามารถทำระบบโยนเหรียญแบบถ่วงน้ำหนักได้หนึ่งรอบเหมือนเกมอารยธรรมดั้งเดิม คุณสามารถให้แต่ละฝ่ายสร้างคะแนนโดยการเพิ่มคุณสมบัติให้กับตัวเลขสุ่มและใครก็ตามที่ได้รับรางวัลสูงสุดจะเป็นผู้ชนะ และคุณสามารถอนุญาตให้ระบบเหล่านี้ทำงานแบบต่อเนื่องหรือเพื่อหักคะแนนพลังชีวิตหรือคะแนนขวัญกำลังใจหรืออะไรก็ตาม ระบบใดก็ได้ที่สามารถใช้งานได้ แต่คุณต้องสร้างสมดุลในแบบที่คุณต้องการให้เล่น ในที่สุดทางเลือกของวิธีการสร้างแบบจำลองการต่อสู้เป็นส่วนสำคัญของการออกแบบเกมและไม่ใช่สิ่งที่คนอื่นสามารถมอบให้คุณได้


คุณพูดถูก Kylotan อย่างสมบูรณ์ ฉันมีความคิดบางอย่างเกี่ยวกับการต่อสู้ก่อนที่จะเริ่มออกแบบเกม อย่างไรก็ตามฉันโพสต์คำถามนี้ถามว่ามีวิธีที่ดีกว่าในการออกแบบและหาสิ่งที่เป็นวิธีที่ดีที่สุดที่จะใช้มัน ฉันชนะทั้งสองอย่างฉันเดา :) เพื่อนของฉันคุณช่วยบอกฉันทีว่าฉันสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทางคณิตศาสตร์เหล่านั้นได้ที่ไหน นอกจากนี้หากฉันตอบคำถามทั้งหมดที่คุณถามเกี่ยวกับการเลือกระบบคุณสามารถให้คำแนะนำกับฉันว่าอันไหนดีที่สุดสำหรับกรณีของฉัน ขอบคุณมากสำหรับช่วงเวลาของคุณ :)
Ali Albahrani

ฉันไม่สามารถบอกได้ว่าอะไรจะดีที่สุด แต่คุณควรเริ่มง่าย ๆ และปรับปรุงให้ดีถ้าคุณต้องการ ทราเวียนดูเหมือนว่าจะมีการโจมตีแบบเรียบง่ายกับระบบป้องกันโดยมี 2 ยูนิต (ทหารราบและทหารม้า) และ 2 คะแนนการป้องกันต่อหน่วยตามลำดับ วิธีง่ายๆในการแก้ไขการต่อสู้ตามที่ใช้ในอารยธรรม 1 คือการแบ่งคะแนนการโจมตีของผู้โจมตีโดยผลรวมของคะแนนนั้นและคะแนนการป้องกันของผู้พิทักษ์ นี่ให้เปอร์เซ็นต์แก่คุณ ตอนนี้เลือกตัวเลขสุ่มระหว่าง 0 และ 100 เปอร์เซ็นต์ หากต่ำกว่าคะแนนการโจมตีของผู้โจมตีผู้ชนะจะได้รับ มิฉะนั้นฝ่ายรับจะชนะ
Kylotan

15

สำหรับพลังงานแสงอาทิตย์อาณาจักรยอดผมได้รับแรงบันดาลใจจากLanchester ของสมการสำหรับการสร้างแบบจำลองสงคราม ฉันมีการต่อสู้หลายครั้งพร้อมกันในแต่ละรอบการต่อสู้

ในการต่อสู้ครั้งแรกทุกคนโจมตีทหาร ในทหารของ SRE นั้นดีที่สุดสำหรับทหาร (ไม่ใช่กรรไกรกระดาษหิน แต่เป็นทหารราบการโจมตีทางอากาศและห้วงอวกาศ) ฉันตั้งค่าพลังโจมตีและป้องกันที่ทหารมีการโจมตีที่ดีที่สุด:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

ในการต่อสู้ครั้งที่สองทุกคนโจมตีสถานีป้องกัน ในเครื่องบินรบ SRE จะดีที่สุดสำหรับสถานีป้องกัน (เช่นต่อต้านอากาศยาน):

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

ในการต่อสู้ครั้งที่สามทุกคนโจมตีเรือลาดตระเวนหนัก ในเรือลาดตระเวนหนัก SRE นั้นอยู่ในอวกาศและดีที่สุดกับเรือลาดตระเวนหนักอื่น ๆ :

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(ฉันจำไม่ได้ว่าฉันใช้ค่าคงที่เหล่านี้เป็นเพียงตัวอย่าง) ในการต่อสู้แต่ละรอบผู้โจมตีจะสูญเสียความแข็งแกร่งของการป้องกันบางส่วนและผู้ปกป้องจะสูญเสียความแข็งแรงของการโจมตีเพียงเล็กน้อย ฉันเชื่อว่าสิ่งนี้สอดคล้องกับกฎหมายสแควร์ของ Lanchester (สมการที่นี่ ) ฉันเพิ่มการสุ่ม แต่ฉันจำไม่ได้ว่าอยู่ที่ไหน หลังจากการต่อสู้แต่ละรอบกองทัพจะเล็กลง ฉันกำหนดขีด จำกัด สูงสุดตามจำนวนรอบ หลังจากนั้นฝ่ายพ่ายแพ้ก็จะล่าถอย

มันไม่ใช่ความจริงที่จะมีทหารราบอยู่บนพื้นยิงเข้าไปในห้วงอวกาศ แต่มันทำงานได้ดีกว่าสำหรับเหตุผลในการเล่นเกมเพื่อให้ทุกหน่วยสามารถต่อสู้กับยูนิตอื่น ๆ ได้ (ลดประสิทธิภาพ)


12

ฉันมักจะพูดว่า 'หากคุณไม่สามารถหาวิธีแก้ปัญหาอย่างชัดเจน คุณสามารถจำลองการต่อสู้ภายในได้จนกระทั่งกองทัพหนึ่งถูกกำจัดหรือถอยออกไป (ขึ้นอยู่กับผลลัพธ์ที่เป็นไปได้ในเกมของคุณ)

ฉันจะใช้สิ่งนี้:

สำหรับการทำซ้ำแต่ละครั้งของการต่อสู้หน่วยทั้งหมดจะฉวยโอกาสดังนั้นพวกเขาจึงพยายามทำความเสียหายให้มากที่สุด แต่ละหน่วยเลือกยูนิตศัตรูที่จะโจมตีรอบนี้โดยพิจารณาจากข้อดี / ข้อเสียที่ทราบ

จากนั้นดำเนินการต่อสู้ย่อยทั้งหมด ตัวอย่าง:

ให้หอกมีผลกับคาวาลารี่, คาวาลาไรย์ใช้ได้ผลกับนักธนูและนักธนูที่มีประสิทธิภาพต่อสเปีย

ในการต่อสู้ระหว่างกองทัพทั้งสองประกอบด้วยอัลประเภทของหน่วยพื้นฐานเหล่านี้สเปียร์แมนทุกคนจะโจมตีกองทหารม้าหน่วยทหารม้าทั้งหมดจะโจมตีพลธนูและพลธนูทุกคนจะโจมตีสเปียร์แมน หากตัวอย่างด้านหนึ่งไม่มีพลธนูทหารม้าอีกฝ่ายจะเลือกประเภทเป้าหมายที่ดีที่สุดถัดไป (เป็นหน่วยทหารม้าข้าศึก)

เหตุการณ์หน่วยโจมตีแต่ละหน่วยจะได้รับการแก้ไขแยกต่างหากโดยหน่วยที่เสียจะเสียหายหรือถูกทำเครื่องหมายว่าถูกทำลาย

หลังจากการต่อสู้ของแต่ละบุคคลได้รับการแก้ไขแล้วให้ลบยูนิตทั้งหมดที่ถูกทำลายหรือทำลายอย่างรุนแรง

การวนซ้ำครั้งต่อไปจะเริ่มโดยใช้กองทัพที่ลดลงตอนนี้


เห็นด้วยกับโพสต์นี้จริงๆ ดีกว่าที่จะย้ำผ่านการต่อสู้แทนการลดให้เป็นสมการเดียว และฉันจะเพิ่มการสุ่มให้แน่นอน ควรจะมีโอกาสเล็กน้อยที่ผู้พิทักษ์อ่อนแอจะม้วนตัวสูงและทำคะแนนสำคัญ ข้อดีอีกประการของการทำซ้ำคือคุณสามารถสร้างคำบรรยายของเหตุการณ์เพื่อแสดงเครื่องเล่น "นักดาบโจมตีและทำลายทมิฬในไม่ช้าแต่ทว่าแคลวารีมาถึงและ ... "
ทิมโฮลท์

ฉันชอบคำตอบของคุณเป็นอย่างมากและฉันคิดว่าฉันจะใช้มันด้วยการสุ่ม :)
Ali Albahrani

3

ฉันกำลังทดสอบเบต้าเกมที่ปัจจุบันเป็น Solar Realms ( Star Empire Elite ) ที่เรียบง่ายและฉันเริ่มโดยใช้สิ่งที่คล้ายกับสมการของ Amit (ด้านบน) โดยเฉพาะอย่างยิ่งฉันชอบความคิดของการมีสามขั้นตอนในการต่อสู้ที่คุณต้องชนะสองในสาม แต่ฉันยังต้องการที่จะแนะนำองค์ประกอบของการสุ่มในการต่อสู้และสำหรับการที่ฉันได้รับอิทธิพลจากเกมบนโต๊ะบางเกม

การประมวลผลเป็นสิ่งที่น่ากังวลหากเกมมีการขยายขนาดดังนั้นฉันไม่ต้องการที่จะปฏิบัติตามวิธีการที่แนะนำโดย sum1stolemyname ด้านบนถึงแม้ว่าเกมของคุณใช้ไคลเอนต์เพื่อประมวลผลผลลัพธ์ซึ่งตรงข้ามกับเซิร์ฟเวอร์ วิธีการที่ดี

ฉันตัดสินใจที่จะแบ่งการต่อสู้ออกเป็นสองขั้นตอน (คล้ายกับทั้งสามในแบบจำลองของ Amit): อากาศและพื้นดิน ฉันคำนวณการโจมตีและป้องกันความแข็งแรงและปรับความแรงของการโจมตีลงตามเสี้ยว (เพื่อให้ผู้พิทักษ์ได้เปรียบ) ณ จุดนั้นถ้าความแข็งแรงของการโจมตีและความแข็งแรงของการป้องกันมีค่าเท่ากันการโจมตีจะมีโอกาส 50% ของชัยชนะ จากที่นั่นฉันปรับโอกาสร้อยละของชัยชนะขึ้นหรือลงตามความแข็งแกร่ง (หรือน้อยกว่า) ที่ผู้โจมตีเทียบกับผู้พิทักษ์ นี่คือสมการที่เรียบง่ายสำหรับอากาศ:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

ฉันระบุว่า chance_of_victory ไม่สามารถมีขนาดใหญ่กว่า 80 หรือน้อยกว่า 5 จากนั้นฉันเพิ่งสร้างตัวเลขสุ่มจาก 100 แล้วดำเนินการส่งต่อผลลัพธ์นั้นไปสู่การต่อสู้บนบก

สิ่งหนึ่งที่ฉันยังไม่ได้แก้ไขเพื่อความพึงพอใจของฉันคืออัตราความเสียหาย แต่ฉันคิดว่าวิธีที่ดีที่จะเข้าใจเรื่องนี้ก็คือการเปรียบเทียบความเป็นไปได้ที่จะเกิดขึ้นกับตัวเลขสุ่มที่สร้างขึ้นและใช้มันเพื่อใช้เศษเสี้ยวของกองกำลังป้องกันการโจมตีเป็นผู้บาดเจ็บ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.