За позиціями двох ферзів на шахівниці визначмо, чи розташовані вони так, що можуть атакувати одна одну.
У шахах ферзь може атакувати фігури, які стоять в одному рядку, стовпці або на одній діагоналі.
Шахівницю можна подати як масив 8 на 8.
Отже, якщо відомо, що білий ферзь стоїть на c5 (з індексацією від нуля: стовпець 2, рядок 3), а чорний ферзь на f2 (стовпець 5, рядок 6), то розташування має такий вигляд:
Також можна відповісти, чи можуть ферзі атакувати один одного. У цьому випадку відповідь буде ствердною: так, можуть, бо обидві фігури стоять на одній діагоналі.
Зображення шахівниці створив habere-et-dispertire за допомогою LaTeX та пакета chessboard Ульріке Фішер.
У шахах рядки називають «горизонталями», а стовпці - «вертикалями». Горизонталі простягаються від 1 до 8, а вертикалі - від A до H.
У цій вправі Square - непрозорий тип, який представляє клітинку на шахівниці.
Усередині він використовує поля row і column з індексацією від 0 і гарантує, що вони завжди коректні (тобто від 0 до 7).
Функція create приймає як вхідні дані Str, що представляє коректну клітинку на шахівниці в офіційній нотації, наприклад "C5".
Функція create повинна розібрати цей Str, перевірити, що він представляє коректну клітинку, і якщо так, повернути значення Square з відповідними полями row і column.
Горизонталь 1 відповідає рядку 0, а горизонталь 8 - рядку 7.
Наприклад, виклик create("C5") повинен повернути клітинку, у якій поле row дорівнює 4, а поле column дорівнює 2.
Тип Square також надає зручні методи rank і file.
У наведеному вище прикладі rank повинен повернути ціле число 5, а file повинен повернути символ 'C'.
І нарешті, функція queen_can_attack приймає два різні значення Square і перевіряє, чи можуть королеви, розміщені на цих клітинках, атакувати одна одну.
Висновок: непрозорі типи, як-от Square, чудово працюють, коли ми хочемо дати певні гарантії, наприклад, що row і column завжди в межах від 0 до 7.
Непрозорі типи також приховують деталі реалізації від користувачів, що робить API чистішим.