worldArray = [["." for i in range(5)] for i in range(5)]
这会产生一张我可以用于游戏的地图。它应该看起来像:
[['.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.']]
假设'.'
代表草瓦。如果我想将特定数量的索引替换为'~'
而不是代表水瓦片,那么最简单的方法是什么?我希望地图看起来有点像:
[['.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.'],
['~', '~', '.', '.', '.'],
['~', '~', '~', '.', '.']]
我知道我可以手动浏览并更改每个特定索引以显示'~'
磁贴,但我使用的真实游戏内地图是40 x 40而不是 - 这样就可以单独替换每个索引有点乏味和多余。我希望能够定义我想要替换的哪些瓷砖,即第4行,第1-2列;第5行,第1列 - 第3列。我怎么能这样做?
答案 0 :(得分:3)
切片符号是完美的:
from functools import partial
def tile(icon, row, col_start, col_end):
worldArray[row][col_start:col_end] = icon * (col_end - col_start)
water = partial(tile, '~')
mountain = partial(tile, '^')
water(3, 0, 2)
water(4, 0, 3)
答案 1 :(得分:1)
你可以写一个辅助函数
def replace_at_position(world_array, row_col_dict, repl_char):
"""
Use row_col_dict in format of {row : (startOfRange, endOfRange)} to replace the characters
inside the specific range at the specific row with repl_char
"""
for row in row_col_dict.keys():
startPos, endPos = row_col_dict[row]
for i in range(startPos, endPos):
worldArray[row][i] = repl_char
return worldArray
你可以像这样使用它:
worldArray = [["." for i in range(10)] for j in range(5)]
# replace row 2 (the third row) colums 0-4 (inclusive, exclusive, like range) with character '~'
worldArray = replace_at_position(worldArray, {2 : (0,10)}, '~')
#replace row 1 (the second row) colums 0-5 (inc, exc, like range) with character '~'
worldArray = replace_at_position(worldArray, {1 : (0, 5)}, '~')
pprint.pprint(worldArray)
这将导致:
[['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
['~', '~', '~', '~', '~', '.', '.', '.', '.', '.'],
['~', '~', '~', '~', '~', '~', '~', '~', '~', '~'],
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']]
答案 2 :(得分:0)
我会定义一个函数,该函数返回是否使~
而不是.
。
"""
Determines if the game position is regular or not
"""
def isRegular(x,y):
# Only replace Row 4 column 1 and 2 with ~
return not (x==4 and y in [1,2])
worldArray = [["." if isRegular(x,y) else "~" for x in range(5) ] for y in range(5)]
您可以根据自己的喜好更改regular()
功能。
答案 3 :(得分:0)
根据您的问题,我将一个简单的功能组合在一起。随意将其复制并粘贴到IDLE控制台中:
>>> def a():
global worldArray
b = 1
while b < 2:
c = (int(input('Row #: ')),int(input('Column-Leftbound: ')),int(input('Column-Rightbound: ')))
worldArray[c[0]][c[1]] = '~'
worldArray[c[0]][c[2]] = '~'
d = c[2] - c[1]
for i in range(d):
worldArray[c[0]][c[1]+i] = '~'
print(worldArray)
b = int(input('b now equals: '))
>>> a() #This line is for you to call the function at the console
牢记这些事情:
合法的行号和列号来自:0-4。
另外,为了退出while循环,我要求你重置b的值。如果输入的值小于2,则保持循环。如果有帮助,请告诉我。我试着保持简单。
作为旁注,
worldArray = [[&#34;。&#34; for i in range(5)] for i in range(5)]
对我来说不会产生漂亮而整洁的矩阵。