2016-08-06 95 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