闲来无事就想写个游戏来耍耍。想来想去,就计划写个贪吃蛇。开始的时候不知道怎么下手,自己也不想上网用别人的代码,后来不断地翻书。终于让我找到了一个好方法,那就是自己绘画贪吃蛇和食物。
下面就是我具体代码的分析。
主要代码有分布在三个类中:
1、Point类:记录蛇身位置(左上角和右下角坐标)。
2、Snake类:负责画蛇身和食物。
3、MySnakeView类:继承于View,并且处理逻辑。
主要思维:
1、游戏蛇身和食物位置的产生和判断:首先初始化的的蛇身方块放到另一个一个list表snake中,然后将屏幕上蛇身能够经过的方块位置放在一个表中(去除蛇身自方块,也就是snake表中的蛇身方块),以便于在不是蛇身位置产生食物。
2、蛇身的移动:在新线程中设置移动速度,不断地在画布上画相关内容,移动逻辑是上一个蛇身方块不断替换下一个蛇身方块,从而达到移动效果。
3、碰撞检测:检测是否触碰到屏幕边缘,和吃到自己。
好了,下面就是代码了。
一、Point类:
package com.example.mysnakegame;
public class Point {
//方块左上角坐标,右下角坐标
private float snakeX,snakeY,snakeBottomX,snakeBottomY;
public Point(float snakeX,float snakeY,float snakeBottomX,float snakeBottomY,
boolean isSnake,boolean isFood){
this.snakeX = snakeX;//左上角X
this.snakeY = snakeY;//左上角Y
this.snakeBottomX = snakeBottomX;//右下角X
this.snakeBottomY = snakeBottomY;//右下角Y
}
public float getSnakeX() {
return snakeX;
}
public float getSnakeY() {
return snakeY;
}
public float getSnakeBottomX() {
return snakeBottomX;
}
public float getSnakeBottomY() {
return snakeBottomY;
}
public boolean isEqualSnake(Snake snake){
//判断两个方块是否相同
boolean flag = false;
if (Math.abs(snake.getSnakeX()-this.snakeX)<1e-4&&
Math.abs(snake.getSnakeY()-this.snakeY)<1e-4&&
Math.abs(snake.getSnakeBottomX()-this.snakeBottomX)<1e-4&&
Math.abs(snake.getSnakeBottomY()-this.snakeBottomY)<1e-4
) {
flag = true;
}
return flag;
}
}
二、Snake类:
package com.example.mysnakegame;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
public class Snake {
//画蛇身方块
float snakeX,snakeY,snakeBottomX,snakeBottomY,moveDistance;//蛇身方块的左上角坐标
private Paint paint;
private boolean isHead;
public Snake(){
snakeX = 0;
snakeY = 0;
snakeBottomX = 0;
snakeBottomY = 0;
moveDistance = 0;
isHead = false;
paint = new Paint();
paint.setColor(Color.GRAY);
}
public void setParameter(float snakeX,float snakeY,float snakeBottomX,
float snakeBottomY,float moveDistance){
//设置蛇身方块的位置参数
this.snakeX = snakeX;
this.snakeY = snakeY;
this.snakeBottomX = snakeBottomX;
this.snakeBottomY = snakeBottomY;
this.mo