ออมทรัพย์รัฐเกมโร๊คไลค์?


11

ฉันกำลังทำงานกับ roguelike พื้นฐานโดยใช้ HTML5 และ jQuery และฉันเจอปัญหา

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

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


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

บางทีฉันจะใช้ถ้อยคำใหม่เพื่อแก้ไขปัญหานั้นโดยตรง =)
CodeMoose

@TimHolt - แก้ไขตามคำแนะนำของคุณ
CodeMoose

คำตอบ:


8

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

แน่นอนเมื่อมีการบันทึกที่เหมาะสมบันทึกคำสั่งเก่าจะถูกโยนทิ้งไป (แม้ว่าคุณสามารถบันทึกเพื่ออนุญาตให้เล่นเกมเก่าได้หากคุณทำเช่นนั้นคุณอาจต้องการรวมการประทับเวลาในบันทึกสำหรับการเล่นซ้ำตามเวลาจริง ) คุณอาจต้องการทำการบันทึกแบบเต็มโดยอัตโนมัติหลังจากมีคำสั่งnคำสั่งตั้งแต่บันทึกครั้งสุดท้าย (ที่, พูด, n = 1,000) เพื่อหลีกเลี่ยงการเล่นซ้ำที่ยาวเกินไปหากผู้เล่นยังคงอยู่ในระดับเดียวกันนานเกินไปก่อนปิดหรือหยุดเกม .

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

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


1
AFAIK ทั้งหมดของ RGN เป็นแบบจำลองเทียม .. คุณต้องการฮาร์ดแวร์พิเศษเพื่อรับค่าสุ่ม (ไม่ถูกต้อง) อย่างแท้จริง
bobobobo

1
@bobobobo มี pseudorandom (seeded) และมีตัวเลขสุ่มที่ปลอดภัยเข้ารหัส (ไม่ถูกตรวจสอบ) ในแพลตฟอร์ม. Net อาจ / อาจไม่ใช่ฮาร์ดแวร์สุ่ม แต่ก็ใกล้พอที่จะไม่สามารถเก็บเมล็ดได้
Rangoric

2

ดู/programming/3888902/javascript-detect-browser-close-tab-close-browserสำหรับคำถามทั่วไปที่เหมือนกัน

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

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


ขอบคุณ Tim - เมื่อฉันได้รับในความคิดของเกม dev มันง่ายมากที่จะฝากข้อมูลที่สัมผัสกับ dev ของเกม อุปกรณ์ประกอบฉากสำหรับการให้คำตอบต่อไป
CodeMoose

ไม่ต้องกังวล - ดูความคิดเห็นของฉันปรับปรุงเกี่ยวกับคำถามมากเกินไป :)
โฮลท์ทิม

ฉันจะบอกว่าสันดอนที่เพิ่มขึ้นในแต่ละการเคลื่อนไหวด้วย
bobobobo

2

วิธีการไม่ใช่การบันทึกที่เพิ่มขึ้น แต่การค้นหาเวลาสำหรับการบันทึกแบบเต็ม:

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