2011-10-18 55 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的方法,它返回迷宮的地圖。這張地圖可以用來檢查人是否正在做出正確的動作。因此,地圖將是迷宮與人之間的共同點。但是,如果你想跟蹤迷宮裏面那個人的當前位置,這可能無法幫助你。