写了个贪食蛇和一个连连看

     好久没有写java application了,手有点痒痒的,而且一直都比较喜欢自己做些小游戏玩一下,于是整了点时间写了两个程序。

     先是做了个贪食蛇,然后写了个连连看。相对而言,贪食蛇要容易很多,不过还是花了大半天的功夫,可能真是好久没写applicaton了。本来是可以用键盘控制的,可是自己想改下以前的风格,就是想把显示部分的代码跟控制部分的代码分开,所以就把这两部份分别写成了两个类ShowPanel和ControlPart,然后在另一个类 GreedySnake 中把这两个类作为成员来进行控制,可是这样就出现了问题:这个时候的焦点我无法控制了,也就没法增加键盘输入事件的监听了。试过在三个类中都添加键盘事件监听器,但还是没有效果,然后也懒得改,就用鼠标控制了。

     写java程序以来,都很少接触到什么算法了,除了偶尔用来专门写算法题。以致让我产生错觉用java写程序都是不用考虑算法了,呵呵~~幸好这个时候写了这个连连看,才回过神来。写这个东西还是花费了我好些精力的,一来自己从没把java跟图片处理合在一起过,二来这个程序中本来就还是要用到些算法的。对于java处理图片还是有些小疑问,到底ImageIcon跟Image是什么样的关系,我从API中看到的是两者都直接继承自Object类,前者处在swing包中,后者处在awt包中。但ImageIcon类中去有个很奇怪的方法getImage(),这个方法的返回类型是Image类型,难道说两者在内部还有什么联系,可以相互转化不成。

        算法部分的话,主要有以下几个地方需要考虑:

1)游戏初始化或者新建一个游戏或者更改游戏的面板大小时都需要重新创建一个游戏,就要考虑图标的初始生成问题,所有的图标都必须是成对出现,而且出现的位置都必须要是随机的,而不能自己指定位置。我不知道专业的方法是什么样的,我采用了hash的思想,随机生成两个位置,然后进行移动查找没有被初始化的位置,貌似效率还可以。

2)选择了两个位置之后,如果进行判断这两个位置是可以的,也就是说它们之间的连线不超过两个转弯。我采用的是BFS,不过有个细节需要注意一下,就是并非每个位置只能访问一次,如果这样限制的话,就会有一个bug。

3)判断游戏是否还可以进行,我个人觉得我这个地方做得不怎么样,效率比较低,我的想法是:从第一个开始,如果这个位置的图标还没有消掉,就找到下一个与这个图标相同的位置,然后判断两者是否可以消掉,如果可以就返回;如果不可以就寻找下一个,待第二个变量到达最后时,再将第一个变量进行移动。这样效率太低了,尤其是游戏进行不下去即找不到可以消掉的图标时。

4)在(3)判断得到不可继续下去的时候,怎样刷新使得游戏可以继续,方法跟初始化时差不多,就是寻找的位置要是有图标的,而不是之前的寻找没有图标的位置。

 

ps:本来计划弄完这个之后就开始用Struts2+Hibernate+JS再把之前做的那个名片管理系统再重新做一次,突然间才发现有好多作业,还有个什么软件文档的课要做一个系统,然后一大堆的文档,有得受了。不过也是个机会,可以试着把这个“书店租赁系统”做成b/s模式,还是可以用那些东西。不过估计会比较难度,因为我JS只是上次上课无聊的时候看了两节课,对这个语言最大的感觉就是它好像起到个“润滑济”的作用。





你可能感兴趣的:(游戏,Hibernate,算法,swing)