`
totoxian
  • 浏览: 1034753 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

高效率的贪吃蛇-Java实现

 
阅读更多

1.原因

前面写过一篇有关贪吃蛇实现的小文《完全用链表实现的贪吃蛇》,其实现得很统一,几乎完全用链表实现了所有的元素,然而其效率不甚高。该实现虽然津津乐道于没有使用二维数组,然而却大量使用链表,实际上是将二维数组的双for循环换成了大量链表的遍历,虽然由于受到游戏面板长度宽度的限制,算法时间复杂度不会到O(N),但效率仍不敢恭维。
经由验证考研,网上朋友的指点,加之自己的思考,今天重新实现了一版,去除了上一版的“抽象但无用”的“统一于链表”的思想,更多的融入了OO的思想以及一些优化,通篇没有一次遍历整个链表。

2.保留的链表以及更改的数据结构

虽然这一版声明不再使用链表,然而做事不能太极端,我还是保留了freelist链表,因为这在生成食物以及随机障碍物的时候十分有用,否则就要通过下面的算法进行了:

在长蛇阵的情况下,循环次数将增加。另外保留了deltalist,该链表指示了“哪些位置需要重画”,具体怎么重画和该位置的type属性有关,这就需要更改数据结构。该版贪吃蛇对数据结构进行了大量的封装,访问数据必须通过get/set方法进行,对position类进行了扩充,增加了type位属性,对snake进行了整体封装,不再将蛇链表导入Game_pad中,对于蛇的移动,取消了拐点链表,而是直接将蛇尾删除加入蛇头。

3.代码


这个版本的蛇跑起来的话,CPU利用率大大降低,比完全链表版的提高不少,比完全二维数组版的效率提高更多,虽然完全链表版的理解起来更直观,然而此版本的程序CPU执行起来更轻松,孰重孰轻,还是自己权衡。

这是一个真正可玩的版本,然而到此我就再也做不下去了,GUI不是我所长,设计加分/计分/排名逻辑也非我所好,就此打住了,不过我深深知道,这种性格是一个人生致命的缺陷
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics