打印相对于特定阵列坐标的二维数组内的索引?

时间:2016-08-06 00:32:00

标签: python arrays

假设我有一个由多个.列表组成的数组,它们代表世界地图。 world_array = [['.' * 50 for _ in xrange(50)]

在此数组的内部,在索引(0, 0)处,存在一个播放器变量 - 字母p

如何根据用户当前位置在地图中的位置向用户显示此数组的特定部分?例如,如果我想显示玩家所在的牌,加上他/她周围的5-10张牌,我该怎么做呢?

P . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .

另外,如何以删除与列表相关的括号和撇号的方式打印数组,如上所示?

感谢您的回答。

2 个答案:

答案 0 :(得分:1)

首先,如果要修改地图时要小心,不应该为行使用字符串,因为它们是不可变的。你无法修改你的地图 - 你完全重写每一行的单位。

所以我建议你使用这个:(一个2D数组的字符)

world_map = [['.']*n_cols for _ in xrange(n_rows)]

按原样打印数组:

for row in world_map:
    print ''.join(row)

现在探索。如果你想用点隐藏地图,那么它不是你应该存储在2D数组中的点,它是地图的内容。

所以,让我说我创建这个地图(和这些变量):

n_rows = 3
n_cols = 5
world_array = [
['0', '0', '1', '1', '1'],
['0', '2', '0', '1', '0'],
['1', '1', '0', '0', '0']
]
exp_radius = 1 #the player can see 1 square from him
x,y = 1,0 #position of the player

要显示整个地图,并在播放器周围显示一个可见的圆圈 - 在(x,y) - 和其他地方的点,那么它是这样的:

for r in xrange(n_rows):
    row=''
    for c in xrange(n_cols):
        if c=x and r=y:
            row += 'P'
        elif abs(c-x)<=exp_radius and abs(r-y)<=exp_radius:
            row += world_array[r][c]
        else:
            row += '.'
    print row

这会给你:

0P1..
020..
.....

请注意,如果您更喜欢钻石形状而不是方形:

0P1..
.2...
.....

所以为了清楚起见:

..0..
.000.
00P00
.000.
..0..

您应该替换条件:

elif abs(c-x)<=exp_radius and abs(r-y)<=exp_radius:

由:

elif abs(c-x)+abs(r-y)<=exp_radius:

你现在已经掌握了所有线索,玩得开心! ;)

编辑:

如果您只想在播放器周围显示给定宽度和高度的点,那么只需修改for循环的范围,如下所示:

width = 5 # half of the width of the displayed map
height = 3 # half of the height of the displayed map

for r in xrange(max(0,y-height), min(n_rows, y+height)):
    row=''
    for c in xrange(max(0,x-width), min(n_cols, x+width)):
        if c=x and r=y:
            row += 'P'
        elif abs(c-x)<=exp_radius and abs(r-y)<=exp_radius:
            row += world_array[r][c]
        else:
            row += '.'
    print row

因此打印的线条和列将从左上角的位置(x宽度,y高度)到右下角的位置(x +宽度,y +高度),如果超出则裁剪地图。因此,如果没有裁剪,显示的区域是2 *宽* 2 *高。

答案 1 :(得分:0)

打破你的问题。采用2D数组array[x][y]。如果您想要在播放器周围显示最多5个位置的图块,那么您必须迭代并打印所有这些图块。所以,从玩家的位置前5开始,之后结束5。从逻辑上讲,它将如下所示(x是玩家位置的第一个索引,y是第二个索引):

for i = (x - 5) to (x + 5):
    for j = (y - 5) to (y + 5):
        print value of array[i][j]
    end
end

现在,这还不完整。原因在于,正如您可能已经注意到或未注意到的那样,这有可能超出界限。这意味着如果x - 5&lt; 0你想要从0开始。如果x + 5>数组的第一个维度的大小,你会想要使用大小。有这个功能 - 最大和最小。这意味着你的逻辑最终会像这样:

for i = max(0, (x - 5)) to min(1st dimension's size, (x + 5)):
    for j = max(0, (y - 5)) to min(2nd dimension's size, (y + 5)):
        print value of array[i][j]
    end
end