(存手绘版贪吃蛇 [掌握里面面向对象的编程思想 和 ‘MVC模式’] )
游戏思路:
首先:规划出所需的类,
其次,为每个类详细列出各个类所需属性和方法。
比如就拿Food类来讲,他本身有x, y属性,绘制自己的方法(drawMe(Graphics g) ), 判断蛇是否吃到食物的方法(isSnakeEatFood (Snake snake)),等等都归属该类本身,所以在设计的时候一定要充分利用面向对象的编程思想规划好每一个类。
还有一些不变的常量最好定义到一个类当中,这样也便于管理。
在定义背景类(Ground)的时候,定义了这样一个二维数组:
int[][] rocks = new int[Global.WIDTH][Global.HEIGHT];
其中WIDTH = 12; HEIGHT = 15; 主要根据手机屏幕的尺寸来确定。
背景上的障碍物自己随意摆放。
但是在产生坐标的时候需要注意(也就是在随机出食物的时候):
/**随机产生坐标*/
public Point getPoint(){
Random random = new Random();
int x = 0, y = 0;
do{
x = random.nextInt(Global.WIDTH - 1);
y = random.nextInt(Global.HEIGHT - 1);
}while(rocks[x][y] == 1);
return new Point(x, y);
}
新随机出的 x, y 所对应的坐标上应该没有其他东西。用这个一个do{ } while( ) ; 循环来解决上述问题。值得借鉴学习。
定义蛇的类的时候,蛇类本身作为一个线程。用一个Vector数组存储蛇的身体
蛇身体的移动方法:
首先是先把Vector数组中的最后一格给删除掉,然后获取第一格的X,Y坐标, 然后根据移动的方向,X,Y坐标作相应的加减操作。最后根据这个改变值后的X, Y坐标new一个新的方块,加入Vector的第一项,这样蛇就动起来了。下面是示例代码:
/*
* 蛇的移动的方法
*/
public void move() {
if (!(olddirection + newdirection == 0)) {
olddirection = newdirection;
}
// 1去尾
body.removeElement(body.lastElement());
//取得第一格的X,Y坐标
int x = ((Point) body.firstElement()).getX();
int y = ((Point) body.firstElement()).getY();
//根据方向,x,y作相应的加减操作
switch (olddirection) {
case UP:
y--;
if (y < 0) {
y = Global.HEIGHT - 1;
}
break;
case DOWN:
y++;
if (y > Global.HEIGHT) {
y = 0;
}
break;
case LEFT:
x--;
if (x < 0) {
x = Global.WIDTH - 1;
}
break;
case RIGHT:
x++;
if (x > Global.WIDTH) {
x = 0;
}
break;
}
Point newHead = new Point(x, y);
// 2,加头
body.insertElementAt(newHead, 0);
}
注意是否需要在主线程里调用绘制方法,在按键的时候也调用一次绘制方法。调用两次
在canvas类里头控制蛇行走的方向,如下所示:
/*
* 按键功能事件
*/
public void keyPressed(int keyCode) {
gameaction = this.getGameAction(keyCode);
switch (gameaction) {
case UP:
snake.changeDirection(Snake.UP);
break;
case DOWN:
snake.changeDirection(Snake.DOWN);
break;
case LEFT:
snake.changeDirection(Snake.LEFT);
break;
case RIGHT:
snake.changeDirection(Snake.RIGHT);
break;
}
this.display(snake, food, ground);
}