星 辰 · 第 三 条 约 定

前要:

前两天事情比较多,基本不在家,所以就把贪吃蛇拖到这两天来做了。结果。。。有点蒙圈。

题外话:

1、耦合的不良影响:通俗的讲 

模块一的实现依赖于模块二,更改模块二后,模块一也得更改,那么二者就有耦合。
耦合的类设计降低了代码的维护性

所以要避免耦合的出现!!

正题

 程序的主体主要围绕“蛇”这个对象的属性以及方法进行设计。所以要明确在游戏中这个对象需要有哪些属性以及行为,首先“蛇”有长度以及“蛇”的组成,这就是蛇的属性;其次,蛇能移动(上下左右),能吃食物,并且不能碰到边框以及头部不能触碰自己的身体,这就可以抽象为蛇的三个行为,Move(),IsEatFood(),IsOver,分别为移动,吃食物,检测自身是否满足游戏的规则。

1、贪吃蛇要实现的功能

<1>能上下左右移动(本质是坐标的更新与重新打印  打印目前知道有两种方式 第一种是用二维数组记录然后全部重新打印(这次采用) 第一种是用改变光标位置                                 进行打印,非全部打印) --Move 更新坐标信息

<2>吃到食物身体变长(本质是存放蛇身体的数组增加一个数据) --IsEatFood 吃到时候返回true 没吃到返回false

<3>碰到墙壁或身体游戏结束(本质是对蛇头将到达的下一个坐标进行检测)-----IsOver 游戏结束返回true 没结束返回false

2、游戏逻辑 

第一步:绘制地图边界,蛇,食物(初始化地图边界,蛇,食物等对象)

第二步: 一个0.1秒执行一次的功能块1

   功能块1包括:<1>打印地图边界,蛇,食物

                       <2>检测是否吃到食物,吃到食物则 增长身体 且 生成新事物 然后蛇根据方向移动一位,没吃到食物则蛇根据方向移动一位

                       <3>判断游戏是否结束

第三步:实时接收用户输入,更改全局变量direction

新学到

1、一个String对象在 堆内存 中创建以后, 就不能被改变了. 请注意String对象的所有方法都不会改变其本身,而是会返回一个新的String对象.

如果我们需要可改变的字符串,则需要使用 StringBuffer 或者 StringBuilder. 否则每次创建一个新String对象的话,就会造成大量的内存浪费,需要耗时来执行垃圾回收。详见http://blog.csdn.net/renfufei/article/details/15815121

2、定时器Timer的使用 

3、

 程序的主体主要“蛇”这个对象的属性以及方法的设计。现在我们想想在游戏中这个对象需要有哪些属性以及行为,首先“蛇”有长度以及“蛇”的组成,这就是蛇的属性,可以由一个相邻的Block类型的集合snakeList来表示;其次,蛇能移动(上下左右),能吃食物,并且不能碰到边框以及头部不能触碰自己的身体,这就可以抽象为蛇的三个行为,Move(),IsEatFood (),IsOver(),分别为移动,吃食物,检测自身是否满足游戏的规则。

原文地址:https://www.cnblogs.com/wshyj/p/6395063.html