转载请注明出处: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[][]; /** * 蛇身的集合 */ Listpoints = new ArrayList (); 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 therun()
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(); } }