前几天我写出了一个贪食蛇游戏,对我而言是我的第一个比较拿得出手的java游戏,其实也要感谢网友对我的帮助
这个游戏程序,我觉得难点在于,蛇的移动,蛇改变方向以及蛇身的增长
我最开始写的部分是,食物在界面上随机生成,因为这个类最好写
然后开始写蛇的部分,蛇的方向控制其实只需要控制蛇头的方向就可以了
所以为了降低难度我就先写蛇头,要达到蛇头能通过键盘控制蛇头的运动方向
要注意的地方是蛇不能退着走,也就是说,如果此时蛇头方向向右,你按向左的方向肯定不能改变它的方向,而其他方向都可以
我们可以这样声明关于蛇的方向的变量
/**蛇的方向*/
private int oldDirection=RIGHT;
private int newDirection=LEFT;
/**方向上*/
public static final int UP=1;
/**方向下*/
public static final int DOWN=-1;
/**方向左*/
public static final int LEFT=2;
/**方向右*/
public static final int RIGHT=-2;
然后通过以下的方法实现蛇头的移动(Head指的就是蛇的头部)
/**蛇的运动*/
public void move(){
if(live){
for(int i=body.size()-1;i>=1;i--){
bodyMove(body.get(i-1),body.get(i));
}
switch(oldDirection){
case UP: head.translate(0, -10); break;
case DOWN: head.translate(0, 10); break;
case LEFT: head.translate(-10, 0); break;
case RIGHT: head.translate(10, 0); break;
default: break;
}
}
}
/**改变蛇的运动方向*/
public void changeDirection(){
if(live){
if(oldDirection+newDirection!=0){
oldDirection=newDirection;
}
}
}
真正能控制蛇的方向的是oldDirection,newDirection的作用就在于获取你从键盘的按键所指明的方向
然后跟oldDirection对比,如果不是相反方向,就把newDirection的值赋给oldDirection,
改变oldDirection从而就改变了蛇头的方向
实现了这一步就该考虑蛇身了,同一时刻蛇身的不同点方向很可能都是不同的
有可能蛇头正向上爬,蛇尾正在往下窜,
如果蛇身的每个点的方向我们都要去考虑,那就太麻烦了
其实我们只要知道蛇的爬行方式,就能想到
假如把蛇分成一个一个的节点,后面的一个节点永远是紧跟着前一个节点的,
就像火车一样,一节一节的连起来的
想到这儿,事情就简单了
/**比较两个Point的相对位置,并将后一个Point移动到前一个Point的位置*/
public void bodyMove(Point previous,Point current){
if(current.getX()!=previous.getX()){
int temp=(int) (previous.getX()-current.getX());
current.translate(temp, 0);
}
if(current.getY()!=previous.getY()){
int temp=(int) (previous.getY()-current.getY());
current.translate(0,temp);
}
}
这里写的一个方法,就是后一个节点通过跟前一个节点比较,判断前一个节点相对于后一个节点的方位,
然后让后一个节点移向前一个节点的位置
这样我们只需要一个循环遍历就可以实现蛇身的移动
for(int i=body.size()-1;i>=1;i--){
bodyMove(body.get(i-1),body.get(i));
}
从蛇的尾巴开始遍历一直到蛇头的后一个节点,
这里的每个节点只要乖乖的跟着前面的节点就行了,
只要控制我这个蛇头就可以完成一系列蛇式移动,跟火车一样
另外像检测蛇是否吃到自己比较容易
就遍历整个蛇身(不包括蛇头),每个部分跟蛇头所在位置进行比较
只要相等,就说明追尾了
蛇吃到苹果,身体会增长,这个也很简单
先获取蛇尾的节点,再让蛇先往前动一格,
然后把这个新尾巴添在原来蛇尾巴的位置上(此时原来的尾巴已经移动到前一个位置了)
Point oldTail=s.getTail();
Point newTail=new Point(oldTail.x,oldTail.y);
s.move();
body.add(newTail);
很快贪食蛇的雏形做好了,玩了好几次
我发现我的贪食蛇有个bug(我不知道算不算是),
有的贪食蛇会出现这种局面,蛇吃的果子有时候会出现在蛇身体所在的位置
在我个人看来,这应该是个bug,尽管出现的概率比较低
为此我写了个方法解决这个问题
public void setApple(Snakes s){
boolean flag=false;
do{
ArrayList<Point> body=s.getBody();
int tempX=(int)(Math.random()*22);
int tempY=(int)(Math.random()*22);
p.setLocation(10*tempX, 10*tempY);
for(int i=0;i<body.size();i++){
if(p.equals(body.get(i))){
flag=true;
break;
}
flag=false;
}
}while(flag);
}
这个就是每次随机生成Apple()的位置跟蛇的每个部位比较一下
如果重了,说明将要发生上述情况,那就重设Apple()的位置
再就是GUI这些,我画的不是很好,运行效果如图:
如果有人对我的贪食蛇感兴趣,欢迎点击
源代码下载地址:https://download.csdn.net/download/wangdong20/4035736