перемещение L-образной фигуры на сетке - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь написать небольшую сеточную игру, но у меня возникают проблемы с перемещением фрагментов кода.

У меня есть небольшая сетка пикселей 4x4, инициализированная как np.zeros (4,4, 3), полный черный. Метод обновления для определения sh положения объектов и свободных ячеек, метод сброса и простая функция show, которая использует cv2 для отображения сетки из пиксельной матрицы.

class Grid():
    def __init__(self):
        self.cells = np.zeros((SIZE, SIZE, 3), dtype=np.uint8)
        self.free_cells = []

    def update(self, c, l):
        self.reset()  #clear cells and free cells list

        self.cells[c.x][c.y] = COIN_COL  #set coin position

        for i in range(len(l.coords)):   #set L posiion
                self.cells[l.coords[i][0]][l.coords[i][1]] = L_COL

        for i in range(len(self.cells)):  #calculate free cells
            for j in range(len(self.cells)):
                if np.amax(self.cells[i][j]) == 0:
                    self.free_cells.append((i, j))

    def reset(self):
        self.cells = np.zeros((SIZE, SIZE, 3), dtype=np.uint8)
        self.free_cells = []

    def show(self):
        img = Image.fromarray(self.cells, "RGB")
        img = img.resize((200,200))

        cv2.imshow('img', np.array(img))
        cv2.waitKey(0)

в сетке 2 штук, L-образный 3х2 и монета 1х1. они оба имеют цвета и координаты

SIZE = 4
COIN_COL = (255,255,255)
L_COL = (0,0,255)
C_COORDS = np.array((0,0), dtype=np.uint8)  #coin starting position
L_COORDS = np.array(((1,1),(2,1),(3,1),(3,2)), dtype=np.uint8) #L starting position

class Coin():
    def __init__(self, coords):
        self.x = coords[0]
        self.y = coords[1]

class LShape():
    def __init__(self, coords):
        self.coords = coords

каждый элемент может вращаться, перемещаться и перемещаться в любое время, пока он находится внутри сетки, и не перекрывается с другими элементами.

перемещение монета проста: проверьте пустые ячейки, выберите одну, обновите координаты монеты, обновите сетку.

Перемещение буквы L выглядит не так просто. Как я могу проверить каждый возможный законный ход такого куска? (на сетке может быть более 1 монеты). я начал с вычисления пустых ячеек, чтобы у меня была схема свободного пространства, и я пытаюсь придумать алгоритм для выделения законных ходов, сначала удаляя изолированные свободные ячейки (1x1), чем удаляя изолированные пары (2x1 ) и так далее, но я застрял на полпути.

Я также думал о том, чтобы составить список всех возможных позиций на пустой сетке и удалить позиции из списка, если им требуется занятая ячейка, но это не кажется ни элегантным, ни оптимальным.

Есть идеи, как решить проблему?

...