我正在建造奥赛罗游戏,董事会看起来像这样:
1.0 - value
我的逻辑的一部分围绕一个函数返回一个字典,其值为对角线列表,而键元组包含两个数字;列表中第一项的索引。所以例如下面板的左对角线看起来像这样:
L= [['.','.','.','.'],
['.','B','W','.'],
['.','W','B','.'],
['.','.','.','.']]
我使用以下代码
完成了这项工作{(0, 1): ['.', '.'], (1, 3): ['.', 'B', '.'], (2, 3): ['.', '.'], (3, 3): ['.'], (0, 3): ['.', 'W', 'W', '.'], (0, 2): ['.', 'B', '.'], (0, 0): ['.']}
我想要做的是实现一个类似的功能,只对光盘做同样的事情,我正在寻找的输出是这样的:
def get_Rightdiagonally_adjacent(Li,ir,ic):
L = []
for i in range(max(len(Li),len(Li[0]))):
try:
L.append(Li[ir+i][ic+i])
except:
return L
return L
def get_Leftdiagonally_adjacent(Li,ir,ic):
L = []
for i in range(max(len(Li),len(Li[0]))):
if ic - i < 0:
return L
try:
L.append(Li[ir+i][ic-i])
except:
return L
return L
def get_Leftdiagonals(M: "2D list") -> list:
Ld = {}
for i in range(1,len(M)):
Ld[(i,len(M[0])-1)] = get_Leftdiagonally_adjacent(M,i,len(M[0])-1)
for i in range(len(M[0])):
Ld[0,i] = get_Leftdiagonally_adjacent(M,0,i)
return Ld
def get_Rightdiagonals(M: "2D list") -> list:
Ld = {}
for i in range(len(M[0])):
Ld[(0,i)] = get_Rightdiagonally_adjacent(M,0,i)
for i in range(1,len(M)):
Ld[(i,0)] = get_Rightdiagonally_adjacent(M,i,0)
return Ld
get_Leftdiagonals(L)
请注意元组如何表示列表中第一个项目相对于原始板的索引。在尝试了几天之后,我已经失败了,任何帮助都将受到赞赏。
答案 0 :(得分:0)
你说你不能删除空字符串而不搞乱索引。您可以采用的一种方法是将偏移量与每个值一起存储,以便保留索引。例如:
def get_Rightdiagonally_discs(Li,ir,ic):
# Get the unstripped diagonal
L = get_Rightdiagonally_adjacent(Li, ir, ic)
# Return pairs of the offset from ir/ic and value for locations with discs only
return [(i, disc) for i, disc in enumerate(L) if disc != '.']
因此,原始代码的右对角线从(3,3)
开始,值为['.', 'W', 'W', '.']
,这与偏移成对,然后剥离'.'
s,返回[(1, 'W'), (2, 'W')]
,这限制了您带有光盘的元素并识别它们的偏移量,这样您就可以获得有关它们沿对角线落下的完整信息。那会有用吗?