2010-01-06 91 views
1

有一段時間,我一直試圖在Java中做一個簡單的「遊戲」,它實際上只是一個帶有正方形和網格的小程序。我最終想做的事情是用戶點擊並且正方形將移動到用戶點擊圓角到最近的網格廣場的位置。你如何構建一個Java程序?

的問題是我是自學的初學者,我有一個很難搞清楚如何實際結構中的程序,一些例子:

  • 我應該有一個單獨的類偵聽鼠標點擊?
  • 當我收到點擊後,我應該將它發送給代表框的其他對象,並讓它決定它想做什麼,或者只是調用一些使框移動的函數?

我真的很想了解所有這些「什麼時候使用什麼」的東西,所以任何鏈接或一般建議表示讚賞。

回答

7

你真正要問的是如何開發一個與典型的Java應用程序明顯不同的遊戲。不過,我會給你一些想法,至少讓你指向正確的方向。

  • 利用Java是一種面向對象的語言。也就是說,對象應該都有它們的own responsibility
  • 將您的遊戲分爲三個關鍵層:應用程序層,遊戲邏輯層和表示層。

    • 應用層應該包含所有你的助手和通用子系統,像隨機數生成器,文本分析器,文件存取模塊,網裝載機等的
    • 遊戲邏輯層應該實現所有的規則你的遊戲,並負責維護規範的狀態。基本上,當你按下鍵盤上的「W」向前移動時,遊戲邏輯層應該從UI接收MOVE_FORWARD_REQUEST
    • 表示層應負責兩件事情:獲取輸入和渲染你的世界。當它被輸入時,如「W」鍵,它應該將其映射到一個動作,並將其發送到遊戲邏輯層進行處理。然後,它應該根據遊戲邏輯告訴它做的事情來渲染世界。

遊戲開發顯然是有很多書專門給它一個完整的境界。我的最愛之一是Game Coding Complete,它專注於C/C++,但應該給你一個關於如何構建遊戲的好主意。

祝你好運!

+0

感謝您的示例和書籍鏈接。這正是我需要讓我走上正確的軌道。 – MESLewis 2010-01-06 15:55:02

+1

我祝你一切順利。每個人都必須從某處開始......真正理解如何構建程序需要一段時間。當你開始的時候,你總是可以放棄它,只需將它們拼湊在一起即可實現SOMETHING的運作。你可能會自己看到它有什麼問題。 :) – 2010-01-06 15:57:09

5

良好的軟件開發的一個主要原則是Single Responsibility Priciple。它指出,一個職能或職業應該只有一個責任。

這樣你的類和對象不應該變得太大和難以管理。

+0

這也被稱爲具有高凝聚力。一個班只能做一件事。 (例如,如果您正在編寫國際象棋遊戲,則不應該代表遊戲棋盤和棋子)。 – JasCav 2010-01-06 15:33:21

+0

這也是一個無意義的原則,基於關於「責任」定義的循環論證。 – ima 2010-01-06 15:57:38

1

我認爲開發軟件時要掌握的最重要概念之一是概念或Orthogonality。這不是最簡單的定義,但實際上它意味着一個組件(例如讀鼠標點擊)不應直接綁定到不相關的組件(在屏幕上移動一個方塊)。

就你而言,讀取鼠標點擊的代碼應該與實際移動框的代碼分開。無論你是否將內容/匿名類實現爲由你自己決定。但是,如果你遵循正交原則,如果你改變主意,以後很容易改變。

+0

對於那個MVC模式(模型視圖控制器)或MVP模式(模型視圖演示者)colud被使用.. 而不是寫新帖..我建議任何對象的TDD(測試驅動設計)和DDD(域驅動設計)面向語言.. 我不容易學習這些東西..但它是有益的 – shake 2010-01-06 16:03:58

0

第1步 - 找到Sun提供的演示小程序。 http://java.sun.com/applets/jdk/

第2步 - 閱讀這些演示小程序。至少三個。最好全部。

你已經閱讀了幾個小程序,你應該更清楚地看到如何組織程序。然後,您可以提問更多的焦點,指向特定的小應用程序示例和特定的編程問題。

+0

演示小程序寫得不好。 – 2010-01-06 18:53:07

+1

@Tom Hawtin:真正的工作代碼打敗了圍繞這個模糊問題的討論。無論如何,你的評論沒有幫助。你有更好的applet例子嗎? – 2010-01-06 19:23:28

0

是的,我自己是一個初學者程序員。是的,在多個類中分離功能是減少複雜性和增強個別類的凝聚力的好方法。

增加凝聚力好,因爲具有更復雜的數據結構中的算法變得越來越複雜,你的代碼是更少地依賴於對方。

例如,在你的情況可能是按照(Model View Controler)分離類MVC是一個好主意。

  • 你有一個模型,它代表了你的遊戲數據的結構。
  • 你有一個查看器,它呈現你的模型以什麼形式請你。
  • 具有拿起變化的模型(通過監聽器),然後更新瀏覽器

現在你可以改變你的模型,並添加只需要在瀏覽器中的工作方式的微小變化額外功能的控制器。

有許多Patterns在那裏,但沒有時使用了另一種硬規則。在某些情況下,您可以使用幾種設計模式,並且有些情況下需要您選擇一種設計模式。這裏

+0

我強烈建議不要嘗試使用MVC進行遊戲。 Model-View-Controller更適合於中型Web應用程序。 – 2010-01-06 15:44:38

+0

好吧,一旦你開始使用組件,AWT和Swing都會在你身上強制MVC,所以除非你故意顛覆這個範式,否則無論何時你正在做一個Swing(AWT)圖形用戶界面,你都會「做」MVC。 – 2010-01-06 15:48:22

+0

如果我正確地記得Swings迫使你在JTRee和其他幾個人上使用MVC,其餘部分是Model-Delegate。 這是一個比真實的建議更可能的例子。除了Logic/Presentation/Application層是粗略的等價模型/視圖/控制器。至少是模型/視圖部分。 – 2010-01-06 16:30:22

1

一個問題是,所有的規則都在他們一些迴旋餘地,你必須使用自己的最佳判斷。

例如,你現在所描述的應用程序在我看來如此簡單,我可能會做它在一個類中,也許一對夫婦嵌套,也許匿名類的。無論如何,我可以做一個合適的案例,將整個事件整合到一個源文件中,聲稱多個源文件實際上會增加整個事物的複雜性。

但是如果你的GUI有一些不同的控件,或許每個控制不同的行爲,這將成爲一次分裂的功能了這樣你就不會用麪條代碼大碗結束了。

Java GUI庫嘗試從模型中自然分離(視圖+控制器)。我們鼓勵您在一個模塊(=文件)中定義和顯示GUI,但要將數據模型和功能放在另一個模塊中。對於複雜的GUI,可能還有多個由代碼組成的GUI實現模塊。

讓事情「乾淨」的一種方法是在「層」中工作,其中每個層只「知道」它需要知道的東西。具體而言,GUI層需要知道其基礎模型–表的存在和列表以及不需要連接到TableModelListModel等等。儘管如此,它並不需要了解這些模型的細節,所以它可以通過界面簡單地引用這些模型。

另一方面,模型層不需要關於GUI的知識。知道的越少越好,這在理論上可以讓您無需觸摸模型即可交換GUI。

我的模型還可以包含ActionListener以迴應由例如在GUI中按下按鈕。

當然,對模型的操作和更改通常會導致GUI的更改。如果模型層不知道GUI,如何將這些更改傳遞給GUI?你可以在這裏使用綁定的bean屬性。這裏有一個簡短的教程:http://www.javalobby.org/java/forums/t19476.html。所以你有相同的結構:變化發生在你的模型中,它們通過模型中的屬性更改支持傳遞給bean,GUI可以將偵聽器附加到這些屬性以找出發生了變化的東西。

無論您是在模型代碼中執行實際的有效操作(例如寫入文件,轉換數據,無論是否),還是將「處理」代碼拆分爲另一個模塊都取決於您,並且將依賴於您的混亂程度模型已經是。如果有一小部分領域和方法在那裏感到孤獨,你可能決定把它們混合在一起,但是當它開始變得凌亂時,你會想要將你的處理代碼重構到它自己的模塊中。處理聽起來像是不想知道其他模塊的那種模塊;你最終可能只是從模型級調用它的方法。

我已經描述了我做GUI開發的基本風格。當然還有其他建議,你可能會根據自己的經驗開發自己的風格。這只是爲了給你一個想法和一個可能的起點。

0

每個初學Java程序員都應該從Sun教程開始。他們很好。

另一個很好的來源,尤其是免費的來源,是Bruce Eckel的「Thinking in Java」,可從http://www.mindview.net/Books/TIJ/獲得。

但後者與前者相比有點過時。這就是爲什麼我推薦這兩個。

1

...用戶點擊並且正方形將移動到用戶點擊四捨五入的位置到最近的網格正方形。

這是在縮放視圖中執行此操作的example