提问人:m4l4 提问时间:2/9/2020 最后编辑:m4l4 更新时间:2/9/2020 访问量:260
在网格上移动 L 形部件
moving an L-shaped piece on a grid
问:
我正在尝试编写一个小网格游戏,但我在编码棋子移动时遇到了问题。
我有一个小的 4x4 rgb 像素网格,初始化为 np.zeros(4,4,3),全黑。用于刷新对象位置和空闲单元格的更新方法、重置方法以及使用 cv2 显示像素矩阵中的网格的简单 show 函数。
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 形的 3x2 和一枚 1x1 的硬币。 它们都有颜色和坐标
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),依此类推,但我中途卡住了。
我还考虑在空网格上列出每个可能的位置,如果它们需要占用的单元格,则从列表中删除位置,但这似乎既不优雅也不理想。
关于如何解决这个问题的任何想法?
答: 暂无答案
上一个:段并集的连接组件
下一个:生成带有匹配括号的随机字符串
评论
that doesn't seems elegant nor optimal.
取决于计算完成的时间。如果数据是预先计算和存储的,那么你就简化了问题。然后,如果您找到一种方法来存储数据,以便可以轻松搜索数据,那么您又简化了问题。现在,如果你根据一枚硬币的药水连接所有有效位置,你会得到一个图表。现在,如果您知道如何在图形中从一个位置移动到下一个位置,那么您已经将问题转换为图形上的移动,从而为您提供 O(1) 解决方案。当然,如果我所有的想法都成立的话。