2016-08-06 60 views
0

比方说,我有一个由多个.列表组成的数组,它们代表了世界地图。 world_array = [['.' * 50 for _ in xrange(50)]在相对于特定数组坐标的二维数组中打印索引?

在这个数组的内部,在索引(0, 0)处,玩家变量存在 - 字母p

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

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

此外,我该如何去除与列表相关的方括号和撇号,如上所示,打印数组?

感谢您的任何答案。

+0

您是否只说玩家(字母'p')*开头*在'(0,0)'并且可以移动到其他位置?你只是要求打印单元格还是要在网格周围显示一些上下文来显示窗口在完整网格中的位置?你正在使用哪个版本的Python? –

回答

1

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

因此,我建议你使用这样的:(字符的二维数组)

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

要打印阵列,因为它是:

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

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

所以我们说我创建这个图(以及这些变量):

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 *高。

+0

我该如何去只显示地图的一小部分?这似乎工作正常;然而,随着更大的地图,到处都有很多时期。我能否限制它,以便玩家只能暴露在20个左右的区域,而不是打印整个地图? – PyDive

+0

对不起,我在度假! :3我编辑了我的帖子,添加了一个提议来做到这一点。 –

0

分解你的问题。以二维数组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 

现在,这是不完整的。这是因为,正如你可能注意到或可能没有注意到的那样,这有可能超出界限。这意味着,如果你想从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 
+0

错误的语言? –

+0

不是一种语言(英语除外),它是合乎逻辑的步骤而不是代码。我不会为OP做所有事情,只是打破这个过程,让他明白 – VortixDev