ฉันจะสร้างแบบจำลองเกมตามเศรษฐกิจในรหัสได้อย่างไร


10

ฉันต้องการสร้างเกมเศรษฐกิจโดยยึดตามอารยธรรมโบราณ ฉันไม่แน่ใจว่าจะออกแบบมันอย่างไร ถ้าฉันทำงานในเกมที่มีขนาดเล็กกว่าเช่นสำเนาของ "Space Invaders" ฉันจะไม่มีปัญหาในการสร้างมันขึ้นมาเช่นนี้:

  • คลาสควบคุมหลัก
  • คลาสกราฟิก
  • คลาสผู้เล่น
  • ระดับศัตรู

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


3
คุณอาจต้องการใช้ Entity-Component-System บางรูปแบบ (นี่คือการอ้างอิงแบบบัญญัติ ) - ไม่มีเอนทิตีดึงตัวเองเลย (โดยเฉพาะถ้าคุณมีจำนวนมาก)
ThorinII

9
คุณจะประหลาดใจอย่างมากกับเกมที่ "น่ากลัว" ที่น่ากลัวสับสนและไม่เป็นระเบียบมากที่สุด พวกมันถูกสร้างขึ้นตามกำหนดเวลาและเหตุการณ์สำคัญ เพียงแค่เขียนเกมและโครงสร้างใด ๆ ก็ตามที่ตกไปจากสิ่งที่คุณต้องเขียนก็จะดีถ้าไม่ดีไปกว่าเกม AAA ส่วนใหญ่ที่นั่น
Sean Middleditch

แม้ว่าคุณจะไม่ได้ไปเต็มที่ ECS เป่ามันยังดีที่จะไม่ทำซ้ำรหัสให้ควบคุมซ้ำนิติบุคคลและเรียก renderer หรือแม้แต่ปล่อยให้สแกน renderer การอัปเดตรหัสย่อยใน 100 แห่งเป็นเรื่องเจ็บปวด
MickLH

1
การกระโดดจาก Space Invaders ไปยังเกมที่ซับซ้อนอย่างที่คุณอธิบายนั้นค่อนข้างรุนแรงในความคิดของฉัน มีขั้นตอนการเรียนรู้เพิ่มเติมระหว่างเกมสองเกมนี้ก่อนที่คุณจะเข้าสู่เกมใหญ่ พิจารณาสร้างแพลตฟอร์ม 2D sidecroller และเพิ่มความซับซ้อนของเกมของคุณทีละน้อย การเปลี่ยนเกียร์ตั้งแต่เกียร์แรกถึงเกียร์ห้าจะทำให้คุณมีความเร็วสูงสุด 120 กม / ชม แต่ไม่ได้มีประสิทธิภาพเท่าเดิม (เวลา / ความพยายาม) ที่จะเป็นถ้าคุณย้ายจากระดับหนึ่งไปอีกระดับ
Emir Lima

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

คำตอบ:


5

ฉันจะสร้างคลาสประเทศที่มีกลุ่มของเมืองหรือไม่?

แน่ใจ

เมืองต่าง ๆ มีชั้นอาคารจำนวนมากหรือไม่ส่วนใหญ่จะมีชั้นเรียนของผู้คนหรือไม่?

แน่ใจ

ฉันสร้างเส้นทางการค้นหาชั้นเรียนที่ผู้เล่นสามารถเข้าถึงเพื่อเดินทางไปได้หรือไม่?

แน่ใจ

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

คุณได้นำแนวคิดในหัวของคุณและจัดกลุ่มเป็นรหัสตามกฎง่ายๆ:

  • แนวคิดนี้แตกต่างกันในพฤติกรรมหรือข้อมูลจากวัตถุอื่น ๆ ที่ฉันมีอยู่หรือไม่? (ประเทศและผู้คนแบ่งปันข้อมูลหรือพฤติกรรมที่มีความหมายน้อยมากดังนั้นพวกเขาจึงควรแสดงด้วยประเภทที่แตกต่างกันในเกม)
  • ฉันจะต้องจัดการกับแนวคิดนี้ในรหัสอย่างมีนัยสำคัญหรือไม่ (ถ้าเกมของคุณเกี่ยวข้องกับบุคคลคุณอาจต้องการPersonคลาสนั้น แต่ถ้าเกมสนใจเฉพาะพวกเขาในการรวมเช่นเดียวกับ SimCity รุ่นก่อนหน้าคุณ อาจไม่ต้องการประเภทหรืออินสแตนซ์ของประเภทนั้นเพื่อสร้างการแมป 1: 1 ของประชากรของเมืองint populationCountอาจเพียงพอ)
  • แนวคิดนี้ต้องการสถานะหรือไม่? ถ้าเป็นเช่นนั้นมันควรจะถูกห่อหุ้มอย่างใดที่ช่วยให้ฉันสามารถเก็บสถานะนี้ (คลาส) มากกว่าฟังก์ชั่นฟรี (การนำไปใช้ในการหาเส้นทางไม่ได้มีวัตถุในโลกแห่งความจริง แต่ต้องมีการติดตามข้อมูลเช่นโหนดใดในแผนที่ที่พิจารณาแล้วและทำได้ดีกว่าในชั้นเรียนมากกว่าเก็บไว้ในพวง ของวงกลมที่ซ่อนอยู่และสร้างฟังก์ชั่นอิสระ)

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

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


1

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

เพียงไม่กี่เคล็ดลับ:

  • เป็นผู้เล่นที่แตกต่างกันจริงๆจากศัตรู ? ฟังก์ชั่นจำนวนมากมีแนวโน้มที่จะเหมือนกันดังนั้นโดยปกติสิ่งเหล่านี้ควรเป็นคลาสเดียวกันหรือขยายจากคลาสพื้นฐานเดียวกัน พิจารณาAbstractPlayerชั้นฐานกับสอง subclasses HumanPlayerและAIPlayer - ทุกฟังก์ชันการทำงานร่วมกันสามารถไปในAbstractPlayer
  • ต้องการกำหนดค่าวัตถุที่มีองค์ประกอบมากกว่าการสืบทอด อย่าทำให้ลำดับชั้นการสืบทอดของคุณลึกเกินไป หากคุณเริ่มเรียกคลาสForgeWithSteelAnvilคุณควรกังวล: Forgeอาจเป็นคลาสย่อยของอาคารแต่ประเภทของทั่งที่ใช้ควรเป็นวัตถุที่อยู่ภายในอาคาร
  • ในทำนองเดียวกันคุณสมบัติที่ช่วยให้คุณสามารถกำหนดค่าวัตถุมากกว่าการเพิ่มหลายร้อยชั้นวัตถุที่แตกต่างกันเล็กน้อย

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

  • แบบจำลองวัตถุต้นแบบ - ใช้คลาสเดียวสำหรับวัตถุเกมทั้งหมดและจำลองวัตถุทั้งหมดของคุณผ่านคุณสมบัติ / คุณสมบัติและองค์ประกอบ มีความยืดหยุ่น / ไดนามิกมากกว่า OOP มาตรฐาน แต่มีความซับซ้อนในการจัดการ (โดยเฉพาะคอมไพเลอร์จะไม่ช่วยคุณมากถ้าคุณทำอะไรโง่ ๆ ) ฉันใช้สิ่งนี้เพื่อผลที่ดีในทรราช Roguelike เกมเล็ก ๆ ของฉัน ( https://github.com/mikera/tyrant )
  • ระบบส่วนประกอบของเอนทิตี - ดีถ้าคุณมีพฤติกรรมที่ซับซ้อนมากมายที่คุณต้องการผสมและจับคู่กับวัตถุเกมประเภทต่างๆ ทรงพลังมาก แต่หายาก

0

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

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


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