android实现简单贪吃蛇

来源:互联网 发布:淘宝网钢笔彬彬店 编辑:程序博客网 时间:2024/05/17 07:12

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

贪吃蛇的自定义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();    }}

1 0
原创粉丝点击