制作贪吃蛇
-
基本设计思路
绘制网格制作地图,
控制方向的四个按钮,上下左右,
蛇由蛇身,蛇头组成,—都是大小相同的方块
方块属性----x—y 颜色–可以在绘制的时候添加
蛇上下左右移动xy的变化,
食物的产生,蛇吃食物;
-
需要解决的问题
-
边界处理
蛇头触碰到边界死亡或者穿墙而过,
-
碰到自己
蛇头触碰到自己的身体
-
食物的随机产生
-
吃到食物自身长度增加
-
上下左右移动处理
-
-
方块实体类的创建
写入方块的基本属性,及方法,目前只写了基础属性,方法后续用到再进行书写。
public class BlockUnit { public static final int UNIT_SIZE=50; public static final int BEGIN=10; // public int color; public int x,y; public BlockUnit() { } public BlockUnit( int x, int y) { this.x = x; this.y = y; // this.color = color; }
-
蛇类的创建
设置蛇的基本属性,及颜色,以及获取蛇的方法
public class SnakeBlock { private static final int SnakeSize=7; //private int HandColor,SnakeColo ,x,y; private int x,y; public SnakeBlock() { } public SnakeBlock(int x, int y) { this.x = x; this.y = y; } public List<BlockUnit> getUnit(int x,int y){ this.x=x; this.y=y; return returnSnake(); } private List<BlockUnit> returnSnake() { List<BlockUnit> units=new ArrayList<BlockUnit>(); units.clear(); units.add(new BlockUnit(x-0*BlockUnit.UNIT_SIZE,y+0*BlockUnit.UNIT_SIZE)); units.add(new BlockUnit(x-1*BlockUnit.UNIT_SIZE,y+0*BlockUnit.UNIT_SIZE)); units.add(new BlockUnit(x-2*BlockUnit.UNIT_SIZE,y+0*BlockUnit.UNIT_SIZE)); units.add(new BlockUnit(x-3*BlockUnit.UNIT_SIZE,y+0*BlockUnit.UNIT_SIZE)); return units; } }
-
游戏主界面的设计,与之前设计的俄罗斯方块游戏界面非常类似,首先创建画笔对象,进行初始化,在构造方法中进行画笔的初始化,
先对游戏地图也就是背景画笔初始化,设置画笔颜色,模式或者说类型空心, 当画笔样式为STROKEE时,设置笔刷的粗细度
对蛇画笔进行初始化以及实例化蛇类
public SnakeView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); if (paintWall==null){ //背景画笔初始化 paintWall=new Paint(); paintWall.setColor(Color.LTGRAY); paintWall.setStyle(Paint.Style.STROKE); //空心 paintWall.setStrokeWidth(BOUND_WIDTH_OF_WALL+1);} if (paintBlock == null) {// 初始化化背景墙画笔 paintBlock = new Paint(); paintBlock.setColor(Color.parseColor("#FF6600")); } snakeBlock= new SnakeBlock();}
-
绘制游戏地图在 onDraw中
@SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); max_x=getWidth(); //获取游戏界面的最大值 max_y=getHeight(); RectF rel; //矩形类 num_y=0; //绘制游戏网格图 for (int y=begin;y<max_y-BlockUnit.UNIT_SIZE;y+=BlockUnit.UNIT_SIZE){ num_x=0; for (int x=begin;x<max_x-BlockUnit.UNIT_SIZE;x+=BlockUnit.UNIT_SIZE){ rel=new RectF(x,y,x+BlockUnit.UNIT_SIZE,y+BlockUnit.UNIT_SIZE); //矩形的四个坐标 canvas.drawRoundRect(rel,8,8,paintWall);//绘制圆角矩形,弧度为8 num_x++;//记录地图的行列数 } num_y++;//记录地图的行列数 }
-
绘制蛇的身体,设置蛇的头部与蛇的身体颜色不一样,方便区分。
//绘制蛇的身体 int len = blockUnits.size(); // 绘制方块 for (int i = 1; i < len; i++) { int x = blockUnits.get(i).x; int y = blockUnits.get(i).y; // int c=blockUnits.get(i).color