贪吃蛇游戏安卓源代码

  • 格式:docx
  • 大小:21.14 KB
  • 文档页数:19

贪吃蛇游戏安卓源代码

附录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();

}