2016-07-20 36 views
-1

我想做一些代码,以便单个元素矩阵可以引用与它相邻的元素。有点像你只能将游戏棋子移动到相邻的空间。举例来说,我希望能这样说:如何引用矩阵中的相邻元素?

if x matrix element is adjacent to y element: 
    y_element_adjacent = True 

我想知道如何完成的这次“靠近”部分。

编辑:我已经尝试做一个列表,并为每个元素分配一个数字。因此,在100个元素列表(或10x10游戏板)中,空间1x1将是第0个元素,空间1x3将是第2个元素...像这样:

1,2,3,4,5,6 ,7,8,9,10

11,12,13,14,15,16,17,18,19,20

然而,对于这种问题是,如果X元素为10,我的代码需要+ 1来找到相邻的空间,而11不相邻。然后我意识到列表并不是正确的方法来做到这一点,矩阵将是一条路。我只是有点困惑,我可以如何使用它们不同于列表。

任何帮助表示赞赏!谢谢。

+1

有很多,很多方法可以做到这一点,这取决于如何你的代码是有组织的。你能更具体地了解你有什么 - 更重要的是 - 你在问这个问题之前自己试过了什么? – TigerhawkT3

+0

只需要全部4个邻居(x和+1指数,对于y - > 2 * 2梳子相同;或者如果对角线*相邻*,则为8)。但在索引之前,检查是否在界限内(x + 1 = 0; y + 1 = 0) – sascha

+0

感谢您的评论。用我最初的思维过程编辑。 – Jerfy

回答

0

以下是获取所有相邻元素索引的简单方法。

from itertools import product, starmap 

x, y = (x_coordinate, y_coordinate) # matrix values here 
cells = starmap(lambda a,b: (x+a, y+b), product((0,-1,+1), (0,-1,+1))) 

对于x,y = (1,1)的输入,这将返回一个包含[(1, 0), (1, 2), (0, 1), (0, 0), (0, 2), (2, 1), (2, 0), (2, 2)](list(cells)[1:])

这样的实现可能会对您的特定场景感兴趣(确定某个游戏块可能移动到哪个位置)。如果你想包括边境检查,你可以尝试

X = max_board_X 
Y = max_board_Y  
neighbors = lambda x, y : [(x2, y2) for x2 in range(x-1, x+2) 
            for y2 in range(y-1, y+2) 
            if (-1 < x <= X and 
             -1 < y <= Y and 
             (x != x2 or y != y2) and 
             (0 <= x2 <= X) and 
             (0 <= y2 <= Y))] 

(关于这些和源)其他解决方案可以在这里找到:Determining neighbours of cell two dimensional list

+0

谢谢!这有助于很多! – Jerfy