我在Python中编写了一个使用this游戏的算法。
游戏中棋盘的当前状态是以下形式的字典:
{
<tile_id>: {
'counters': <number of counters on tile or None>,
'player': <player id of the player who holds the tile or None>,
'neighbours': <list of ids of neighbouring tile>
},
...
}
我有另一个字典存储我所有的'完整'的瓷砖(即一个瓷砖的计数器少于其邻居的数量,player
就是我)这个字典,{{1} },与上面的full_tiles
字典的格式相同。
我现在正在尝试创建一个列表board
,其中列表中的每个元素都是我的完整图块的字典,这些图块与至少一个其他完整图块(即完整图块链)相邻。所以这将是我所有单独的链条列表。
到目前为止,这是我的代码:
chains
我很难测试和调试我的代码并检查它是否正常工作,因为代码只能在模拟游戏的应用程序中运行。正如您所看到的,在这段代码中有很多事情发生,并且所有嵌套循环都难以理解。我似乎无法直接思考,所以我无法确定这个混乱是否能够按照我的希望发挥作用。
在我写这篇文章的时候,我刚刚意识到 - 在这段代码的第7行 - 我只是检查当前的tile是否不在当前链中,因此会有交叉链,当然,这将是一团糟。取而代之的是,我需要首先检查当前磁贴是否不在任何链中,而不仅仅是一个。
除了这个错误,我的代码会实现我正在尝试的吗?或者你能推荐一种更简单,更简洁的方法吗? (必须有!)
另外,如果我没有提供有关代码运行方式的足够信息,或者我是否需要进一步解释,例如for tile_id, tile in full_tiles.items(): #iterates through all full tiles
current_tile = {tile_id : tile} #temporarily stores current tile
if not chains: #if chains list is empty
chains.append(current_tile) #begin list
else: #if list is not empty
for index, chain in enumerate(chains): #iterate though list of chains
if not (current_tile in chain): #if current tile is not in current chain
for tile_id2, tile2 in chain.items(): #iterate through tiles in current chain
for neighbour in tile2["neighbours"]: #iterate through each neighbour of current tile
#neighbour is in the form of tile_id
if neighbour in chain: #if current tile's neighbour is in chain
chain[tile_id] = tile #add tile to chain
字典的内容,请告诉我。
提前感谢您的帮助。
编辑:不幸的是,我有时间限制来完成这个项目,因为这是我第一次使用Python,我目前缺乏使用该语言的知识来优化我的解决方案以下给出的来源。这是我对这个问题的最终 极其丑陋和混乱的 解决方案,最终工作正常,并且考虑到代码处理的小数据集,效率并不高
board
答案 0 :(得分:1)
这次优化怎么样?
def find_match (my_hexplode_chains):
x = 0
len_chain = len(my_hexplode_chains)
while x <= len_chain:
y = x + 1
for tile_id_x, tile_x in my_hexplode_chains[x].items():
for tile_id_y, tile_y in my_hexplode_chains[y].items():
if tile_id_y in tile_x["neighbours"]:
my_hexplode_chains[x].update(my_hexplode_chains[y])
del my_hexplode_chains[y]
return True
x += 1
return False
您可以在游戏中的每次移动后传递此功能并跟踪输出。