إنشاء صفيفات الأبعاد في روبي

المقالة التالية جزء من سلسلة. لمزيد من المقالات في هذه السلسلة ، راجع Cloning the Game 2048 في Ruby. للحصول على الكود الكامل والنهائي ، انظر gist.

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

الألغاز الجافة

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

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

instagram viewer

كيف يتم تدوير هذه المجموعة ثنائية الأبعاد ، سوف ننتقل إلى ذلك بعد أن نقوم بالفعل بإنشاء مثل هذه المجموعة.

بناء اثنين من صفائف الأبعاد

يمكن أن يأخذ أسلوب Array.new وسيطة تحدد حجم الصفيف الذي تريده. فمثلا، Array.new (5) سيخلق مجموعة من 5 كائنات لا شيء. الوسيطة الثانية تمنحك قيمة افتراضية ، لذلك Array.new (5 ، 0) سوف أعطيك مجموعة [0,0,0,0,0]. إذا كيف يمكنك إنشاء مجموعة ثنائية الأبعاد؟

الطريقة الخاطئة ، والطريقة التي أراها الناس يحاولون في كثير من الأحيان هي القول Array.new (4 ، Array.new (4 ، 0)). بمعنى آخر ، مجموعة من 4 صفوف ، كل صف عبارة عن صفيف من 4 أصفار. وهذا يبدو للعمل في البداية. ومع ذلك ، قم بتشغيل الكود التالي:

يبدو بسيطا. اصنع مجموعة 4x4 من الأصفار ، واضبط العنصر العلوي الأيسر على 1. لكن قم بطباعته ونحصل على ...

تعيين العمود الأول بأكمله إلى 1 ، ماذا يعطي؟ عندما صنعنا الصفائف ، يتم استدعاء المكالمة الداخلية إلى Array.new أولاً ، مما يجعل صفًا واحدًا. ثم يتم تكرار إشارة واحدة إلى هذا الصف 4 مرات لملء الصفيف الخارجي. كل صف ثم الرجوع إلى نفس الصفيف. تغيير واحد ، تغيير كل منهم.

بدلا من ذلك ، نحن بحاجة إلى استخدام الثالث طريقة إنشاء مجموعة في روبي. بدلاً من تمرير قيمة إلى أسلوب Array.new ، نمر كتلة. يتم تنفيذ الكتلة في كل مرة يحتاج الأسلوب Array.new إلى قيمة جديدة. لذلك إذا كنت ستقول Array.new (5) {get.chomp}سيتوقف روبي ويطلب المدخلات 5 مرات. لذلك كل ما نحتاج إلى القيام به هو مجرد إنشاء مجموعة جديدة داخل هذه الكتلة. لذلك نحن في نهاية المطاف مع Array.new (4) {Array.new (4،0)}. الآن دعونا نجرب هذه الحالة مرة أخرى.

وهو يفعل كما تتوقع.

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

ما تمثله هذه المجموعة أمر متروك لك. في حالتنا ، تم وضع هذه المجموعة كصفوف. الفهرس الأول هو الصف الذي نقوم بفهرسته ، من أعلى إلى أسفل. لفهرسة الصف العلوي من اللغز ، نستخدم [0]، لفهرسة الصف التالي أسفل نستخدمها [1]. لفهرسة بلاطة محددة في الصف الثاني ، نستخدمها أ [1] [ن]. ومع ذلك ، إذا قررنا الأعمدة... فسيكون الأمر نفسه. ليس لدى روبي أي فكرة عما نفعله بهذه البيانات ، ولأنه لا يدعم من الناحية الفنية المصفوفات ثنائية الأبعاد ، فإن ما نقوم به هنا هو اختراق. الوصول إليها فقط عن طريق الاتفاقية وكل شيء سوف تعقد معا. ننسى ما يفترض أن تفعله البيانات الموجودة أدناه ، وكل شيء يمكن أن ينهار بسرعة حقيقية.