Шашки очень занимательная игра, которую достаточно легко моделировать.
Правила подразумевают наличие двух классов: игральная доска и шашка. Однако мы немного упростим себе задачу и вместо шашки будем манипулировать клетками, которые могут находиться в трех состояниях: пустая, белая шашка и чёрная шашка.
Разработайте два класса: Checkers
и Cell
.
Объекты класса Checkers
при инициализации строят игральную доску со стандартным распределением клеток и должны обладать методами:
move(f, t)
— перемещает шашку из позицииf
в позициюt
;get_cell(p)
— возвращает объект «клетка» в позицииp
.
Объекты класса Cell
при инициализации принимают одно из трех состояний: W
— белая шашка, B
— чёрная шашка, X
— пустая клетка, а также обладают методом status()
возвращающим заложенное в ней состояние.
Координаты клеток описываются строками вида PQ
, где:
P
— столбец игральной доски, одна из заглавных латинских букв:ABCDEFGH
;Q
— строка игральной доски, одна из цифр:12345678
.
Будем считать, что пользователь всегда ходит правильно и контролировать возможность хода не требуется.
Примечание
Ваше решение должно содержать только классы и функции.
В решении не должно быть вызовов инициализации требуемых классов.
Пример
Ввод
checkers = Checkers()
for row in '87654321':
for col in 'ABCDEFGH':
print(checkers.get_cell(col + row).status(), end='')
print()
Вывод
XBXBXBXB
BXBXBXBX
XBXBXBXB
XXXXXXXX
XXXXXXXX
WXWXWXWX
XWXWXWXW
WXWXWXWX
Ввод
checkers = Checkers()
checkers.move('C3', 'D4')
checkers.move('H6', 'G5')
for row in '87654321':
for col in 'ABCDEFGH':
print(checkers.get_cell(col + row).status(), end='')
print()
Вывод
XBXBXBXB
BXBXBXBX
XBXBXBXX
XXXXXXBX
XXXWXXXX
WXXXWXWX
XWXWXWXW
WXWXWXWX
Решение
Не сильно сложная задача. Одна из проблем, которую она затрагивает – способ создания доски. Наиболее удобным способом представления доски мне видится словарь, который бы содержал в качестве индекса номер ячейки.
Несмотря на то, что от нас не требуется продумывать систему, на основе которой можно реализовать игру в шашки, мы, тем не менее, построим именно такую основу.
Для начала нам нужно спроектировать базовый класс Cell(). Он должен уметь показать нам что находится в ячейке, освободить ячейку, если мы совершаем ход и забрали шашку из ячейки и установить шашку в ячейку. Последние два метода нам понадобятся в реализации метода move().
Итак, метод __init__() принимает на вход состояние ячейки и запоминает его.
Метод status() просто возвращает запомненое состояние ячейки.
Метод remove_check() возвращает состояние ячейки и меняет ее состояние на ‘X’
Метод set_check() принимает на вход шашку и записывает ее в ячейку, возвращая ее предыдущее состояние.
Теперь, когда мы имеем базовый класс, можно приступить к описанию класса Checkers().
Метод __init__() генерирует доску любым удобным для вас способом.
Метод get_cell() в самой программе не используется, потому что мы написали чуть более продвинутый класс Cell(), который подскажет нам что было в клетке, куда мы поставили нашу шашку, но тесты Яндекса будут проверять наши клетки именно таким способом. Да и нам она может пригодится, если мы захотим вывести нашу доску на экран.
Метод move(). Метод удаляет шашку из старой клетки и ставит ее на новую. Возвращает состояние целевой клетки до начала хода, для того, чтобы упростить дальнейший подсчет оставшихся шашек соперника. Стоит упомянуть, что по состоянию на 21 декабря 2023 года в тестах яндекса есть недоработка и принимается вариант реализации метода move(), который просто меняет местами содержимое клетки откуда мы берем шашку и клетки куда мы ее ставим, это означает, что в тестах нет ситуации, когда одна шашка “бьет/ест/берет” другую.
На этом задача выполнена в чуть большем, чем требовалось объеме.
Посмотреть код
Решение
class Cell():
def __init__(self, cell_item='X') -> None:
self.state = cell_item
def status(self):
return self.state
def remove_check(self):
check = self.status()
self.state = 'X'
return check
def set_check(self, check):
old_check = self.status()
self.state = check
return old_check
class Checkers():
def __init__(self) -> None:
self.cells = dict()
checker_board = 'XBXBXBXB' + 'BXBXBXBX' + 'XBXBXBXB' + 'XXXXXXXX' + \
'XXXXXXXX' + 'WXWXWXWX' + 'XWXWXWXW' + 'WXWXWXWX'
i = 0
for row in '87654321':
for col in 'ABCDEFGH':
self.cells[col + row] = Cell(cell_item=checker_board[i])
i += 1
def get_cell(self, cell):
return self.cells[cell]
def move(self, where_from, where_to):
check = self.cells[where_from].remove_check()
return self.cells[where_to].set_check(check)
Как вариант можно инициализировать доску так:
class Checkers:
def __init__(self):
self.desk = {}
rows = ‘87654321’
cols = ‘ABCDEFGH’
for row in rows:
for col in cols:
if row in ’54’ or (rows.index(row) + cols.index(col)) % 2 == 0:
self.desk[col + row] = Cell(‘X’)
else:
if row in ‘876’:
self.desk[col + row] = Cell(‘B’)
else:
self.desk[col + row] = Cell(‘W’)