ฉันสนุกกับตัวเองเมื่อไม่นานมานี้โดยการเขียนโปรแกรมเกมผจญภัยที่ใช้ข้อความเป็นหลักและฉันก็ติดอยู่กับสิ่งที่ดูเหมือนว่าจะเป็นปัญหาการออกแบบที่เรียบง่ายมาก
เพื่อให้ภาพรวมคร่าวๆ: เกมแบ่งย่อยเป็นRoom
วัตถุ แต่ละRoom
รายการมีEntity
วัตถุที่อยู่ในห้องนั้น แต่ละคนEntity
มีสถานะเหตุการณ์ซึ่งเป็นแผนที่แบบสตริง -> บูลีนอย่างง่ายและรายการการกระทำซึ่งเป็นแผนที่แบบสตริง -> ฟังก์ชั่น
[action] [entity]
ท่านผู้ใช้แบบฟอร์มที่ใช้ Room
ใช้ชื่อนิติบุคคลที่จะกลับมาที่เหมาะสมEntity
วัตถุซึ่งจากนั้นจะใช้ชื่อการกระทำที่จะหาฟังก์ชั่นที่ถูกต้องและดำเนินการมัน
ในการสร้างคำอธิบายห้องพักแต่ละวัตถุแสดงสตริงคำอธิบายของตัวเองแล้วผนวกสตริงคำอธิบายของทุกRoom
รายละเอียดอาจเปลี่ยนแปลงขึ้นอยู่กับสถานะของมัน ( "ประตูเปิด", "ประตูถูกปิด", "ประตูถูกล็อค" ฯลฯ )Entity
Entity
นี่คือปัญหา: การใช้วิธีนี้จำนวนฟังก์ชั่นคำอธิบายและการกระทำที่ฉันต้องนำมาใช้อย่างรวดเร็ว ห้องเริ่มต้นของฉันคนเดียวมีประมาณ 20 หน้าที่ระหว่าง 5 เอนทิตี
ฉันสามารถรวมการกระทำทั้งหมดไว้ในฟังก์ชั่นเดียวและถ้า - อื่น / สลับไปมาได้ แต่ก็ยังมีสองฟังก์ชั่นต่อเอนทิตี ฉันยังสามารถสร้างEntity
คลาสย่อยเฉพาะสำหรับวัตถุทั่วไป / ทั่วไปเช่นประตูและกุญแจได้
แก้ไข 1: ตามที่ร้องขอตัวอย่างรหัสเทียมของฟังก์ชันการกระทำเหล่านี้
string outsideDungeonBushesSearch(currentRoom, thisEntity, player)
if thisEntity["is_searched"] then
return "There was nothing more in the bushes."
else
thisEntity["is_searched"] := true
currentRoom.setEntity("dungeonDoorKey")
return "You found a key in the bushes."
end if
string dungeonDoorKeyUse(currentRoom, thisEntity, player)
if getEntity("outsideDungeonDoor")["is_locked"] then
getEntity("outsideDungeonDoor")["is_locked"] := false
return "You unlocked the door."
else
return "The door is already unlocked."
end if
ฟังก์ชั่นคำอธิบายทำหน้าที่เหมือนกันมากในการตรวจสอบสถานะและส่งคืนสตริงที่เหมาะสม
แก้ไข 2: แก้ไขข้อความของฉัน สมมติว่าอาจมีวัตถุในเกมจำนวนมากที่ไม่แชร์พฤติกรรมทั่วไป (การตอบสนองตามสถานะของการกระทำเฉพาะ) กับวัตถุอื่น มีวิธีที่ฉันสามารถกำหนดพฤติกรรมที่ไม่ซ้ำกันเหล่านี้ในวิธีที่สะอาดและบำรุงรักษาได้ดีกว่าการเขียนฟังก์ชั่นที่กำหนดเองสำหรับแต่ละการกระทำที่เฉพาะเจาะจงของเอนทิตี้หรือไม่?