我正在尝试使用python制作2d地图生成算法,并且这些类不会接受我提供的输入?

时间:2018-04-08 23:57:17

标签: python

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)

类Cell应该作为输入传递变量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

如果这有帮助,那么到目前为止,who项目的代码......

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()

1 个答案:

答案 0 :(得分:1)

您遇到的问题与您在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 = [[] for _ in range(self.mpsiz[1])]构建列表列表。这将为range中的每个值创建一个单独的空内部列表,因此打印出位置的索引将按预期工作。

注意,您的代码中也存在另一个外围问题。您使用Map来表示类的名称及其实例(因为您执行Map = Map())。这可能不是一个好主意!