Треки
/
Crystal
Crystal
/
Вправи
/
Шахова гра
Шахова гра

Шахова гра

Навчальна вправа

Вступ

Діапазони представляють інтервал між двома значеннями. Найпоширеніші типи, які підтримують діапазони: Int, Char і String. Їх можна використовувати для багатьох речей, як-от швидке створення колекції, розрізання рядків тексту (англ. string), перевірка, чи входить значення в діапазон, та ітерація. Їх створюють за допомогою оператора діапазону .. або ... (включно та не включно відповідно).

1..5  # A range containing 1, 2, 3, 4, 5
1...5 # A range containing 1, 2, 3, 4

Причина існування двох операторів діапазону полягає в тому, щоб створювати діапазони, які включають або не включають кінцеве значення; це буває корисно, наприклад, коли ми працюємо з індексами з відліком від нуля.

Діапазони також можна створювати за допомогою ініціалізатора Range.

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

Коли ми створюємо діапазон у Crystal за допомогою операторів .. або ... і хочемо викликати метод на цьому діапазоні, потрібно взяти діапазон у дужки. Інакше метод буде викликано на другому аргументі оператора діапазону.

(1..5).size # => 5
1..5.size # => Error: undefined method 'size' for Int32

Отримання підрядків

Коли ми хочемо розрізати рядок тексту, можна скористатися оператором діапазону, щоб отримати підрядок. Тобто створити діапазон із початковим і кінцевим індексом підрядка.

"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
includes? Повертає true, якщо діапазон містить задане значення, інакше false (1..5).includes?(3) # => true

Безкінечні та безпочаткові діапазони

Діапазон може бути безкінечним або безпочатковим. У безкінечного чи безпочаткового діапазону початкове або кінцеве значення дорівнює nil, але nil можна опустити, визначаючи діапазон.

Використовувати безпочаткові та безкінечні діапазони зручно, коли ми хочемо, наприклад, розрізати рядок тексту від початку або до кінця.

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

Безкінечний діапазон, застосований не до колекції, може спричинити безкінечну послідовність, якщо не користуватися ним обережно.

Діапазони символів

Символи можна використовувати в діапазонах, що дає змогу отримати інтервал символів між двома символами. Наприклад, це стане в пригоді, коли ми хочемо отримати алфавіт.

'a'..'z' # A range containing ['a', 'b', 'c', ..., 'z']

Діапазони рядків тексту

Рядки тексту також можна використовувати в діапазонах, що дає змогу отримати інтервал рядків тексту між двома рядками тексту. Але їхня поведінка трохи відрізняється від поведінки Char, коли в діапазоні рядків тексту використовується кілька символів. Поведінка може стати заплутаною, коли ми будуємо складніші діапазони рядків тексту, тож будьмо обережні.

("aa".."az") # A range containing ["aa", "ab", "ac", ..., "az"]

Вказівки

Як шанувальники шахів, ми хочемо написати власну версію цієї гри. Так, в інтернеті вже є безліч реалізацій шахів, але наша буде унікальною!

Почнімо з реалізації базової системи руху фігур.

У шахи будемо грати на дошці завширшки вісім клітинок і завдовжки вісім клітинок. Клітинки позначаються літерою та числом.

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 з рядком тексту (англ. string) з іменем гравця та аргумент 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 Посилання відкривається в новому вікні або вкладці
Crystal Exercism

Час розпочати Шахова гра?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.