2013-04-24 93 views
3

建模戰艦遊戲我想創建一個「遊戲」的項目我的團隊在大學做一個戰列艦遊戲。我以前從來沒有真正使用GUI,幾乎所有的輸出都在Eclipse控制檯中。如何正確使用Java

首先,我創建了一個GUI類,它實際上是我的「亞軍」級。它加載了一個JFrame。
我有第二堂課,GUIGrid,它爲將要顯示的兩個遊戲板設置一個尺寸,並使用嵌套for循環來從GUICells創建網格。
這包含偵聽器等來檢測鼠標在做什麼,並存儲每個單元格的x和y座標。我已經運行了一小段測試代碼,所以我可以點擊任意一個網格上的任何位置,並且一個彈出窗口告訴我該單元格是哪個座標。

除了這些類,我有一個船級,有五個子類類型的船舶和Player類,設有專賣店玩家的名字和船舶創建對象的數組,他們使用。

最後,我有我的邏輯類。我有一個GridLogic類和一個CellLogic類。前者使用嵌套for循環來創建CellLogic對象的二維數組。 CellLogic類然後存儲座標和信息是否已經被攻擊的信息。

我(!最後)的問題是 - 這是對系統進行建模的正確方法?當我查看CellLogic和CellGUI類時,它們似乎有相當類似的東西。另外,雖然我可以讓GUI響應鼠標點擊,但我非常努力地將GUI連接到邏輯。例如,我不知道如何將船舶添加到網格上,然後將哪些位置存儲在二維數組中。如果沒有發佈大量的代碼,我希望有人能夠告訴我我是否至少在正確的軌道上,或者如果我把系統分離得太多了。

+0

你已經有很多優秀的答案,你的方法很完善。如果您需要額外的參考資料,您可以在此[TicTacToe代碼](https://gist.github.com/jewelsea/5115901)中找到基本的基於回合的JavaFX網格遊戲。 – jewelsea 2013-04-24 11:27:08

回答

3

雖然我認爲分離聽起來不錯,但它可以做得更清楚。使用MVC模式,您可以清楚地定義模型(船隻和網格),控制器(您的邏輯)和視圖(繪製網格的jframe)。

現在基本上,該模型不知道別的什麼,控制器知道視圖和模型和視圖知道如何繪製模型,並呼籲控制器作爲用戶輸入的反應。那就是:用戶點擊,視圖只是用座標和發生的事件調用控制器。此控制器現在修改網格併發出重繪。所以在我的pov中,你可能不需要一個cellGUI類,只是一個視圖,它描繪了一切(儘管如果你在cellgui類中存儲x,y,你可以像這樣建模)。但你不需要一個細胞課。你需要一個「更高」的控制器,知道如何修改整個網格,以及發生什麼,如果已經有東西等等。

+0

謝謝 - 我會嘗試合併這兩個邏輯類。 – 2013-04-24 09:05:20

2

過度使用子類化的趨勢是大學的項目很普遍。子類化是今天主要避免的事情。在你的例子中,對於船型使用子類不會有真正的好處。更好的設計是使用Ship類,該類具有枚舉ShipType。這也會讓評估更容易。

回答您的評論: 您的方法錯過了某種包含2D網格和Player對象(所有遊戲數據)的GridModel。這個GridModelGridGUIGridLogic中是已知的。 GridLogic修改GridModel並通知GridGui重新繪製更改後的模型。 GridGUI不修改模型,它只是通知GridLogic在網格座標x,y發生了點擊。然後修改模型並讓GUI自行更新。有關更多詳細信息,請參閱Model-View-Controller-Pattern

+0

謝謝 - 你有沒有關於GridLogic,GridGUI,CellLogic和CellGUI分離的建議?這太多了嗎? – 2013-04-24 08:57:28

1

我想你不會在這裏得到一個答案,但這是我的要求。 MVC顯然。特別是我會保留主要的一個類(JFrame,菜單等)。會保持董事會在另一個。它會使用單元&船舶自行繪製。單元格將包含信息(它們的x,y,它們在哪個船上以及是否被轟炸),ship類將具有它的類型,從x,y到要渲染的x,y和圖像。然後你可以得到一個部分透明的炸彈圖像,這樣就可以看到它下面的船。

董事會將畫正方形,船隻,然後最後炸彈在他們身上。

而不是彈出,有助於有一個調試框架,您可以顯示(在標籤上)一些關鍵信息;除了運行日誌

控制器將是BattleShip類與模型的幫助:細胞和船隻。保持溝通,誰玩過,在哪裏等等 - >通過接口與董事會進行對話,這樣可以改變這種情況,說出一個新的觀點的網絡。

0

Model-View-Controller with listeners and such。如果您研究JavaFX(它打算跟進Java Swing),它具有更簡單的「內置」更改監聽器。另外還有一些很好的造型和動畫效果,沒有太多的編程。

其餘的似乎很好。繼續繼承。您可能會實現一個功能查找/發現模型:

public interface FlightCapable { } 
public class X { 
    public T lookup(Class<T> intface) { } 
} 
FlightCapable fc = x.lookup(FlightCapable.class); 
if (fc != null) 
    fc.fly(); // Instead of x.fly(); 

這個高度分離。