问题:
我想为自定义dice
构建一个类。但它也应该提供以下内容:
side
都可以包含其他dice
sides
的数量应该是动态可扩展的,但必须至少包含一个
dice
需要currentSide
side
都有一个property
,它提供此方的内容(在D6上,它将是"4"
)到目前为止,我去了两个班dice
和side
并给了他们我认为他们需要的属性。
public class Side
{
//public bool HasDice { get { return Dice != null; } } - Removed not needed
public Dice Dice { get; set; }
public string Value { get; set; }
}
public class Dice
{
public ObservableCollection<Side> Sides { get; set; }
public string Name { get; set; }
public Side CurrentSide { get; set; }
}
这是对的吗,我从来没有做过任何递归课程,所以我不确定?
另外,我怎么能够发现同一个骰子和一方是否“无休止地”指自己。
喜欢:
D1.CurrentSide = Side1; Side1.Dice = D1;
构建对象时我应该检查一下吗?
编辑:
如果D1滚动S2,则不应滚动D2。还D2.Dice = Null
。
如果D1滚动S1,则应滚动D2。
如果D2滚动S1则应滚动D3。
D3和D4不应触发任何滚动。
答案 0 :(得分:1)
根据你所说的,我建议你创建一个骰子的对象图,其中一个骰子连接到其他骰子,然后运行拓扑排序算法来揭示循环依赖。
为此,我建议您自己编写,使用QuickGraph工具。
现在,我自己曾经使用它并编写了一个IEnumerable
内容的扩展名,它以某种方式返回排序IList
,其中返回的第一个项目是其他项目从未引用过的项目。后者是最被引用的。 (或者可能反过来。)在循环依赖的情况下抛出异常。我的扩展程序使用QuickGraph库。
public static IList<T> OrderTopologically<T>(this IEnumerable<T> e, Func<T, IEnumerable<T>> dependenciesSelector)
{
var graph = new AdjacencyGraph<T, Edge<T>>();
foreach (T item in e)
{
graph.AddVertex(item);
foreach (T dependecy in dependenciesSelector(item))
{
graph.AddEdge(new Edge<T>(item, dependecy));
}
}
var topSort = new TopologicalSortAlgorithm<T, Edge<T>>(graph);
try
{
topSort.Compute();
}
catch (NonAcyclicGraphException cyclicException)
{
throw new ElQueueException("Circular reference detected while processing javascript dependency order.", cyclicException);
}
catch (KeyNotFoundException keyNotFoundException)
{
throw new ElQueueException("Dependency could not be found.", keyNotFoundException);
}
return topSort.SortedVertices;
}
答案 1 :(得分:1)
您所做的是state machine。您的程序(&#34;机器&#34;)始终处于某种状态,但可以通过执行某些操作来更改状态。根据逻辑,机器可以多次处于相同状态是完全可以接受的。所以,我不会过多地关注机器逻辑中的循环。如果用户想要循环,那么让他拥有它,只要机器可以达到最终状态并且程序到达执行结束。