2010-01-06 77 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