H. Шашки

Шашки очень занимательная игра, которую достаточно легко моделировать.

Правила подразумевают наличие двух классов: игральная доска и шашка. Однако мы немного упростим себе задачу и вместо шашки будем манипулировать клетками, которые могут находиться в трех состояниях: пустая, белая шашка и чёрная шашка.

Разработайте два класса: 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(), который просто меняет местами содержимое клетки откуда мы берем шашку и клетки куда мы ее ставим, это означает, что в тестах нет ситуации, когда одна шашка “бьет/ест/берет” другую.

На этом задача выполнена в чуть большем, чем требовалось объеме.

Посмотреть код

Решение

Python
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)
Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Иван
Иван
02.08.2024 19:14

Как вариант можно инициализировать доску так:

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’)