Я пытаюсь написать небольшую сеточную игру, но у меня возникают проблемы с перемещением фрагментов кода.
У меня есть небольшая сетка пикселей 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 ) и так далее, но я застрял на полпути.
Я также думал о том, чтобы составить список всех возможных позиций на пустой сетке и удалить позиции из списка, если им требуется занятая ячейка, но это не кажется ни элегантным, ни оптимальным.
Есть идеи, как решить проблему?