2011-10-18 90 views
0

我正在考虑像迷宫中的人这样简单的运动的设计。如何在迷宫中实现人?

我想制作Maze对象,在其中放入一些Man对象,并调用solve()让它们离开迷宫。 人应该对迷宫一无所知。它可以尝试去找出路。

这里是我看到它:

maze = Maze.new 

    man1 = Man.new 
    man2 = Man.new 
    man3 = Man.new 

    maze.put(man1,man2,man3) 

    maze.men.each do |man| { man.solve } 

但如何实现这些类的身体吗? 除非我给迷宫实例给他,否则人怎么能知道如何走进迷宫? 但是,如果我这样做:

maze.put(man1(maze),man3(maze),man2(maze)) 

放什么个人里面有迷宫,如果我可以只给迷宫实例给他们的原因是什么?

这是我不明白,找不到优雅的解决方案。

回答

1

想想这样:什么数据属于每个类?用它来处理这些数据有哪些方法?这是面向对象:数据和相关代码的捆绑。

迷宫类不需要知道任何男人。这是一个迷宫。它只是一些墙壁,一些结构。像这样建立它,就好像它不存在于它之外。制作一些方法来获得关于迷宫的信息,比如在某个点,墙角,交界处是否有墙...

在你的情况下,Man类是为一个目的而设计的:找到他的方式走出迷宫。因此,一个男人应该在迷宫中拥有一席之地(他的部分资料)以及一些帮助他寻找出口的方法。例如,一些深度优先搜索算法。

当然,你可以收集所有在迷宫中嵌入迷宫的人。但这不是必要的。您可以使用任何其他集合来控制这些人并对它们进行迭代。

maze = Maze.new 

man1 = Man.new(maze) 
... 
men = Array.new 
men[0] = man1 
... 

men.each do |man| {man.solve} 
+0

是的。这样我明白了。但是有一种感觉,我们给人一个迷宫而不是给人一个迷宫? – VitalyP

+0

我相信如此。尽量给每个班级适当的责任和数据结构。在我们的案例中,有一个人有责任走出迷宫,这需要的部分数据是他的位置。这一切都属于人。但迷宫并没有特别的责任。它确实有一个必须建模的结构。就这样。记住你正在编程。让电脑做东西是最重要的。用“迷宫”和“人”这样的自然术语来思考会有所帮助,但是不要过多地关注建模天然构造。可用的代码仍然是目标。 –

0

您可以添加名为Map的新类。迷宫可以有一个名为GetMap的方法,它返回迷宫的地图。这张地图可以用来检查人是否正在做出正确的动作。因此,地图将是迷宫与人之间的共同点。但是,如果你想跟踪迷宫里面那个人的当前位置,这可能无法帮助你。