Java贪吃蛇的设计与实现

点击上面“天码营”,加入我们,快速成长~

「内容简介」实现Java贪吃蛇游戏,可以了解用面向对象的方式来编程解决问题,学习如何设计类,如何选择数据结构以及Java多线程与界面编程的基础知识。

今天来实现一个简单的贪吃蛇应用,效果如下:

这里把大概实现过程跟大家讲解一下,完整的教程比较长,大家参考Java贪吃蛇

在网上能找到不少贪吃蛇的代码,但是往往写得比较乱,甚至有所有代码都包含在一个类中的情况,对于初学者而言即使能Copy后跑起来,也不一定能够真正理解代码的逻辑。

实际上实现贪吃蛇的代码并不复杂,如果尝试去给出优雅地实现,比如写出具有清晰的类结构,有助于真正提高大家程序设计的基本功。

此外,应该让代码具有良好的扩展性,将来你希望更新你的贪吃蛇应用时,比如:

让贪吃蛇显示出不同的样子

增加或者修改积分规则

应该要做到修改尽量少的代码。实际的应用都是不断演化的,良好的设计能够让应用更易于维护。

所以贪吃蛇应用非常适合入门Java编程的同学,可以了解用面向对象的方式来编程解决问题,学习如何设计类,如何选择数据结构以及JavaSwing的基础知识。

开始设计

Java是一门面向对象语言,一个Java程序就是一系列对象(Object)的集合,对象通过方法调用来彼此协作完成特定的功能。面向对象是一种非常符合人类思维的编程方法,因为现实世界就是由对象和对象之间的交互来构成的,所以我们其实很容易将现实世界映射到软件开发中。其实我们可以把Java语言当成是一门普通的语言,学习英语是为了与世界交流,而学习Java就是与计算机交流。我们需要把自己的思维,通过Java语言表达出来,让计算机理解。

那现在我们怎么用Java,用面向对象的思维,来表达出贪吃蛇这个游戏呢?

贪吃蛇游戏的规则无需多言,我们马上能想到两个对象,一条蛇和一个棋盘,我们可以定义两个类:

publicclassSnake{}

publicclassGrid{}

棋盘里有一条蛇,这其实就是棋盘和蛇的关系,所以可以给棋盘定义一个成员变量,类型为Snake,Grid的代码变为:

publicclassGrid{privateSnakesnake;}

Grid还有长度和宽度等属性,可以建立构造函数。面向对象的知识大家可以复习Java面向对象基础。

用面向对象建模语言UML来表达这两个类的关系如下:

我们要创建的是一个窗体应用,整个负责与用户交互的窗体,可以设计一个类来表示:

publicclassSnakeApp{}

这些类内部定义基本还没有,不过没关系,在练习过程中就会慢慢充实起来。

表达虚拟概念的类

刚接触面向对象编程的同学,从现实世界往Java世界做对象映射往往不是什么问题,因为比较直观。比如一个人和一张桌子,对应地设计一个对应的类即可。

其实一个系统用Java语言来表达的话,往往要设计一些表达虚拟概念的类。将来大家学习到更高级的面向对象设计知识,比如设计模式,就会发现其实这些表达虚拟概念的类才往往是设计一个优秀系统的关键。

SnakeApp作为一个窗体应用,会接收到用户的输入(比如控制贪吃蛇方向的按键操作),需要展示当前游戏的界面和状态。而Grid则需要随机生成食物,维护着贪吃蛇的状态。那么Grid就要根据SnakeApp中的用户交互来控制游戏状态,因为我们可以设计一个GameController来表示这种控制。

publicclassGameController{}

GameController的职责在于接收窗体SnakeApp传递过来的有意义的事件(比如用户改变方向),然后传递给Grid,让Grid即时地更新状态,同时根据最新状态渲染出游戏界面让SnakeApp显示。

总体的设计图如下:

上面的设计其实是一个典型的MVC模式,MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

Controller——负责转发请求,对请求进行处理:对应于GameController

View——负责界面显示,对应于SnakeApp

Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现,对应于Grid和Snake

将来大家学习JavaWeb开发,也会接触到SpringMVC。当然对于贪吃蛇游戏最终的类设计并非如此,这只是一个最初的概览,后面我们不仅仅会充实类,而且会增加一些新的类。

贪吃蛇的方向

接下来考虑贪吃蛇的行进方向问题。贪吃蛇行进的方向可以为上下左右。一种常见的做法是定义一个包含静态常量的类或者接口,比如:

classDirection{publicstaticfinalUP=0;publicstaticfinalRIGHT=1;publicstaticfinalDOWN=2;publicstaticfinalLEFT=3;}

这是一种典型的取值范围在一个有限的数据集中的场景,这种场景有一种更好的处理方式:枚举(即Enum)。类似的场景还有比如一周包含从星期一到星期日7个取值。

Enum本质上是一种特殊的类,可以有更多丰富的操作,相比使用静态常量而言功能更加强大,而且具有更好的维护性。

使用枚举定义Direction

通过枚举来定义方向的代码如下:

/***贪吃蛇前进的方向*/publicenumDirection{UP,RIGHT,DOWN,LEFT;}

相比前面的代码简洁了许多。

其实UP、RIGHT等枚举值默认就是public、[static](







































甲氧补骨脂素 xywy
北京白癜风可以治好吗



转载请注明:http://www.guyukameng.com/php/8246.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了