zoukankan      html  css  js  c++  java
  • 是男人就下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



  • 相关阅读:
    [转]Java compiler level does not match解决方法
    Ubuntu使用MyEclipse闪退的解决办法
    支付宝AR红包引出Python中的PIL小试
    Neural Style学习3——操作
    Neural Style学习2——环境安装
    Neural Style学习1——简介
    mac下需要安装旧 Java SE 6 才能打开程序解决办法
    Linux system 函数的一些注意事项
    关于在android 4.2.2 上运行runlmbench
    linux kernel 字符设备详解
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468864.html
Copyright © 2011-2022 走看看