2012-04-09 45 views
1

我在我簡單的基於Windows Forms的遊戲項目中組織簡單的概念問題。我必須使用Windows Forms實現Whack-A-Mole遊戲。 Molehills由checkoxes代表。如果複選框被選中,那麼在小丘中有一個痣。通過點擊選中的複選框可以殺死鼴鼠。簡單的Windows窗體遊戲中的類之間的依賴關係

我設法創建了GamePlay類,其中包含i.a.類別:GameBoard(基於TableLayoutPanel和複選框數組的遊戲棋牌表示),Rules(合格率,一輪中最大摩爾數,回合持續時間等)。在GamePlay班也有PointsCounter(到目前爲止有多少痣已經死亡)。我的解決方案中有更多的類/結構,但在這個問題的背景下它們並不重要。

遊戲板的尺寸可以在配置窗口中進行設置,所以我就 TableLayoutPanel中動態創建複選框,單擊開始遊戲按鈕後。數組複選框和事件處理程序放在GameBoard類中。摩爾死亡後,我必須更新(實際上,我必須添加類的pointsForMoleKilling)。但我不能在這樣的班級模式中。從事件處理程序複選框鼠標單擊(它在GameBoard類中)沒有訪問PointsCounter(它在GamePlay類中)。

我應該如何重新組織類之間的依賴關係?
我的臨時解決方案是製作Rules,pointsForMoleKillingscore()(也從GamePlay類)靜態

回答

1

我想你和Peekay的回答是倒退的。您的GameBoard是一個視圖(遊戲狀態的特定表示),不應直接依賴GamePlay類,這聽起來非常像控制器類。您也不應該將遊戲模型的概念與該模型的視圖混合在一起(您似乎在GameBoard中執行此操作)。我建議你查看MVC模式。

考慮如果用戶想要將遊戲保存到中途,您希望將哪些元素保留到磁盤上。您可能需要保存該特定遊戲的rulesscore,當前time以及board的狀態。這些東西是你的型號:GameModelrules,score,timestate

現在...您希望能夠以某種形式的視覺表示將此模型顯示給用戶。這被稱爲視圖。 A GameView使用Windows窗體顯示您的GameModel。它可能會通過ScoreViewTimeViewBoardView或其他分隔顯示得分。最後,你需要響應用戶界面事件(如鼴鼠重擊,或暫停/退出遊戲)。該類負責訂閱UI事件,並通過更新模型來處理這些事件。它被稱爲控制器。

爲了使其狀態成爲全局,使其成爲靜態類通常不是OO世界中的最佳想法。

+0

但是,如果我想保持'state'類遊戲板的狀態(也有由複選框表示molehills)我怎麼會訂閱事件處理程序(例如ckeckbox單擊事件處理程序)從控制器類?我不明白我們如何訂閱從控制器類的事件處理程序到來自「狀態」類的複選框單擊事件。在我看來,除非我們使用控制器類'static'來創建事件處理程序,否則就無法訪問。 – 2012-04-10 02:06:50

+0

您的控制器類負責處理UI事件並更新模型。因此,一種方法是讓您的控制器註冊以單擊事件,然後更新您的狀態。重擊遊戲並沒有任何關於「複選框」的概念,只有痣和重擊,所以你的狀態不應該知道複選框或點擊。 '查看 - >點擊事件 - >控制器 - >調用重擊()方法 - >模型 – ungood 2012-04-11 18:34:34