我的贪食蛇

来源:互联网 发布:如何做一名淘宝客 编辑:程序博客网 时间:2024/04/28 18:08

前几天我写出了一个贪食蛇游戏,对我而言是我的第一个比较拿得出手的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这些,我画的不是很好

 

如果有人对我的贪食蛇感兴趣,欢迎点击

点击打开链接

 


 

原创粉丝点击