الشبكة العربية لمطوري الألعاب

مبتدئ  وائل طيارة مشاركة 1

السلام عليكم
أنا أعمل على تصميم لعبة ويب و حالياً أحتاج لمعادلات رياضية متبعة لحساب نقاط الخبرة
قمت بالبحث على جووجل و لكن للأسف لم أجد أي طريقة متعارف عليها بشكل عام وخاصة في ألعاب الويب
أتمنى لمن لديه معرفة أو نصائح يمكن أن أستفيد منها، ان يطلعني عليها

شكراً جزيلاً

خبير  سلوان الهلالي مشاركة 2

السلام عليكم،

رغم اني لم افهم ما تقصد بحساب نقاط الخبرة تحديداً... لكني اعتقد اني اعرف الفكرة
شخصياً احب استخدام دوال المنحنيات الرياضية لهكذا اشياء، وابسط صورة ممكنة هي الدوال الخطية.
على سبيل المثال، في لعبة BattleCity اعتمدت على هذا الصنف لتحديد مستوى الصعوبة حسب المرحلة التي وصلها اللاعب (لغة بايثون):

# Format of line equation list item
# (m, (x1, y1), (x2,y2)) or (m, start, end)
# Equation:
#     slope(m) = (y2 - y1) / (x2 - x1)
# given X, first specify which line X belongs to, then calculate Y:
#     Y = (m * (X - x1)) + y1
class LinearEquation:
    def __init__(self): ### this is the contructor
        self.lines = [] ### an empty list

    def addLine(self, start, end):
        fstart = (float(start[0]), float(start[1]))
        fend = (float(end[0]), float(end[1]))
        m = (fend[1] - fstart[1]) / (fend[0] - fstart[0])
        self.lines.append((m, fstart, fend))

    def getY(self, x):
        line = None
        for lx in self.lines:
            if x <= lx[2][0]: ### in other words -> if x <= x2 of line:
                line = lx
                break
        if line == None:
            ### I could simply extrapolate from last line here, but it's safer to throw an exception

            raise "DUDE!!! you gave a value above equation limits in LinearEquation X("
        return (lx[0] * (float(x) - line[1][0])) + line[1][1]

يمكن باستخدام هكذا الصنف بناء منحنيات تقريبية معقدة من خطوط منفصلة.
مثلاً في لعبة BattleCity، كان لدي 4 انواع من الدبابات الاعداء التي تتفاوت في قوتها، استخدمت هذا الصنف لحساب نسبة كل نوع في المرحلة الحالية حسب رقمها، ثم ادخال النسب الناتجة في اجراء خاص يقوم بتوليد ارقام عشوائي حسب النسب.
تبدو المنحنيات الناتجة في اللعبة كالتالي: (حيث كل لون يمثل نوعاً من الدبابات من الاقل قوة -الازرق- الى الاكثر قوة -الاحمر-)



 يمكنك كذلك اعتماد منحنيات معقدة اكثر، كالمنحنيات الجيبية او الأسية، او تستطيع ان تتحدى وتذهب نحو منحنيات Bézier (او ما شابه)، جميعها تشترك في نفس الخطوات: تعريف المنحني رياضياً والاحتفاظ ببارمتراته، ثم ادخال قيمة Y للحصول على X (أو delta للحصول على X,Y).

هل هذا هو الموضوع الذي تستفسر عنه؟ ام اني اغرد خارج السرب كما يقال ☺

مبتدئ  وائل طيارة مشاركة 3

السلام عليكم
أشكرك أخي سلوان، ولكن ربما لم أكن واضحاً بشكل كافي
في ألعاب الويب هناك نظام متبع مشابه جداً للعب ال RPG ألا و هو نظام نقاط الخبرة أو Experience Points
في ألعاب ال RPG يحصل اللاعب على عدد معين من النقاط كلما قاتل و انتصر عى أعدائه و بعد أن يجمع عدد معين من النقاط ينتقل إلى مستوى جديد "مثلاً في لعبة Pokemon تحتاج إلى 100 نقطة خبرة ليتطور البوكيمون من  Level 1 إلى  Level 2 "
في ألعاب الويب مثلاً ال FarmVille على ال Facebook، يحتاج اللاعب إلى "مثلاً 100 نقطة خبرة ليتطور من  Level 1 إلى  Level 2"
ماهي المعادلات الرياضية المستخدمة في هذا النوع من الألعاب؟
شكراً جزيلاً 😄

خبير  سلوان الهلالي مشاركة 4

حسناً، يبدو انه فعلاً ما كنت اتكلم عنه. 😲
ليس هنالك معادلات ثابتة تستخدمها جميع الالعاب، كل ما في الامر ان مقدار نقاط الخبرة المطلوب يزيد كل مستوى، طريقة الزيادة تعود لك انت مطوّر اللعبة.
احدى الطريق الاكثر مرونة هي الطريقة المنحنيات التي ذكرتها، عندما تقول "المعادلات الرياضية" فهو هذا ما اقصده بالمنحنيات، المنحني يمثل معادلة رياضية تستخدمها للحصول على قيم ص لأي قيمة س (او العكس ان اردت!).
ابسط طريقة ممكنة (وهي مستخدمة في العاب كثيرة، مثلاً Diablo) هو تحديد الخبرة المطلوبة يدوياً لكل مستوى كمصفوفة بسيطة يمكنك الرجوع اليها في اي وقت وتعديلها كما شئت، هكذا تتجنب المعادلات الرياضية.

مبتدئ  وائل طيارة مشاركة 5

السلام عليكم
لقد إختلط علي الأمر في البداية بين الدبابات وبين نقاط الخبرة التي كنت اتحدث عنها ولكن توضحت الفكرة تماما 😄
هل تعني بكلامك أن نسبة معينة من الالعاب لا تستخدم معادلة أو نوع معين من ال Distribution ؟؟ وأنهم يعتمدون على الطريقة اليدوية وبعد ذلك يقومون بالتجريب و تعديلهم ؟

لك جزيل الشكر 😋

خبير  سلوان الهلالي مشاركة 6

في 28 أيلول 2010 06:21 م، غمغم وائل طيارة باستغراب قائلاً:

هل تعني بكلامك أن نسبة معينة من الالعاب لا تستخدم معادلة أو نوع معين من ال Distribution ؟؟ وأنهم يعتمدون على الطريقة اليدوية وبعد ذلك يقومون بالتجريب و تعديلهم ؟

بالضبط 😄
على سبيل المثال، من لعبة Diablo 2:


اعلى مستوى ممكن هو 99، وفي النهاية تثبت قيمة الخبرة المطلوبة على رقم كبير لا تتزايد بعده