Сапер

Сапер

Середня

Вступ

Сапер - популярна гра, у якій гравець має знайти міни за числовими підказками, що показують, скільки мін безпосередньо межує з клітинкою (по горизонталі, вертикалі або діагоналі).

Вказівки

У цій вправі ми додаємо кількість мін до порожніх клітинок готового ігрового поля «Сапер». Саме поле має форму прямокутника, що складається з клітинок, і кожна з них або порожня (' '), або містить міну ('*').

Для кожної порожньої клітинки порахуймо кількість сусідніх мін (по горизонталі, по вертикалі, по діагоналі). Якщо в порожньої клітинки немає сусідніх мін, залишмо її порожньою. Інакше замінімо її на кількість сусідніх мін.

Наприклад, ми можемо отримати поле 5 x 4 такого вигляду (тут порожні клітинки позначено символом '·' для показу на екрані):

·*·*·
··*··
··*··
·····

І ось на що його має перетворити наш код:

1*3*1
13*31
·2*2·
·111·

Повідомлення про винятки

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

Ця конкретна вправа вимагає, щоб ми використали інструкцію raise, щоб «кинути» ValueError, коли функція board() отримує некоректні вхідні дані. Тести пройдуть, лише якщо ми і збудимо exception за допомогою raise, і додамо до нього повідомлення.

Щоб збудити ValueError з повідомленням, запишімо повідомлення як аргумент до типу exception:

# when the board receives malformed input
raise ValueError("The board is invalid with current input.")
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Python Exercism

Час розпочати Сапер?

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

Глибоке занурення у Сапер!

Ми розглянемо вкладені цикли `for`, вдале застосування min/max для спрощення перевірки меж, функціональні конвеєри та роботу з двовимірними матрицями.