我的贪食蛇

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

 


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值