المسارات
/
Ruby
Ruby
/
التمارين
/
لعبة الشطرنج
لعبة الشطرنج

لعبة الشطرنج

تمرين تعلّمي

مقدمة

الأمداء تمثّل فترة بين قيمتين. أكثر الأنواع شيوعًا التي تدعم الأمداء هي Integer وString. يمكن استخدامها في أمور كثيرة، مثل إنشاء مجموعة بسرعة، وتقطيع السلاسل النصية، والتحقق مما إذا كانت قيمة ما ضمن مدى، والتكرار. وتُنشأ باستخدام عامل المدى .. أو ... (شامل وغير شامل على الترتيب).

1..5  # => 1..5
1...5 # => 1...5

(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]

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

يمكن أيضًا إنشاء الأمداء باستخدام باني Range، أي new.

Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Note

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

(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)

الحصول على سلاسل فرعية

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

"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"

يمكنك أيضًا استخدام فهارس سالبة للحصول على السلسلة الفرعية من نهاية السلسلة النصية.

"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"

طرق الأمداء

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

الطريقة الوصف المثال
sum تُرجع مجموع كل القيم في المدى (1..5).sum # => 15
size تُرجع حجم المدى (1..5).size # => 5
include? تُرجع true إذا كان المدى يتضمن القيمة المعطاة، وإلا فتُرجع false (1..5).include?(3) # => true

الأمداء اللانهائية والأمداء بلا بداية

يمكن أن يكون المدى لانهائيًا وبلا بداية. في المدى اللانهائي أو المدى بلا بداية تكون قيمة البداية أو النهاية مساوية لـ nil، ولكن يمكن حذف nil عند تعريف المدى.

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

"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
Caution

إذا لم يُستخدم على مجموعة، فقد يتسبب المدى اللانهائي في تسلسل لا نهائي إن لم يُستخدم بحذر.

أمداء السلاسل النصية

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

("aa".."az").to_a # => ["aa", "ab", "ac", ..., "az"]

التعليمات

بصفتك من محبّي الشطرنج، تودّ أن تكتب نسختك الخاصة من اللعبة. نعم، ربما توجد بالفعل تطبيقات عديدة للشطرنج متاحة على الإنترنت، لكن نسختك ستكون فريدة!

ستبدأ بتنفيذ نظام حركة أساسي للقطع.

ستُلعَب لعبة الشطرنج على لوحة يبلغ عرضها 8 مربعات وطولها 8 مربعات. ويُشار إلى كل مربع بحرف ورقم.

1. عرّف نطاق الصفوف والأعمدة

سيتعيّن على اللعبة تخزين صفوف اللوحة. الصفوف هي الأسطر الأفقية للوحة، وتُرقَّم من 1 إلى 8.

سيتعيّن على اللعبة أيضًا تخزين أعمدة اللوحة. الأعمدة هي الأسطر الرأسية للوحة، ويُشار إليها بالحروف من A إلى H.

عرّف الثابتين Chess::RANKS وChess::FILES اللذين يخزّنان نطاق الصفوف والأعمدة على الترتيب.

Chess::RANKS
# => 1..8

Chess::FILES
# => 'A'..'H'

2. تحقّق من صلاحية المربع

سيتعيّن على اللعبة التحقق مما إذا كان المربع صالحًا. يكون المربع صالحًا إذا كان الصف والعمود ضمن نطاق الصفوف والأعمدة.

عرّف الطريقة Chess.valid_square? التي تأخذ الوسيطين rank الذي يحمل عددًا صحيحًا يمثّل الصف، وfile الذي يحمل حرفًا يمثّل العمود. ينبغي أن تُرجع الطريقة true إذا كان الصف والعمود ضمن نطاق الصفوف والأعمدة، وfalse بخلاف ذلك.

Chess.valid_square?(1, 'A')
# => true

3. احصل على كنية اللاعب

سيتعيّن على اللعبة الحصول على كنية اللاعب. الكنية هي أول حرفين من الاسم الأول للاعب وآخر حرفين من اسمه الأخير. وينبغي أن تبدأ الكنية بحرف كبير.

عرّف الطريقة Chess.nickname التي تأخذ الوسيطين first_name الذي يحمل سلسلة نصية تمثّل الاسم الأول للاعب، وlast_name الذي يحمل سلسلة نصية تمثّل اسمه الأخير. ينبغي أن تُرجع الطريقة كنية اللاعب على هيئة سلسلة نصية تبدأ بحرف كبير.

Chess.nickname("John", "Doe")
# => "JOOE"

4. أنشئ رسالة النقلة

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

إذا كانت النقلة صالحة، ينبغي أن تكون الرسالة: "{nickname} moved to {square}" إذا كانت النقلة غير صالحة، ينبغي أن تكون الرسالة: "{nickname} attempted to move to {square}, but that is not a valid square"

عرّف الطريقة Chess.move_message التي تأخذ الوسائط first_name الذي يحمل سلسلة نصية تمثّل الاسم الأول للاعب، وlast_name الذي يحمل سلسلة نصية تمثّل اسمه الأخير، وsquare الذي يحمل سلسلة نصية تمثّل المربع الذي انتقل إليه اللاعب. ينبغي أن تُرجع الطريقة رسالة النقلة على هيئة سلسلة نصية.

Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Ruby Exercism

مستعد لبدء لعبة الشطرنج؟

سجّل في Exercism لتتعلّم وتتقن Ruby عبر 21 مفهومًا121 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.