先说说所有的文件
DesktopView.java是地图文件,用来画出桌面的文件
Food.java食物类文件
Rock.java石头类文件
Snake.java蛇类文件
SnakeActivity.java主要Activity
SnakeView.java画出蛇的文件
事先声明,这个程序只是实现了最简单的功能,下面是界面。
好了,开始放代码。
package mars.com; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.WindowManager; public class SnakeActivity extends Activity { public static final int CELL = 20;// 一个方格像素为20 public static WindowManager windowManager; public static int SCREEN_WIDTH;// 屏幕宽度 public static int SCREEN_HEIGHT;// 屏幕高度 public static int NUMBER;// 横向个数 SnakeView snakeView; Snake snake; Food food; Rock rock; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.initVars(); snake = new Snake(); food = new Food(); rock = new Rock(); snakeView = new SnakeView(getApplicationContext(), snake, food, rock); snakeView.setFocusable(true); setContentView(snakeView); snake.start(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: finish(); System.exit(0); break; } return super.onKeyDown(keyCode, event); } private void initVars() { windowManager = SnakeActivity.this.getWindowManager(); SCREEN_HEIGHT = windowManager.getDefaultDisplay().getHeight(); SCREEN_WIDTH = windowManager.getDefaultDisplay().getWidth(); NUMBER = SCREEN_WIDTH / CELL; } }
Snake类文件
package mars.com; import java.util.ArrayList; import java.util.LinkedList; 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.graphics.Point; public class Snake { // 方向按钮 public static final int UP = 1; public static final int DOWN = -1; public static final int LEFT = -2; public static final int RIGHT = 2; public static int oldDirection = RIGHT; public static int newDirection = RIGHT; public static LinkedList<Point> snakeBody = new LinkedList<Point>(); private Point snakeTail; private boolean LIFE = true; public Snake() { int x = SnakeActivity.NUMBER / 2; int y = SnakeActivity.NUMBER / 2; for (int i = 0; i < 3; i++) { snakeBody.add(new Point(x--, y)); } } public int getSpeed() { return -20 * snakeBody.size();// 返回的是负的时间,身体越长,剩余的时间越短,运动越快 } public void eatRock(Rock rock) { ArrayList<Point> rocks = rock.getRocks(); for (int i = 0; i < 3; i++) { if (snakeBody.getFirst().equals(rocks.get(i))) { LIFE = false; break; } } } public void eatWall() { if (snakeBody.getFirst().x < 0 || snakeBody.getFirst().y < 0 || snakeBody.getFirst().x == SnakeActivity.NUMBER || snakeBody.getFirst().y == SnakeActivity.NUMBER) { LIFE = false; } } public void eatFood(Food food, Rock rock) { if (snakeBody.getFirst().equals(food.eatFood())) { snakeBody.addLast(snakeTail); food.createFood(); rock.createRocks(); } } public void eatHimself() { for (int i = 1; i < snakeBody.size(); i++) { if (snakeBody.get(i).equals(snakeBody.getFirst())) { LIFE = false; break; } } } public void move() { snakeTail = snakeBody.getLast(); Point headPoint = snakeBody.getFirst(); Point point = new Point(); // 如果新方向和老方向在一条直线上 if (oldDirection == newDirection || oldDirection + newDirection == 0) { if (oldDirection == UP) { point.set(headPoint.x, headPoint.y - 1); } else if (oldDirection == DOWN) { point.set(headPoint.x, headPoint.y + 1); } else if (oldDirection == LEFT) { point.set(headPoint.x - 1, headPoint.y); } else if (oldDirection == RIGHT) { point.set(headPoint.x + 1, headPoint.y); } snakeBody.addFirst(point); snakeBody.removeLast(); return; } // 如果没有在一条直线上,进行拐弯 switch (newDirection) { case UP: point.set(headPoint.x, headPoint.y - 1); break; case DOWN: point.set(headPoint.x, headPoint.y + 1); break; case LEFT: point.set(headPoint.x - 1, headPoint.y); break; case RIGHT: point.set(headPoint.x + 1, headPoint.y); break; } oldDirection = newDirection; snakeBody.addFirst(point); snakeBody.removeLast(); } class Tsnake implements Runnable { public void run() { while (LIFE) { move(); try { Thread.sleep(500 + getSpeed()); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void start() { new Thread(new Tsnake()).start(); } public void display(Canvas canvas, Context context) { Paint paint = new Paint(); paint.setColor(Color.BLUE); paint.setStyle(Style.FILL); for (int i = 0; i < snakeBody.size(); i++) { int x = snakeBody.get(i).x * SnakeActivity.CELL; int y = snakeBody.get(i).y * SnakeActivity.CELL; canvas.drawRect(x, y, x + SnakeActivity.CELL, y + SnakeActivity.CELL, paint); } paint.setColor(Color.RED); if (LIFE == false) { Bitmap image = BitmapFactory.decodeStream(context.getResources() .openRawResource(R.drawable.fail)); canvas.drawBitmap(image, 200, 200, paint); } } }
SnakeView类文件
package mars.com; import android.content.Context; import android.graphics.Canvas; public class SnakeView extends DesktopView { private Snake snake; private Food food; private Rock rock; private Context context; public SnakeView(Context context, Snake snake, Food food, Rock rock) { super(context); this.snake = snake; this.food = food; this.rock = rock; this.context = context; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); snake.display(canvas, context); food.display(canvas); rock.display(canvas); snake.eatFood(food, rock); snake.eatRock(rock); snake.eatHimself(); snake.eatWall(); } }
石头类文件
package mars.com; import java.util.ArrayList; import java.util.Random; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Point; public class Rock { public static ArrayList<Point> rocks = new ArrayList<Point>(); public int OK = 0; private Point p; public Rock() { init(); } public void init() { rocks = new ArrayList<Point>(); for (int i = 0; i < 3; i++) { p = new Point(); p.x = new Random().nextInt(SnakeActivity.NUMBER); p.y = new Random().nextInt(SnakeActivity.NUMBER); if (rocks.contains(p) == true || Snake.snakeBody.contains(p) == true) { i--; } else { rocks.add(p); } } } public void createRocks() { init(); } public ArrayList<Point> getRocks() { return rocks; } public void display(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Style.FILL); for (int i = 0; i < 3; i++) { int x = rocks.get(i).x * SnakeActivity.CELL; int y = rocks.get(i).y * SnakeActivity.CELL; canvas.drawRect(x, y, x + SnakeActivity.CELL, y + SnakeActivity.CELL, paint); } } }
Food类文件
package mars.com; import java.util.Random; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Point; public class Food { private Point p = new Point(); public Food() { init(); } public Point eatFood() { return p; } public void init() { while (true) { p.x = new Random().nextInt(SnakeActivity.NUMBER); p.y = new Random().nextInt(SnakeActivity.NUMBER); if (Snake.snakeBody.contains(p) == false) {// 如果不包含就跳出循环 break; } } } public void createFood() { init(); } public void display(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.BLUE); paint.setStyle(Style.FILL); canvas.drawRect(p.x * SnakeActivity.CELL, p.y * SnakeActivity.CELL, (p.x + 1) * SnakeActivity.CELL, (p.y + 1) * SnakeActivity.CELL, paint); } }
桌面类文件
package mars.com; 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.view.MotionEvent; import android.view.View; public class DesktopView extends View { private int width; private int height; public DesktopView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE);// 为画布设置颜色 canvas.setViewport(SnakeActivity.SCREEN_WIDTH, SnakeActivity.SCREEN_WIDTH); Paint paint = new Paint(); paint.setColor(Color.BLUE); // 画横线 for (int i = 0; i <= SnakeActivity.NUMBER; i++) canvas.drawLine(i * SnakeActivity.CELL, 0, i * SnakeActivity.CELL, SnakeActivity.CELL * SnakeActivity.NUMBER, paint); // 画竖线 for (int i = 0; i <= SnakeActivity.NUMBER; i++) canvas.drawLine(0, i * SnakeActivity.CELL, SnakeActivity.CELL * SnakeActivity.NUMBER, i * SnakeActivity.CELL, paint); // 开始画按钮 paint.setColor(Color.GRAY); int x = 0; int y = SnakeActivity.SCREEN_WIDTH; width = SnakeActivity.SCREEN_WIDTH / 7; height = (SnakeActivity.SCREEN_HEIGHT - SnakeActivity.SCREEN_WIDTH) / 5; Bitmap image = BitmapFactory.decodeStream(getResources() .openRawResource(R.drawable.left)); canvas.drawBitmap(image, x + width * 3, y + height * 2, paint); image = BitmapFactory.decodeStream(getResources().openRawResource( R.drawable.right)); canvas.drawBitmap(image, x + width * 5, y + height * 2, paint); image = BitmapFactory.decodeStream(getResources().openRawResource( R.drawable.up)); canvas.drawBitmap(image, x + width * 4, y + height * 1, paint); image = BitmapFactory.decodeStream(getResources().openRawResource( R.drawable.down)); canvas.drawBitmap(image, x + width * 4, y + height * 3, paint); postInvalidate();// 更新页面 } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); Bitmap image = BitmapFactory.decodeStream(getResources() .openRawResource(R.drawable.left)); int imageX = image.getWidth(); int imageY = image.getHeight(); // 如果按向上键 if (x > 4 * width && x < 4 * width + imageX && y > height + SnakeActivity.SCREEN_WIDTH && y < imageY + height + SnakeActivity.SCREEN_WIDTH) { System.out.println("***上"); Snake.newDirection = Snake.UP; } // 如果是向下键 if (x > 4 * width && x < 4 * width + imageX && y > 3 * height + SnakeActivity.SCREEN_WIDTH && y < imageY + 3 * height + SnakeActivity.SCREEN_WIDTH) { System.out.println("***下"); Snake.newDirection = Snake.DOWN; } // 如果是左键 if (x > 3 * width && x < 3 * width + imageX && y > 2 * height + SnakeActivity.SCREEN_WIDTH && y < imageY + 2 * height + SnakeActivity.SCREEN_WIDTH) { System.out.println("***左"); Snake.newDirection = Snake.LEFT; } // 如果是右键 if (x > 5 * width && x < 5 * width + imageX && y > 2 * height + SnakeActivity.SCREEN_WIDTH && y < imageY + 2 * height + SnakeActivity.SCREEN_WIDTH) { System.out.println("***右"); Snake.newDirection = Snake.RIGHT; } return super.onTouchEvent(event); } }
至此,我们的程序就完成了。