您的位置:首页 > 移动开发 > Android开发

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

2016-09-24 19:00 603 查看
转载请注明出处: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) {

/**
* 地图数组的初始化,只初执行一次

4000
*/
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*snakeW
d64b
idth,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();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: