是男人就下100层【第四层】——Crazy贪吃蛇(三)

是男人就下100层【第四层】——Crazy贪吃蛇(3)

上一篇《 是男人就下100层【第四层】——Crazy贪吃蛇(2)》实现了贪吃蛇绕着屏幕四周移动,这一篇我们来完成贪吃蛇的所有功能。

一、随机产生苹果

    private void addAppleBox(){
    	int randomX = random.nextInt(xMaxBoxCount);
        int randomY = random.nextInt(yMaxBoxCount);
        for(int i=0; i<boxs.size(); i++){
        	if(boxs.get(i).getX() == randomX){
        		addAppleBox();
        		break;
        	}
        	if(boxs.get(i).getY() == randomY){
        		addAppleBox();
        		break;
        	}
        	appleBox = new Box(randomX, randomY);
        }	
    }

二、判断边界值

        //判断是否撞墙了
        if(headBox.getX() < 0 || headBox.getY() < 0 || 
        		headBox.getX() > xMaxBoxCount || headBox.getY() > yMaxBoxCount){
        	currentState = State.LOSE;
        }
        
        //判断是否装到自己身上了
        for(int i=0; i<boxs.size(); i++){
        	if(boxs.get(i).getX() == headBox.getX() && 
        			boxs.get(i).getY() == headBox.getY()){
        		currentState = State.LOSE;
        	}
        }
        
        isGroup = false;
        //判断是否吃到苹果了~~
        for(int i=0; i<boxs.size(); i++){
        	if(boxs.get(i).getX() == appleBox.getX() && 
        			boxs.get(i).getY() == appleBox.getY()){
        		isGroup = true;
        		addAppleBox();
        	}
        }

三、全部代码

package com.example.crazysnake;  
  
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
 * CSDN博客:http://blog.csdn.net/dawanganban
 * @author 阳光小强
 */
public class MySnake extends View {  
    private Paint paint; 
    private Paint textPaint;
    private RectF rect;  
      
    private static int boxSize = 20;  
    
	private static int xMaxBoxCount;  //x轴方向最多的box数量
	private static int yMaxBoxCount;  //y轴方向最多的box数量
      
    private List<Box> boxs = new ArrayList<Box>(); 
    
    private Box appleBox;
    private Random random;
    
    private boolean isGroup = false;
      
    private static final int[] colors = {  
        Color.RED,  
        Color.BLUE,   
        Color.GRAY,  
        Color.YELLOW  
    };  
      
    private enum Derectory{  
        LEFT,  
        RIGHT,  
        TOP,  
        BOTTOM;  
    }  
    
    private enum State{
    	READY,    //就绪
    	PAUSE,    //暂停
    	RUNNING,  //运行
    	LOSE      //失败
    }
      
    private Derectory currentDerect = Derectory.LEFT;  
    private State currentState = State.READY;
    
    private RefreshHandler mRefreshHandler = new RefreshHandler();
    class RefreshHandler extends Handler{
    	@Override
    	public void handleMessage(Message msg) {
    		MySnake.this.update();
    		MySnake.this.invalidate();
    		
    	}
    	
    	public void sleep(long delayMillis) {
			this.removeMessages(0);
			sendMessageDelayed(obtainMessage(0), delayMillis);
		}
    }
    
    public MySnake(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        paint = new Paint(); 
        textPaint = new Paint();
        textPaint.setColor(Color.RED);
        textPaint.setTextSize(60);
        rect = new RectF(); 
        random = new Random();  
    }  

    private void update(){
    	if(currentState == State.RUNNING){
			move();
			mRefreshHandler.sleep(150);
    	}
    }
      
    private void initData(){  
        Box box;  
        for(int i=xMaxBoxCount - 5; i<xMaxBoxCount; i++){  
            box = new Box(i, 3);  
            boxs.add(box);  
        }  
    }  
    
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    	super.onSizeChanged(w, h, oldw, oldh);
    	xMaxBoxCount = (int) Math.floor(w / boxSize);
		yMaxBoxCount = (int) Math.floor(h / boxSize);
    }
      
    private float mDownX;  
    private float mDownY;  
    @Override  
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("onTouch");  
        switch (event.getAction()) {  
        case MotionEvent.ACTION_DOWN:  
            mDownX = event.getX();  
            mDownY = event.getY();  
            break;  
        case MotionEvent.ACTION_UP:  
            float disX = event.getX() - mDownX;  
            float disY = event.getY() - mDownY;  
            System.out.println("disX = " + disX);  
            System.out.println("dixY = " + disY);  
            if(Math.abs(disX) > Math.abs(disY)){  
                if(disX > 0){  
                	if(currentDerect != Derectory.LEFT){
                		currentDerect = Derectory.RIGHT;  
                	}
                }else{  
                	if(currentState != State.RUNNING){
                		currentState = State.RUNNING;
                		currentDerect = Derectory.LEFT;
                		boxs.clear();
                		initData();
                		addAppleBox();
                		update();
                	}else if(currentDerect != Derectory.RIGHT){		
                		currentDerect = Derectory.LEFT;  
                	}
                }  
            }else{  
                if(disY > 0){  
                	if(currentDerect != Derectory.TOP){
                		currentDerect = Derectory.BOTTOM;  
                	}
                }else{ 
                	if(currentDerect != Derectory.BOTTOM){
                		currentDerect = Derectory.TOP;  
                	}
                }  
            }  
            break;  
        }  
        return true;  
    }  
    
    private void move(){  
        Box headBox = new Box(0, 0);  
        switch (currentDerect) {
        case LEFT:  
        	headBox = new Box(boxs.get(0).getX() - 1, boxs.get(0).getY());
            break;  
        case RIGHT:  
            headBox = new Box(boxs.get(0).getX() + 1, boxs.get(0).getY());  
            break;  
        case TOP:  
        	headBox = new Box(boxs.get(0).getX(), boxs.get(0).getY() - 1); 
            break;  
        case BOTTOM:  
        	headBox = new Box(boxs.get(0).getX(), boxs.get(0).getY() + 1);
            break;  
        } 
        
        //判断是否撞墙了
        if(headBox.getX() < 0 || headBox.getY() < 0 || 
        		headBox.getX() > xMaxBoxCount || headBox.getY() > yMaxBoxCount){
        	currentState = State.LOSE;
        }
        
        //判断是否装到自己身上了
        for(int i=0; i<boxs.size(); i++){
        	if(boxs.get(i).getX() == headBox.getX() && 
        			boxs.get(i).getY() == headBox.getY()){
        		currentState = State.LOSE;
        	}
        }
        
        isGroup = false;
        //判断是否吃到苹果了~~
        for(int i=0; i<boxs.size(); i++){
        	if(boxs.get(i).getX() == appleBox.getX() && 
        			boxs.get(i).getY() == appleBox.getY()){
        		isGroup = true;
        		addAppleBox();
        	}
        }
        
        boxs.add(0, headBox);
        if(!isGroup){
        	boxs.remove(boxs.size() - 1);
        }
    }  
    
    private void addAppleBox(){
    	int randomX = random.nextInt(xMaxBoxCount);
        int randomY = random.nextInt(yMaxBoxCount);
        for(int i=0; i<boxs.size(); i++){
        	if(boxs.get(i).getX() == randomX){
        		addAppleBox();
        		break;
        	}
        	if(boxs.get(i).getY() == randomY){
        		addAppleBox();
        		break;
        	}
        	appleBox = new Box(randomX, randomY);
        }	
    }
  
    @Override  
    protected void onDraw(Canvas canvas) {  
        super.onDraw(canvas);  
        for(int i=0; i<boxs.size(); i++){  
            paint.setColor(colors[i % colors.length]);  
            rect.set(boxs.get(i).getX() * boxSize, boxs.get(i).getY() * boxSize, 
            		(boxs.get(i).getX() + 1) * boxSize, (boxs.get(i).getY() + 1) * boxSize);  
            canvas.drawRect(rect, paint);  
        } 
        
        if(appleBox != null){
	        paint.setColor(Color.RED);
	        rect.set(appleBox.getX() * boxSize, appleBox.getY() * boxSize, 
	        		(appleBox.getX() + 1) * boxSize, (appleBox.getY() + 1) * boxSize);
	        canvas.drawRect(rect, paint);
        }
        
        if(currentState == State.READY){
        	canvas.drawText("请向左滑动", (xMaxBoxCount * boxSize - textPaint.measureText("请向左滑动")) / 2,
        			xMaxBoxCount * boxSize / 2, textPaint);
        }
        
        if(currentState == State.LOSE){
        	canvas.drawText("失败!左滑继续", (xMaxBoxCount * boxSize - textPaint.measureText("失败!左滑继续")) / 2,
        			(float)xMaxBoxCount * boxSize / 2, textPaint);
        	canvas.drawText("长度:" + boxs.size() , (xMaxBoxCount * boxSize - textPaint.measureText("长度:" + boxs.size())) / 2,
        			(float)xMaxBoxCount * boxSize / 4 * 3, textPaint);
        }
    }  
}


CODE代码地址:https://code.csdn.net/lxq_xsyu/crazysnake