2016-05-23 45 views
0

我正在制作一个类似跳棋的游戏,以创建我使用多维数组的棋盘。我在每个空白处填充数组0,然后一组芯片由1表示,另一组由2表示。有没有什么方法可以获得每套芯片占用的空间列表?这是我的游戏键盘:如何在多维数组中找到特定值?

matrix = [[1,1,1,1,1,0,0,0,0,0], [1,1,1,1,0,0,0,0,0,0], 
      [1,1,1,0,0,0,0,0,0,0], [1,1,0,0,0,0,0,0,0,0], 
      [1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,2], 
      [0,0,0,0,0,0,0,0,2,2], [0,0,0,0,0,0,0,2,2,2], 
      [0,0,0,0,0,0,2,2,2,2], [0,0,0,0,0,2,2,2,2,2]] 

print "\n".join(" ".join(str(el) for el in row) for row in matrix) 

回答

0

虽然列表内涵通常是构建单个列表的好方法,您必须多次遍历整个矩阵才能找到每个可能芯片值的位置。

matrix = [[1,1,1,1,1,0,0,0,0,0], [1,1,1,1,0,0,0,0,0,0], 
      [1,1,1,0,0,0,0,0,0,0], [1,1,0,0,0,0,0,0,0,0], 
      [1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,2], 
      [0,0,0,0,0,0,0,0,2,2], [0,0,0,0,0,0,0,2,2,2], 
      [0,0,0,0,0,0,2,2,2,2], [0,0,0,0,0,2,2,2,2,2]] 

positions = {} 
for y in xrange(len(matrix)): 
    for x in xrange(len(matrix)): 
     positions.setdefault(matrix[y][x], []).append((y, x)) 

# show the all positions of each chip value 
for chip in sorted(positions): 
    print('{}: {}'.format(chip, positions[chip])) 

输出:

0: [(0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4)] 
1: [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (4, 0)]                                                                                                               
2: [(5, 9), (6, 8), (6, 9), (7, 7), (7, 8), (7, 9), (8, 6), (8, 7), (8, 8), (8, 9), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]                                                                                                               
4

您可以使用列表理解与条件,下面的代码返回由2所占据的所有空间:

[(y, x) for y in xrange(len(matrix)) for x in xrange(len(matrix[y])) if matrix[y][x] == 2] 

输出:

[(5, 9), (6, 8), (6, 9), (7, 7), (7, 8), (7, 9), (8, 6), (8, 7), (8, 8), (8, 9), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)] 
+0

嘿感谢这是非常有用的或者,你可以通过做一些下面像创造出的空间被各种芯片在单次通过矩阵占据名单。如果你不介意,我可以再问你一个问题吗?我想要一个芯片位置列表的原因是将它们输入到另一个函数中,该函数可以找到所有可能使用该芯片进行的播放。我的函数接受两个参数,即要查找的芯片移动的x坐标和y坐标。我之所以想要列表中的芯片位置,是因为我可以使用一个循环遍历所有的位置,并找到所有芯片的所有可能的移动。有没有这样做? –

+0

@SirAskALot如果你只是想为一组芯片找到可能的移动,你可以在[]中找到[find_plays(y,x)],而不是仅仅返回坐标。为了更好的回答,我需要知道'find_plays'的返回值以及你想如何存储结果。 – niemmi

+0

我函数返回的值是您可以移动到的可能坐标列表。在我的函数中,我定义了一个空列表,并附加了每一个可能的移动。游戏就像跳棋一样,只有你可以在所有方向上移动,所以我检查所有相邻的坐标,并只存储其值为0的坐标。不过,我确实有另外一个跳跃功能,如果你旁边的空间已满,但空间之后的空间是空的,你可以跳到芯片顶端。跳跃功能与基本动作功能相同。 –