Android貪食蛇-版本1.1(準系統實現版)

來源:互聯網
上載者:User

先說說所有的檔案

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;// 一個方格像素為20public 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;@Overridepublic 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();}@Overridepublic 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;}@Overrideprotected 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);}@Overrideprotected 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();// 更新頁面}@Overridepublic 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);}}

至此,我們的程式就完成了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.