2016-05-23 4 views
0

Я делаю игру, очень похожую на шашки, для создания доски я использовал многомерный массив. Я заполняю массив 0 на каждом пустом пространстве, а затем один набор фишек представлен 1, а другой представлен 2-м. Есть ли способ, которым я могу получить список того, какие пространства занимают каждый набор чипов? Это мой Gameboard:Как найти определенные значения внутри многомерного массива?

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) для y in ...]' вместо того, чтобы просто вернуть координату. Для лучшего ответа мне нужно знать возвращаемое значение 'find_plays' и то, как вы хотите сохранить результат. – niemmi

+0

Значение, возвращаемое моей функцией, представляет собой список возможных координат, к которым вы можете перейти. В моей функции я определил пустой список и добавляет все возможные шаги. Игра похожа на шашки, только вы можете двигаться по всем направлениям, поэтому я проверяю все смежные координаты и сохраняю только координаты, которые имеют 0 в качестве значения. Однако у меня есть еще одна функция для прыжков, если пространство прямо рядом с вами заполнено, но пространство после этого пространства пуст, вы можете прыгать поверх чипа. Функция для прыжков работает в том же порядке, что и функция базового перемещения. –

Смежные вопросы