android 自定义view 实现简单贪吃蛇


转载请注明出处:http://blog.csdn.net/qq_35071078/article/details/52652767

本人萌新,网上的一些视频教学看的太无聊了,所以决定自己找点事情做,今天花了几个小时,写了一个贪吃蛇游戏,虽然界面很丑,但是一些功能还是有的偷笑,下面奉上我的源码,还请大神多多指教啊。

贪吃蛇的自定义view:

package com.tanchishe;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Created by smartlab on 16/9/24.
 */
public class TanChiSheView extends View {

    /**
     * 点击事件的action
     */
    int mAction;

    /**
     * 点击的屏幕坐标
     */
    int currentX;
    int currentY;

    /**
     * 画笔
     */
    Paint paint;

    /**
     * 判断苹果是否被吃掉
     */
    boolean appleIsDead =true;

    /**
     * 判断地图数组是否已经初始化
     */
    boolean mapflag = true;

    /**
     * 判断是否初始化蛇身
     */
    boolean initflag = true;

    /**
     * 判断蛇的走向:上,下,左,右
     */
    public boolean MOVE_UP = false;
    public  boolean MOVE_DOWN = false;
    public boolean MOVE_LEFT = true;
    public  boolean MOVE_RIGHT = false;

    /**
     * 从父容器获得的宽高
     */
    float allWidth;
    float allHeight;

    /**
     * 蛇的每一节的宽度
     */
    float snakeWidth;

    /**
     * 地图的长度(屏幕总长除以蛇身)
     */
    int mapHeightNum;

    /**
     * 地图的宽度(屏幕总宽除以蛇身)
     */
    int mapWidthNum;

    /**
     * 地图数组
     */
    int map[][];

    /**
     * 蛇身的集合
     */
    List<Point> points = new ArrayList<Point>();

    public TanChiSheView(Context context) {
        super(context);
    }


    public TanChiSheView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
        paint = new Paint();
    }

    @Override
    protected void onDraw(Canvas canvas) {

        /**
         * 地图数组的初始化,只初执行一次
         */
        if(mapflag){
            map = new int[mapHeightNum][mapWidthNum];
            for(int i = 0;i<mapHeightNum;i++){
                for(int j= 0;j<mapWidthNum;j++){
                    map[i][j] = 0;
                }
            }
            mapflag = false;
        }

        /**
         * 判断苹果是否被吃,吃了之后再进行苹果的刷新
         */
        if (appleIsDead) {
            Random random1 = new Random();
            Random random2 = new Random();
            boolean randomFlag = true;
            int x = 0,y = 0;
            while (randomFlag){
                x = random1.nextInt(mapHeightNum);
                y =random2.nextInt(mapWidthNum);
                for (Point point:points
                     ) {
                    if(point.y == x && point.x == y) {
                    }
                    else
                        randomFlag = false;
                }
            }
            map[x][y] = 1 ;
            appleIsDead = false;
        }

        paint.setAntiAlias(true);
        paint.setColor(getResources().getColor(R.color.red));
        paint.setStrokeWidth(2);
        paint.setStyle(Paint.Style.FILL);

        /**
         * 画苹果
         */
        for (int i = 0; i < mapHeightNum;i++){
            for(int j = 0;j<mapWidthNum;j++){
                if(map[i][j]==1) {
                    paint.setColor(getResources().getColor(R.color.red));
                    canvas.drawRect(j * snakeWidth, i * snakeWidth, j * snakeWidth + snakeWidth, i * snakeWidth + snakeWidth, paint);
                }
                else {
                    paint.setColor(getResources().getColor(R.color.colorPrimaryDark));
                    canvas.drawRect(j * snakeWidth, i * snakeWidth, j * snakeWidth + snakeWidth, i * snakeWidth + snakeWidth, paint);
                }
            }
        }

        /**
         * 判断蛇的走向和是否吃到苹果
         */
        if (MOVE_LEFT){
            Point point = new Point(points.get(0).x-1,points.get(0).y);
            if(map[points.get(0).y][points.get(0).x-1]==0) {
                points.add(0,point);
                points.remove(points.size() - 1);
            }
            else{
                points.add(0,point);
                appleIsDead = true;
                map[points.get(0).y][points.get(0).x]=0;
            }

        }else if(MOVE_RIGHT){
            Point point = new Point(points.get(0).x+1,points.get(0).y);
            if(map[points.get(0).y][points.get(0).x+1]==0) {
                points.add(0,point);
                points.remove(points.size() - 1);
            }
            else{
                points.add(0,point);
                appleIsDead = true;
                map[points.get(0).y][points.get(0).x]=0;
            }

        }else if(MOVE_UP){
            Point point = new Point(points.get(0).x,points.get(0).y-1);
            if(map[points.get(0).y-1][points.get(0).x]==0) {
                points.add(0,point);
                points.remove(points.size() - 1);
            }
            else{
                points.add(0,point);
                appleIsDead = true;
                map[points.get(0).y][points.get(0).x]=0;
            }

        }else if(MOVE_DOWN){
            Point point = new Point(points.get(0).x,points.get(0).y+1);
            if(map[points.get(0).y+1][points.get(0).x]==0) {
                points.add(0,point);
                points.remove(points.size() - 1);
            }
            else{
                points.add(0,point);
                appleIsDead = true;
                map[points.get(0).y][points.get(0).x]=0;
            }
        }

        /**
         * 画蛇
         */
        paint.setColor(getResources().getColor(R.color.colorAccent));
        for (Point point:points
             ) {
            canvas.drawRect(point.x*snakeWidth,point.y*snakeWidth,point.x*snakeWidth+snakeWidth,point.y*snakeWidth+snakeWidth,paint);
            paint.setColor(getResources().getColor(R.color.colorPrimary));
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        allWidth = MeasureSpec.getSize(widthMeasureSpec);
        allHeight = MeasureSpec.getSize(heightMeasureSpec);
        snakeWidth = Math.min(allHeight,allWidth)/40;

        mapHeightNum = (int) (allHeight/snakeWidth);
        mapWidthNum = (int) (allWidth/snakeWidth);

        if(initflag){
            points.add(new Point(mapHeightNum/2,mapWidthNum/2));
            points.add(new Point(mapHeightNum/2+1,mapWidthNum/2));
            points.add(new Point(mapHeightNum/2+2,mapWidthNum/2));

            initflag = false;
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        currentX = (int) ((int) event.getX()/snakeWidth);
        currentY = (int) ((int) event.getY()/snakeWidth);

        mAction = event.getAction();
        switch (mAction){
            case MotionEvent.ACTION_DOWN:
                int x = points.get(0).x;
                int y = points.get(0).y;

                if(MOVE_LEFT||MOVE_RIGHT) {
                    if(currentY < y){
                        allMoveFalse();
                        Log.e("infoo","开始往上");
                        MOVE_UP = true;
                    }
                    else if(currentY > y){
                        allMoveFalse();
                        MOVE_DOWN = true;
                        Log.e("infoo","开始往下");
                    }
                }else if(MOVE_DOWN||MOVE_UP){
                    if(currentX < x){
                        allMoveFalse();
                        MOVE_LEFT = true;
                        Log.e("infoo","开始往左");
                    }
                    else if(currentX > x){
                        allMoveFalse();
                        MOVE_RIGHT = true;
                        Log.e("infoo","开始往右");
                    }
                }
        }
        return super.onTouchEvent(event);
    }

    public void allMoveFalse(){
        MOVE_LEFT = false;
        MOVE_DOWN = false;
        MOVE_RIGHT = false;
        MOVE_UP = false;

    }
}
主界面:
package com.tanchishe;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    TanChiSheView tanChiSheView;
    Handler mHandle = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            tanChiSheView.invalidate();
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tanChiSheView = (TanChiSheView) findViewById(R.id.id_tanchisheview);
        new Thread(){
            /**
             * Calls the <code>run()</code> method of the Runnable object the receiver
             * holds. If no Runnable is set, does nothing.
             *
             * @see Thread#start
             */
            @Override
            public void run() {
                while (true) {
                    mHandle.sendEmptyMessage(1);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值