接着很久以前的贪吃蛇
2017-06-10 12:40
176 查看
因为前几天有些事情,所以那个贪吃蛇还有部分没有完成,只做到了蛇能够移动的地步。以前的代码
所以今天就让蛇能够吃食物,并且蛇变长。
要实现这个功能主要做的就是判断蛇头的位置以及食物的位置。然后就是在每次刷新时判断一下蛇头的位置是否和食物位置重合,达到吃食物的效果。
判断蛇头的位置,在Node类里面增加方法
// 得到节点的位置 public Rectangle getNodeLocation() { // 就是一个矩形 return new Rectangle(x * PlayGround.BLOCK_SIZE, y * PlayGround.BLOCK_SIZE, PlayGround.BLOCK_SIZE, PlayGround.BLOCK_SIZE); }
同样砖块的位置在Block类中增加
// 得到砖块的位置 public Rectangle getBlockLocation() { return new Rectangle(x * PlayGround.BLOCK_SIZE, y * PlayGround.BLOCK_SIZE, PlayGround.BLOCK_SIZE, PlayGround.BLOCK_SIZE); }
当位置信息都得到后,后面所需要做的就是判断了,所以在Playground的类中的paint方法中增加一个判断蛇是否吃了果子
snake.eat(map);// 蛇是否吃到了果子
所以在Snake类中需要有一个判读是否吃到map中的果子的方法,而这个方法主要就是把头的位置与map中所有标记为egg的block比较如果成功,则蛇addHead();
具体实现如下
public void eat(Map m) { // 看是否吃到了果子 for (int i = 0; i < m.block.size(); i++) { Block b = m.block.get(i); // 看蛇的头的位置是否和果子在一个位置 if (b.getMark() == Mark.Egg && this.head.getNodeLocation().intersects(b.getBlockLocation())) { m.block.set(i, new Block(b.getX(), b.getY(), Mark.Block)); // 并且长度增加 this.addHead(); } } }
这个地方我把吃掉的蛋又变成了一个障碍物(m.block.set(i, new Block(b.getX(), b.getY(), Mark.Block));),也可以remove都可以。
到此一个简单的贪吃蛇就完成了,其中还缺一个判断边界,这个与判断吃蛋是一样的,只不过一个结局是长度++,一个是gameOver,所以就不再累述。
结果图