วิธีการตรวจสอบความสำเร็จในการเล่นเกม?


10

ฉันโพสต์สิ่งนี้ไปยัง stackoverflow โดยไม่ตั้งใจและตอนนี้โพสต์ที่นี่ตามคำแนะนำในเว็บไซต์นั้น ...

นี่เป็นคำถามเชิงแนวคิดระดับสูงมาก พูดในแอปพลิเคชันซอฟต์แวร์ฉันมีการกระทำที่แตกต่างกัน 4 อย่างเช่นอัปโหลดแชร์แสดงความคิดเห็นและกดไลค์

และฉันต้องการมอบป้ายความสำเร็จให้กับผู้ใช้ที่ชอบ:

  • Rookie - อัปโหลด 5 ไฟล์แรกของคุณ
  • อัปโหลด Junkie - อัปโหลด 20 ไฟล์ใน 1 วัน
  • ซอฟต์แวร์รวบรวมข้อมูลกลางคืน - อัปโหลดไฟล์หลังเที่ยงคืน
  • Share-a-holic - แบ่งปัน 10 ไฟล์ที่แตกต่างกัน
  • Likes-Everything - ชอบ 20 ไฟล์ที่แตกต่างกัน

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

คำถามที่ใหญ่ที่สุดของฉันคือฉันจะตรวจสอบความสำเร็จเหล่านี้ได้อย่างไร ฉัน:

1) ตรวจสอบทุกการกระทำเพื่อดูว่า ... (เวลาจริงมากที่สุด) 2) มีโปรแกรมอื่นตรวจสอบฐานข้อมูลอยู่ตลอดเวลากับชุดของกฎหรือไม่? (ง่าย)

มีกระบวนทัศน์อื่นที่ฉันขาดหายไปหรือไม่? ฉันรู้สึกว่ามีแน่นอนเพราะในหลาย ๆ เกม (เช่น jetpack สำหรับ iOS เป็นต้น) ฉันได้รับแจ้งถึงความสำเร็จที่ฉันได้ปลดล็อคในทันทีที่ฉันปลดล็อคซึ่งฉันพบว่ามันค่อนข้างน่าประทับใจ

ขอบคุณ


คุณได้ออกแบบหรือสร้างระบบความสำเร็จแล้วและต้องการทราบวิธีใช้งานในเกมหรือไม่?
Harrison Brock

คำตอบ:


6

สิ่งที่คุณทำโดยทั่วไปคือมีระบบ "ความสำเร็จ" การกระทำใด ๆ ที่เกิดขึ้นเรียกว่าระบบความสำเร็จและบอกว่า "เฮ้สิ่งนี้เพิ่งเกิดขึ้น"

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

เหตุผลที่คุณทำเช่นนี้คือสองเท่า

  • คุณไม่ต้องการกระจายตรรกะของรัฐไปทั่ว codebase ของคุณ

  • บางครั้งความสำเร็จจะต้องมีการรวมกันของ "สิ่ง" ซึ่งอาจเกิดขึ้นในระบบที่แตกต่างกันอย่างสมบูรณ์ / ครั้ง / ฯลฯ และการกระจายตรรกะสำหรับสิ่งนี้รอบฐานรหัสของคุณจะส่งผลให้มีความซับซ้อนที่ไม่จำเป็นจำนวนมาก

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

  • เมื่อ "ผู้ใช้กดอะไร" เกิดขึ้น "เพิ่ม" ตัวแปร "ที่กด"

จากนั้นคุณสามารถมีกฎอื่นซึ่งก็คือ

  • เมื่อตัวแปร "ที่กด" คือ "มากกว่า" มากกว่า "ค่าบางค่า" ความสำเร็จของการแจก "blah"

หรือบางที

  • เมื่อ "ผู้ใช้สังหารเจ้านาย" จะเกิดขึ้น "แจก" ความสำเร็จ "blah"

ระบบความสำเร็จจะได้รับมอบหมายด้วยการรักษาสถานะของความสำเร็จที่ได้รับการแจกดังนั้นคุณจะไม่ได้รับซ้ำ


0

วิธีจัดการอย่างประณีตอาจเป็นรูปแบบข้อมูลจำเพาะ คุณมีผู้จัดการผลสัมฤทธิ์ทางการเรียนซึ่งจะสอบถามผู้ใช้ของคุณเป็นระยะสำหรับสิ่งที่ตรงกับชุดของข้อกำหนด ระดับความสำเร็จของคุณจะรวมถึงชื่อโลโก้คะแนนคะแนน ฯลฯ ตามปกติและข้อมูลจำเพาะที่อธิบายถึงผู้ใช้ที่ได้รับความสำเร็จนั้น ตัวอย่างเช่นใน C # ความสำเร็จ "Share-a-holic" อาจมีลักษณะเช่นนี้:

AchievementType ShareAHolic = new AchievementType
{
    Name = "Share-a-holic",
    Description = "Shared 10 files",
    Score = 25,
    Specification = (user => user.SharedFiles.Distinct().Count() > 10)
};

AchievementManager.AddAchievementType(ShareAHolic);

และเมื่อถึงจุดที่เหมาะสมผู้จัดการความสำเร็จของคุณสามารถทำสิ่งนี้:

foreach (AchievementType achievement in AchievementTypes)
{
    var users = DB.Users.Where(achievement.Specification && !(user.Achievements.Contains(achievement)));
    foreach (User u in shareaholics)
    {
        AchievementManager.Award(u, achievement);
    }
}

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


ความสำเร็จในการแบ่งพาร์ติชันกลายเป็นเรื่องสำคัญอย่างรวดเร็ว AchType ต้องการคุณสมบัติ 'sope' ที่สามารถช่วยเหลือ DB.Users.Where () เพื่อหลีกเลี่ยงความสำเร็จที่ไม่เกี่ยวข้องเมื่อเป็นไปได้ ดังนั้นหากความสำเร็จในการแชร์ไฟล์สามารถมอบให้ใน PvP ได้เพียงค้นหา PvP เท่านั้น ในขณะที่สิ่งทั่วไปเช่นขโมยทรัพย์สินอาจเป็นไปได้ทั่วโลกและจะไม่มีขอบเขตดังกล่าว
hpavc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.