在Python中,有没有一种方法可以在不使用一个值填充整个数组的情况下,使用特定模式将自动值分配给一个2D数组?
我正在尝试创建一个非常基本的类似蛇的控制台游戏,只是为了测试Python的功能,但是我在创建用于设置游戏地图的算法时遇到了问题。我需要将贴图边框设置为“#”,将贴图主体设置为空格”,但由于某种原因,即使在决定性的if函数中打印出结果后,整个贴图仍显示为散列。代码如下:在Python中,有没有一种方法可以在不使用一个值填充整个数组的情况下,使用特定模式将自动值分配给一个2D数组?,python,arrays,Python,Arrays,我正在尝试创建一个非常基本的类似蛇的控制台游戏,只是为了测试Python的功能,但是我在创建用于设置游戏地图的算法时遇到了问题。我需要将贴图边框设置为“#”,将贴图主体设置为空格”,但由于某种原因,即使在决定性的if函数中打印出结果后,整个贴图仍显示为散列。代码如下: class GameMap: def __init__(self): self.border_icon = '#' self.body_icon = ' ' self.x_size = 0 self
class GameMap:
def __init__(self):
self.border_icon = '#'
self.body_icon = ' '
self.x_size = 0
self.y_size = 0
self.map_grid = []
def create_grid(self, map_size):
if map_size == 1:
self.x_size = 40
self.y_size = 20
elif map_size == 2:
self.x_size = 80
self.y_size = 40
else:
self.x_size = 120
self.y_size = 60
self.map_grid = [[None]*self.x_size]*self.y_size
for row in range(self.y_size):
for column in range(self.x_size):
if row==0 or row==self.y_size-1 or column==0 or column==self.x_size-1:
print('set: '+self.border_icon)
self.map_grid[row][column] = self.border_icon
else:
print('set: '+self.body_icon)
self.map_grid[row][column] = self.body_icon
def setup(self, map_type):
map_templates = {
1: 'Small Map (40x20)',
2: 'Medium Map (80x40)',
3: 'Big Map (120x60)'
}
if map_type not in map_templates:
print('Invalid map type, starting a game with the default configuration...')
map_type = 1
print('Starting game: '+map_templates.get(map_type,'Invalid map type'))
self.create_grid(map_type)
这是map类,为了访问它,我只需创建一个map对象并调用设置。
问题是,每当我显示矩阵时,整个地图都会被“#”填充,而没有任何空格。这有什么原因吗?问题不在循环的
中,但问题在这一行:
self.map_grid = [[None]*self.x_size]*self.y_size
假设您的self.x_size
为5,而self.y_size
为10,则此行的计算结果如下:
[[None, None, None, None, None]] * 10
此时,您有一个列表引用了内部列表(这是它唯一的元素)。现在,如果您乘以self.y_size
,您只会得到9个(在本例中)对内部列表的引用。这是新Python开发人员之间的一个非常常见的误解
您的问题有两种可能的解决方案:
嵌套列表理解:
self.map_grid = [[None for _ in range(self.x_size)] for _ in range(self.y_size)]
或
self.map_grid = [[None] * self.x_size for _ in range(self.y_size)]
问题不在循环的中,而是在这一行中:
self.map_grid = [[None]*self.x_size]*self.y_size
假设您的self.x_size
为5,而self.y_size
为10,则此行的计算结果如下:
[[None, None, None, None, None]] * 10
此时,您有一个列表引用了内部列表(这是它唯一的元素)。现在,如果您乘以self.y_size
,您只会得到9个(在本例中)对内部列表的引用。这是新Python开发人员之间的一个非常常见的误解
您的问题有两种可能的解决方案:
嵌套列表理解:
self.map_grid = [[None for _ in range(self.x_size)] for _ in range(self.y_size)]
或
self.map_grid = [[None] * self.x_size for _ in range(self.y_size)]
我刚换了块:
for row in range(self.y_size):
for column in range(self.x_size):
if row==0 or row==self.y_size-1 or column==0 or column==self.x_size-1:
print('set: '+self.border_icon)
self.map_grid[row][column] = self.border_icon
else:
print('set: '+self.body_icon)
self.map_grid[row][column] = self.body_icon
我认为这是可行的
row=0
column=0
while(row<=self.x_size):
while(column<=self.y_size):
if row==0 or row==self.x_size:
print("#",end="")
elif column==0 or column==self.y_size:
print("#",end="")
else:
print(" ",end="")
column=column+1
column=0
print()
row=row+1
行=0
列=0
而(row我刚刚更改了该块:
for row in range(self.y_size):
for column in range(self.x_size):
if row==0 or row==self.y_size-1 or column==0 or column==self.x_size-1:
print('set: '+self.border_icon)
self.map_grid[row][column] = self.border_icon
else:
print('set: '+self.body_icon)
self.map_grid[row][column] = self.body_icon
我认为这是可行的
row=0
column=0
while(row<=self.x_size):
while(column<=self.y_size):
if row==0 or row==self.x_size:
print("#",end="")
elif column==0 or column==self.y_size:
print("#",end="")
else:
print(" ",end="")
column=column+1
column=0
print()
row=row+1
行=0
列=0
当(row@NibboNSX,用户必须考虑到这一点,如果他们发现答案正确并且解决了他们的问题,请将其标记为答案。这样,如果将来有人有相同的问题,他们可以在不询问新问题的情况下获得方便的帮助。这就是这里的工作原理。欢迎使用so:)@NibboNSX,用户必须考虑到这一点,如果他们发现答案正确并且解决了他们的问题,那么请将其标记为答案。这样,如果将来有人遇到同样的问题,他们可以在不询问新问题的情况下获得方便的帮助。这就是这里的工作方式。欢迎使用so:)