我的贪食蛇
来源:互联网 发布:如何做一名淘宝客 编辑:程序博客网 时间: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这些,我画的不是很好
如果有人对我的贪食蛇感兴趣,欢迎点击
点击打开链接
- 我的贪食蛇
- 我写的Javascript贪食蛇v1
- 我写的贪食蛇--Dos环境下
- 贪食蛇的程序
- 贪食蛇的程序
- 简单的贪食蛇
- 贪食蛇游戏的设计
- 代码最少的贪食蛇
- Javascript做的贪食蛇
- C语言版贪食蛇游戏源代码(我自己写的)
- 贪食蛇
- 贪食蛇
- 贪食蛇
- 贪食蛇
- 贪食蛇
- 贪食蛇
- 贪食蛇
- 贪食蛇
- Shell Test命令参数解析
- java 基本原理 积累
- iphone镜子反射效果
- Shell 脚本小常识1
- QS0001-2012 瞿氏标准(Qu's Standards)编号规范
- 我的贪食蛇
- android.view.WindowLeaked: Activity com.android.browser.AddBookmarkPage has leaked window com.androi
- 选择排序
- 怎样才是有效沟通
- eclipse 显示 空格 .回车符号,去掉相应的符号
- ORACLE 空间维护
- storm 进程自动关闭 fail-fast 使用daemontools 进行管理
- 为什么要提高肢体语言能力
- windows下使用Escript