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

Шахова гра

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

Вступ

Діапазони позначають інтервал між двома значеннями. Діапазони найчастіше підтримують типи Integer і String. Їх можна використовувати для багатьох речей: швидкого створення колекції, зрізання рядків тексту (англ. 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. Отримайте прізвисько гравця

Грі потрібно буде отримати прізвисько гравця. Прізвисько складається з перших 2 символів імені гравця та останніх 2 символів прізвища гравця. Прізвисько має бути записане великими літерами.

Визначте метод 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 Посилання відкривається в новому вікні або вкладці
Ruby Exercism

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

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