هندسة اللعبة واستراتيجية التصميم للعبة بطاقة متعددة اللاعبين

StackOverflow https://stackoverflow.com/questions/605009

سؤال

أنا جديد نسبيًا في تطوير الألعاب لذا قررت إنشاء مشروع هواية من الصفر للتجربة والترفيه.اللعبة المحددة تشبه لعبة البوكر المعروفة باسم ثلاث بطاقات التباهي.يتم لعب اللعبة في الفيلم قفل وتخزين وبرميلي دخان.

لقد قرأت بعض المواضيع المتعلقة بتطوير اللعبة في SO، على الرغم من أنها في الغالب هذا السؤال.وقد ساعد هذا في تجديد الطريقة الأصلية التي كنت أصنع بها الكائنات.

إحدى المشاكل المحددة التي أواجهها هي تحديد حالة اللعبة.كان نهجي الأولي هو فصل كل شيء (على سبيل المثال.حفظ مكدسات الرقائق داخل أ Player class) ولكن بعد قراءة الردود على سؤال لقد ذكرت سابقًا، يبدو كما لو أن جميع الحالات الممكنة للعبة يجب الحفاظ عليها ضمن نطاق واحد GameState هدف.ما توصلت إليه هو في الأساس هذا:

abstract class CardGameState
{
    protected List<Player> _Players;
    protected Player _CurrentPlayer;
    protected Dictionary<Player, int> _Chips;
    protected Dictionary<Player, Hand> _CurrentHand;
    protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc.
    /* etc. */

حيث كل CardGameState يتم تعديله عن طريق بعض الإجراءات:

public interface IAction
{
    string Name { get; }

    CardGameState Apply(CardGameState state);
    bool IsLegal(CardGameState state);
}

أشعر الآن بقوة أن هذا يتعارض مع غرض البرمجة الشيئية، لأن البيانات المتعلقة باللاعب على وجه التحديد (في هذه الحالة، مجموعة شرائحه، ويده، وحالته الحالية) ليست مغلفة بواسطة Player هدف.

من ناحية أخرى، إذا قام أحد اللاعبين برفع الرهان، فسوف أقوم بإنشاء ملف RaiseAction الذي ينفذ IAction, ، لكن ال IAction الواجهة تقبل فقط حالة اللعبة الحالية، والتي لا أعتقد أنها ستكون مثالية إذا تم تخزين مجموعات الرقائق داخل ملف Player فصل.

في الأساس سؤالي هو:هل يمكنني الحصول على أفضل ما في كلا العالمين بحيث يمكنني الحصول على تمثيل دقيق لحالة اللعبة مع الاحتفاظ في نفس الوقت بجميع البيانات المتعلقة على وجه التحديد بكائن داخل حالة اللعبة داخل الكائن المحدد؟

هل كانت مفيدة؟

المحلول

في الألعاب عبر الإنترنت باستخدام نمط الأوامر (IAction الخاص بك) هي الطريقة القياسية والمثبتة للقيام بذلك.إنها ليست موجهة للكائنات بمعنى اللاعب، ولكن الإجراءات موجهة للكائنات، لذا من وجهة نظر نظرية بحتة، أعتقد أنها نمط تصميم قوي.ومن الناحية العملية، هذه هي الطريقة التي تنفذ بها كل لعبة ناجحة عبر الإنترنت رأيتها، لكن لاحظ أن ألعاب الحركة تستخدم عادةً إجراءات/حزم صغيرة جدًا، حتى تصبح عمليًا مجموعة من الأنواع.

يحرر:

بعد فترة طويلة من إجابتي على هذا السؤال، عدت إلى هنا وأدركت أن الحل الآخر لهذه المشكلة هو تنفيذ مشغلات GameState، ومجموعات التشكيلات، وما إلى ذلك...كما مشتق من أنا اصرح فئة مع تطبيق (إجراء IA) عضو.بهذه الطريقة تطبق الكائنات الإجراءات على نفسها، بدلاً من جعل التطبيق يطبق الإجراءات على الكائنات، سيؤدي ذلك إلى تعيين الإجراءات والحالة إلى ملف نمط الزائر بدلاً من نمط الأمر.سوف ينجح أي من الحلين، حيث يكون لدى الزائر حمل أكبر وتغليف أكبر، في حين أن الأمر هو الحل الأسهل بتغليف أقل.

نصائح أخرى

ويبدو أن كنت قد يكون كائن-orientizing ذلك من أجل كائن توجيه و...

ويبدو أن مشكلة لعبة البولينج .

وتحرير: -Summary-
انها لقراءة طويلة، ولكن في الأساس، من خلال TDD وإعادة بيع ديون، وذهب تطبيق البولينج التهديف من مجموعة ضخمة مع الكثير من الفصول وتعدد الأشكال إلى 20 أو 30 خطوط أنيقة من التعليمات البرمجية. لماذا ا؟ لأنها لم تكن في حاجة حقا أن تكون هناك في المقام الأول

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top