蛇和梯子,检查是否会落在最后一个方格上

时间:2017-01-29 04:05:20

标签: python linked-list

我正在使用链接列表在python中实现蛇和梯子游戏。节点链接到下一个方块,最后一个方块链接到第一个方块。 (圆)。我也有蛇和梯子,所以每个节点也有一个名为destination的参数,如果它没有链接到任何地方,它是None,但如果它没有,那么它包含address of the other node

我的游戏特别之处在于我有一个fixed roll。如果我的固定广告代码为4,我会always move 4 nodes。如果我登陆的节点连接到蛇或梯子,那么我会去那里。

我从第4个广场开始,或者是我的滚动所在的广场。

我需要一种方法来检查我是否会降落在最后一个广场上。

enter image description here

考虑16个方格和2个方格。我从第2个方格开始。但是有一个梯子,所以我搬到了第11个广场。现在我每次移动2个节点。两转后,我将移动到黄色方块。然后,当我再次移动时,我将移动到最终方块,然后返回到方块1(你必须降落在最后的广场上才能获胜)。但后来我注意到,如果我继续滚动2,我将永远不会落在最后的广场上,我需要一种方法来检测它。

我不需要任何代码,但只是一些建议,我怎么能检测到我是否永远不会落在最后的广场上。谢谢

2 个答案:

答案 0 :(得分:1)

您的问题转化为在广场遍历中找到循环的问题。 总体思路如下:“如果我在不到达最终广场的情况下不止一次访问同一个节点,那么我将永远无法访问它。”

例如,您可以通过将已访问的成员包含在方形类中并检查您是否到达之前访问过的方格来实现此操作。在这种情况下,您可以停止遍历。

答案 1 :(得分:0)

您可以对表示移动的图表进行可达性分析。这是代码 这样做

nodes = list(range(16))
roll = list(range(1,4))
A = list(range(16))
A[1] = 10
A[9] = 6
A[5] = 13
edges = {(i,j): A[(i+j)%16] for i in nodes for j in roll}

change = True
start = current = 0
states = set([start])
oldlen = len(states)
while change:
    current = edges[(current, 2)]
    states.add(current)
    change = (oldlen != len(states))
    oldlen = len(states) 

print(states)

如果您从一个位置有多个可能的移动,则更改检测会更复杂。