附录1.SnakeView类
package com.example.android_snake.view;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import com.example.android_snake.R;
import com.example.android_snake.food.Food;
import com.example.android_snake.snake.Body;
import com.example.android_snake.snake.Head;
import com.example.android_snake.snake.Snake;
import com.example.android_snake.snake.SnakeDirection; import com.example.android_snake.stone.Stone;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewManager;
import android.view.WindowManager;
import android.widget.Toast;
public class SnakeView extends View {
private Context context;
private Bitmap headBitmap;
private Bitmap bodyBitmap;
private Bitmap foodBitmap;
private Bitmap stoneBitmap;
// 屏幕的高度和宽度
private int screenHeight;
private int screenWidth;
// 每个小格子的高度和宽度
private int eachHeight;
private int eachWidth;
private Snake snake;
private Food food;
private Stone stone;
private int [] listx;
private int [] listy;
private Timer timer = new Timer();
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
moveSnake();
invalidate();
}
};
public SnakeView(Context context) {
super(context);
this.context = context;
listx =new int[100];
listy =new int[100];
// 获得屏幕的高和宽
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
screenHeight = metrics.heightPixels;
screenWidth = metrics.widthPixels;
eachHeight = screenHeight / 32;
eachWidth = screenWidth / 20;
// 初始化图片
headBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.head);
bodyBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.body);
foodBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.food);
stoneBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.stone);
this.initSnake();
this.initFood();
this.initstone();
gameRun();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();// 定义画笔
paint.setColor(Color.GRAY);// 设置画笔颜色
paint.setAntiAlias(true);// 去除锯齿
paint.setStyle(Style.STROKE);// 设置空心实心
paint.setTextSize(40);
drawLines(canvas, paint);
drawStone(canvas, paint);
if(isCollide()){
canvas.drawText("Game Over!", screenWidth/4, screenHeight/3, paint);
canvas.drawText("得分", screenWidth/4, screenHeight/2, paint);
timer.cancel();
}else{
this.drawSnake(canvas, paint);
}
boolean flag = IsRectCollision(snake.getHead().getPointX(), snake
.getHead().getPointY(), eachWidth, eachHeight,
food.getPointX(), food.getPointY(), eachWidth, eachHeight);
if (flag) {
food = null;
snake.getBodyList().add(new Body());
this.initFood();
this.initstone();
} else {
this.drawFood(canvas, paint);
this.drawStone(canvas, paint);
}
}
//方向控制
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
SnakeDirection nowDir = snake.getSnakeDirection();
int m = -screenHeight * x + screenHeight * screenWidth - screenWidth * y;
int n = screenHeight * x - screenWidth * y;
if ((m > 0 && n > 0) && (nowDir != SnakeDirection.DOWN)) {
snake.setSnakeDirection(SnakeDirection.UP);
} else if ((m > 0 && n < 0) && (nowDir != SnakeDirection.RIGHT)) { snake.setSnakeDirection(SnakeDirection.LEFT);
} else if ((m < 0 && n > 0) && (nowDir != SnakeDirection.LEFT)) { snake.setSnakeDirection(SnakeDirection.RIGHT);
} else if ((m < 0 && n < 0) && (nowDir != SnakeDirection.UP)) { snake.setSnakeDirection(SnakeDirection.DOWN);
}
return super.onTouchEvent(event);
}
public void gameRun() {
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
handler.obtainMessage().sendToTarget();
}
}, 100, 400);
}
/*
* 画网格线
*/
public void drawLines(Canvas canvas, Paint paint) {
int startX = 0, startY = 0;
for (int i = 0; i < 100; i++) {
canvas.drawLine(0, startY, screenWidth, startY, paint);
startY = startY + eachHeight;
}
for (int i = 0; i < 100; i++) {
canvas.drawLine(startX, 0, startX, screenHeight, paint);
startX = startX + eachWidth;
}
canvas.drawLine(0, 0, screenWidth, screenHeight, paint);
canvas.drawLine(0, screenHeight, screenWidth, 0, paint);
}
// 初始化蛇
public void initSnake() {
List bodies = new ArrayList();
Head head = new Head(eachWidth * 4, eachHeight * 2, headBitmap);
Body body1 = new Body(eachWidth * 3, eachHeight * 2, bodyBitmap);
Body body2 = new Body(eachWidth * 2, eachHeight * 2, bodyBitmap);
Body body3 = new Body(eachWidth * 1, eachHeight * 2, bodyBitmap);
Body body4 = new Body(eachWidth * 0, eachHeight * 2, bodyBitmap);
bodies.add(body1);
bodies.add(body2);
bodies.add(body3);
bodies.add(body4);
snake = new Snake(head, bodies, SnakeDirection.RIGHT);
}
// 画蛇
public void drawSnake(Canvas canvas, Paint paint) {
canvas.drawBitmap(headBitmap, snake.getHead().getPointX(), snake .getHead().getPointY(), paint);
for (int i = 0; i < snake.getBodyList().size(); i++) {
canvas.drawBitmap(bodyBitmap, snake.getBodyList().get(i)
.getPointX(), snake.getBodyList().get(i).getPointY(), paint);
}
}
// 改变蛇身的位置
public void changSnakePosition(int pointX, int pointY) {
for (int i = snake.getBodyList().size() - 1; i > 0; i--) {
snake.getBodyList().get(i)
.setPointX(snake.getBodyList().get(i - 1).getPointX());
snake.getBodyList().get(i)
.setPointY(snake.getBodyList().get(i - 1).getPointY());
}
snake.getBodyList().get(0).setPointX(snake.getHead().getPointX());
snake.getBodyList().get(0).setPointY(snake.getHead().getPointY());
}
// 移动蛇
public void moveSnake() {
int nowPointX = snake.getHead().getPointX();
int nowPointY = snake.getHead().getPointY();
if (snake.getSnakeDirection() == SnakeDirection.RIGHT) {
changSnakePosition(nowPointX, nowPointY);
if (nowPointX >= screenWidth - eachWidth) {
snake.getHead().setPointX(0);
} else {
snake.getHead().setPointX(nowPointX + eachWidth);
}
} else if (snake.getSnakeDirection() == SnakeDirection.DOWN) { changSnakePosition(nowPointX, nowPointY);
if (nowPointY >= screenHeight - eachHeight) {
snake.getHead().setPointY(0);
} else {
snake.getHead().setPointY(nowPointY + eachHeight);
}
} else if (snake.getSnakeDirection() == SnakeDirection.LEFT) {
changSnakePosition(nowPointX, nowPointY);
if (nowPointX <= 0) {
snake.getHead().setPointX(screenWidth - eachWidth);
} else {
snake.getHead().setPointX(nowPointX - eachWidth);
}
} else if (snake.getSnakeDirection() == SnakeDirection.UP) {
changSnakePosition(nowPointX, nowPointY);
if (nowPointY <= 0) {
继续阅读
本文档为【贪吃蛇游戏安卓源代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。