(Python3) Хранение игровой карты 10x10 в массиве python - PullRequest
0 голосов
/ 15 мая 2018

Как мне сохранить игровую карту 10x10 (100 единиц) в массиве 2D Python3?

Вот мой текущий код:

53    worldMap = [[13, 13, 13, 13, 13, 13, 13, 13, 13, 13], [13, 13, 13, 
                    13, 13, 13, 13, 13, 13, 13]]
236    porq = 0
237 genX = 0
238 genY = 0
239 
240 #world generator
241 while not 13 in worldMap:
242     porq = porq + 1
243     genIncoming = randint(1, 12)
244     worldMap[genX][genY] = genIncoming
245     genX = genX + 1
246     genY = genY + 1
247 print(worldMap)

Выдает ошибку:

"Traceback (последний вызов был последним): файл" python ", строка 244, в IndexError: список индексов вне диапазона"

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Итак, исходя из содержания вашего текущего вопроса, мы не можем сказать, какова ваша общая конечная цель.Я собираюсь работать в предположении, что вы хотите, чтобы матрица n x n была представлена ​​в Python, и там были какие-то числа.Я собираюсь заполнить эту матрицу числом 13, и вы можете изменить его, как вам нужно.

Матрица - это, в основном, строки и столбцы, что-то вроде этого

13 13 13
13 13 13
13 13 13

Это матрица 3x3 с 3 строками и 3 столбцами.

Я могу представить матрицу с коллекцией коллекций (список списков, кортеж кортежей, список кортежей и т. Д.), Где каждая внутренняя коллекция представляет строку.

Я не собираюсь использовать матрицу нужного вам размера, потому что вам нужно это понять, я пойду с 5x5.

Вот как будет выглядеть матрица 5x5 в терминах списка Python

[[13, 13, 13, 13, 13], [13, 13, 13, 13, 13], [13, 13, 13, 13, 13], [13, 13, 13, 13, 13], [13, 13, 13, 13, 13]]

Чтобы сделать это, я мог бы сделать что-то более короткое

[[13 for column in range(5)] for row in range(5)]

Теперь вам нужна матрица, коллекция коллекций может быть немного ненужной и медленной, давайте попробуем использовать эту библиотеку в Python под названием numpy.Вам нужно будет установить его либо из исходного кода, через код Python, либо из pip, либо из какого-либо другого инструмента, посмотрите его.

Допустим, у меня есть моя старая коллекция списков, теперь я не хочу использовать это, потому что смотреть на это не нужно и немного запутанно.Я должен написать в своем собственном коде, чтобы правильно распечатать его в виде матрицы, выполнить матричные операции над ним и т. Д. Почему бы не использовать что-то, что оборачивает это для меня, например numpy matrix ?

import numpy as np

matrix_of_13s = np.matrix([[13 for column in range(5)] for row in range(5)]])

Допустим, мне нужен доступ к элементу в строке 3 и столбце 4. В моей коллекции коллекций это означает, что мне нужно получить третью строку, а затем четвертый элемент внутри нее.Это переводится как

collection_of_13s[3][4]

Если я хочу пройти через все элементы, я буду использовать ответ @thekingofkings, за исключением, конечно, в этом случае с 5 строками и 5 столбцами.

for row in range(5):
    for column in range(5):
        print(collection_of_13s[row][column])

Теперь, хотя это работает, это не то, что я хочу.Что я действительно хочу, так это сетка из 13 с моими размерами.Поэтому, почему бы не использовать такую ​​пустую матрицу, как это?

matrix_of_13s = np.matrix(collection_of_13s)
for element in np.nditer(matrix_of_13s):
    print(element)

, которая будет проходить через каждый элемент матрицы слева направо в порядке строк.

Вы также заметите, что с ростом масштабов вашего проекта Numpy становится более эффективным и простым в использовании, по причине .

Я также хочу упомянуть еще одну опцию, которая является сверхпростой концепцией, и вам не нужна ни одна коллекция коллекций или NumPy.Просто используйте одномерный массив для представления вашей сетки.Эта концепция фактически используется в принципе компонентного анализа изображений, но это не имеет отношения.

По сути, сетка из 13 с становится просто обычным списком

[13, 13, 13, 13, 13, 13, 13, 13, 13]

Новый индекс любого элемента будет (column +1)*(row).Есть математическое доказательство и объяснение этого, но я не хочу сейчас его искать, лол.

0 голосов
/ 15 мая 2018

Вам нужен вложенный двухуровневый цикл for, чтобы пройти по карте. То, что у вас было, генерирует блок только по диагонали карты, т.е. вы генерируете карту для (0,0), (1,1), (2,2), ...., что также объясняет индекс вне диапазона ошибка.

Попробуйте это

for genX in range(10):
    for genY in range(10):
        worldMap[genX][genY] = randint(1, 12)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...