我正在尝试使用python制作一个2d地图生成算法,这些类不会接受我提供的输入?
类单元格应传递变量X和Z作为输入,但这是print语句的结果 0 0 [0, 1, 0] 但是当x数字变为1时,它就会打印出来 1, 0 [0,1,0] 下面是Cell()的类代码 如果这有帮助的话,这是世卫组织项目迄今为止的代码我正在尝试使用python制作一个2d地图生成算法,这些类不会接受我提供的输入?,python,Python,类单元格应传递变量X和Z作为输入,但这是print语句的结果 0 0 [0, 1, 0] 但是当x数字变为1时,它就会打印出来 1, 0 [0,1,0] 下面是Cell()的类代码 如果这有帮助的话,这是世卫组织项目迄今为止的代码 class Cell(object): def __init__(self, x, y, z, v): self.pos = [x, y, z] self.value = v 您遇到的问题与如何在map类中创建map属性有关。
class Cell(object):
def __init__(self, x, y, z, v):
self.pos = [x, y, z]
self.value = v
您遇到的问题与如何在
map
类中创建map
属性有关。您正在使用的代码不是您想要的。您得到的不是一个独立列表的列表,而是一个包含许多对同一内部列表的引用的列表。这是因为some_list*some_integer
不会复制some_list
中的值,它只是重复对现有项的引用。对于像数字这样的不可变值,这很好。但是对于可变值(如列表),当您稍后尝试更改值时会遇到问题
您看到所有项目的x
值相同的原因是您正在查找self.map[x][z]
。由于所有的self.map[x]
值都是相同的列表(无论您使用了什么x
),因此您只能看到附加到列表中的第一组值。其他的都是创建的,但它们还很长(你可以通过self.map[0][x*self.mpsiz[1]+z]
找到它们)
不要使用self.map=[[]*self.mpsiz[0]]*self.mpsiz[1]
来构建列表列表,请尝试使用self.map=[[]来表示范围内的(self.mpsiz[1])]
。这将为范围
中的每个值创建一个单独的空内部列表,因此打印位置的索引将按预期工作
注意,代码中还存在另一个外围问题。您正在使用
Map
,既用于类的名称,也用于类的实例(因为您使用了Map=Map()
)。那可能不是个好主意 我不确定这是否是您的问题的根源,但您显示的代码的第一行,self.map=[[[]*self.mpsiz[0]]*self.mpsiz[1]
,几乎肯定不能满足您的要求。这是在创建一个列表,其中引用了同一个空列表(内部乘法没有任何用处)。您可能希望[[]用于范围内的uuu(self.mpsiz[1])]
或者[[None]*self.mpsiz[0]用于范围内的uuu.mpsiz[1]]
(后者要求您以后不要将
附加到列表中,而是分配到列表中,替换现有的无
值)。谢谢您让我知道,关于内部乘法,但这并没有解决问题…我非常感谢您的帮助。感谢您对问题的解释,这非常有帮助!,在你的帮助下,我解决了这个问题!
class Cell(object):
def __init__(self, x, y, z, v):
self.pos = [x, y, z]
self.value = v
import random as rand
class Cell(object):
def __init__(self, x, y, z, v):
self.pos = [x, y, z]
self.value = v
class Map(object):
def __init__(self):
self.map = None
self.mpsiz = [None, None, None]
self.cell = None
self.cell1 = None
def generate_map(self):
self.fills_nones()
def fills_nones(self):
self.mpsiz = [input('How long should the x be? (default is 500 * 500) ') or 500,
input('How far should it be in the z dir ') or 500,
None]
for i in range(len(self.mpsiz)-1):
self.mpsiz[i] = int(self.mpsiz[i])
self.map = [[]*self.mpsiz[1]]*self.mpsiz[0]
print(self.mpsiz)
print('Beginning map generation')
print('Beginning the base map generation')
self.make_base()
def make_base(self):
self.map = [[]*self.mpsiz[0]]*self.mpsiz[1]
print(self.map)
for x in range(self.mpsiz[0]):
for z in range(self.mpsiz[1]):
print(x, z)
self.map[x].append(Cell(x, 1, z, rand.randint(0, 1)))
print(self.map[x][z].pos)
print('Done!')
print('Beginning the rule runs')
self.make_full_map()
def make_full_map(self):
for x in range(self.mpsiz[0]):
print('\n')
for z in range(self.mpsiz[1]):
print(self.map[x][z].pos)
Map = Map()
Map.generate_map()