В настоящее время я работаю над редактором карт для игры в pygame, используя карты тайлов. Уровень построен из блоков в следующей структуре (хотя и намного больше):
level1 = (
(1,1,1,1,1,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,1,1,1,1,1))
где «1» - это блок стены, а «0» - пустой воздух.
Следующий код в основном обрабатывает изменение типа блока:
clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1
Но так как уровень хранится в кортеже, я не могу изменить значения разных блоков. Как мне легко изменить различные значения уровня?
//
а не только/
потому, что в Python 3/
будет выполнять деление с плавающей запятой и испортить ваш код.Ответы:
Преобразовать кортеж в список:
Преобразовать список в кортеж:
источник
p list(...)
вместо этого запустите .У вас есть кортеж кортежей.
Чтобы преобразовать каждый кортеж в список:
--- ИЛИ ---
И после того, как вы закончите редактирование, просто конвертируйте их обратно:
--- ИЛИ --- (Спасибо @jamylak)
Вы также можете использовать массив NumPy:
Для манипулирования:
источник
Вы можете иметь список списков. Преобразуйте ваш кортеж в список списков, используя:
или
и измените их соответственно.
Но клочковатый массив круче.
источник
Чтобы преобразовать кортежи в список
(Между кортежами в данном вопросе отсутствовали запятые, они были добавлены для предотвращения сообщения об ошибке)
Способ 1:
Способ 2:
Способ 1 занял --- 0.0019991397857666016 секунд ---
Способ 2 занял --- 0.0010001659393310547 секунд ---
источник
Почему бы вам не попробовать преобразовать его тип из кортежа в список и наоборот.
источник
Оба ответа хороши, но маленький совет:
Кортежи являются неизменяемыми, что означает, что они не могут быть изменены. Поэтому, если вам нужно манипулировать данными, лучше хранить данные в списке, это уменьшит ненужные накладные расходы.
В вашем случае извлеките данные в список, как показано eumiro, и после изменения создайте кортеж схожей структуры, подобный ответу, полученному от Schoolboy.
Также, как предложено, использование массива numpy является лучшим вариантом
источник
numpy
обеспечит самое быстрое решение для работы с данным типом.Список к кортежу и обратно можно сделать как ниже
источник
Вы могли бы значительно ускорить ваши вещи, если бы вы использовали только один список вместо списка списков. Это возможно, конечно, только если все ваши внутренние списки имеют одинаковый размер (что верно в вашем примере, поэтому я просто предполагаю это).
И вы могли бы быть еще быстрее, если бы использовали битовое поле вместо списка:
с участием
Но это работает, только если ваши поля содержат только 0 или 1, конечно. Если вам нужно больше значений, вам придется объединить несколько битов, что значительно усложнит задачу.
источник