代码:public class GameThread extends Thread {
private GameView view;
private SurfaceHolder holder;
public boolean pauseFlag = false;// 是否暂停
public GameThread(GameView view) {
this.view = view;
holder = view.getHolder();
}
@Override
public void run() {
Canvas canvas;
while (true) {
canvas = null;
if (!pauseFlag) {
try {
canvas = holder.lockCanvas();
synchronized (holder) {
view.drawGame(canvas);
}
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class MainActivity extends Activity {
private GameView gameView;
private GestureDetector gestureDetector;// 处理手势
public int fx = 0; // 食物的X坐标
public int fy = 0;// 食物的Y坐标
public int size = 16; // 蛇身的大小
public int changdu = 2;// 蛇身长度
public int direction = 3;// 蛇的移动方向,分别使用 0上,1下,2左,3右
public int x = 16; // 移动的X坐标
public int y = 16; // 移动的Y坐标
public int x1 = 0; // 障碍物X坐标
public int y1 = 0; // Y坐标
public ArrayList<int[]> path = new ArrayList<int[]>();// 记录运行的路径
public HashMap<Integer, Integer> roadBlock = new HashMap<Integer, Integer>();// 障碍物
public int screenW; // 屏幕的宽度
public int screenH; // 屏幕的高度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化视图
initView();
// 初始化地图
initMap();
// 初始化游戏(手势)
initGame();
}
private void initGame() {
gestureDetector = new BuileGesture(this, new BuileGesture.OnGestureResult() {
@Override
public void onGestureResult(int direction) {
// 获取从手势处理类得到的手势方向
MainActivity.this.direction = direction;
Toast.makeText(MainActivity.this, "方向:" + direction, Toast.LENGTH_SHORT).show();
}
}).Builde();
}
private void initMap() {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenW = metrics.widthPixels;
screenH = metrics.heightPixels;
// 初始化食物
Random rd = new Random(System.currentTimeMillis());
int tempX = rd.nextInt(screenW / 16);
int tempY = rd.nextInt(screenH / 16); // ...
fx = tempX * 16;
fy = tempY * 16;
// 初始化障碍物
x1=screenW/2;
y1=screenH/2;
}
private void initView() {
// 去标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 绑定视图
gameView = new GameView(MainActivity.this);
setContentView(gameView);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 将触摸事件和手势处理类绑定到一起
return gestureDetector.onTouchEvent(event);
}
@Override
public void onResume() {
super.onResume();
// 游戏继续或重新开始
// ... ...
Toast.makeText(MainActivity.this, "游戏开始", Toast.LENGTH_SHORT).show();
gameView.gameThread.pauseFlag = false;
}
@Override
protected void onPause() {
super.onPause();
// 游戏暂停
// ... ...
gameView.gameThread.pauseFlag = true;
}
@Override
public void onStop() {
super.onStop();
// 游戏结束
// ... ...
Toast.makeText(MainActivity.this, "游戏结束", Toast.LENGTH_SHORT).show();
gameView.gameThread.pauseFlag = true;
return ;
}
}
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
public GameThread gameThread;
private Canvas canvas;
private Paint paint;
private MainActivity activity;
public GameView(Context context) {
super(context);
activity = (MainActivity) context;
this.getHolder().addCallback(this);
gameThread = new GameThread(this);
paint = new Paint();
paint.setAntiAlias(true);
}
// 画游戏界面
public void drawGame(Canvas canvas) {
// 给游戏画背景
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pg3);
Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
Rect dst = new Rect(0, 0, activity.screenW, activity.screenH);
canvas.drawBitmap(bitmap, src, dst, paint);
// 画食物
paint.setColor(Color.RED);
canvas.drawRect(activity.fx, activity.fy, activity.fx + activity.size, activity.fy + activity.size, paint);
// 画标题
paint.setColor(Color.BLUE);
paint.setTextSize(50);
canvas.drawText("经典贪吃蛇", activity.screenW / 2 - 120, 50, paint);
// 画障碍物
// 设置top和botom墙面;
paint.setColor(Color.BLUE);
canvas.drawRect(0, 0, 0 + activity.size, activity.screenH + activity.size, paint);
canvas.drawRect(0, 0, activity.screenW + activity.size, 0 + activity.size, paint);
canvas.drawRect(activity.screenW - 16, activity.screenH, activity.screenW - 16 + activity.size,
0 + activity.size, paint);
canvas.drawRect(activity.screenW, activity.screenH - 16, 0 + activity.size,
activity.screenH - 16 + activity.size, paint);
// 障碍物
canvas.drawRect(activity.screenW / 2 - 80, activity.screenH / 2, activity.screenW / 2 + 80 + activity.size,
activity.screenH / 2 + activity.size, paint);
// canvas.drawRect(0, activity.y1, 0 + activity.size, activity.y1 +
// activity.size, paint);
// 蛇身移动
switch (activity.direction) {
case 0:// 上
activity.y = activity.y - activity.size;
break;
case 1:// 下
activity.y = activity.y + activity.size;
break;
case 2:// 左
activity.x = activity.x - activity.size;
break;
case 3:// 右
activity.x = activity.x + activity.size;
break;
}
// 临界值处理
if (activity.x > activity.screenW) {
activity.x = 0;
}
if (activity.x < 0) {
activity.x = activity.screenW / 16 * 16;
}
if (activity.y > activity.screenH) {
activity.y = 0;
}
if (activity.y < 0) {
activity.y = activity.screenH / 16 * 16;
}
// 保存路径
int[] p = new int[2];
p[0] = activity.x;
p[1] = activity.y;
activity.path.add(p);
// 保持蛇身长度
if (activity.path.size() > activity.changdu) {
activity.path.remove(0);
}
// 蛇移动,将运行路径画出来
paint.setColor(Color.GREEN);
for (int[] m : activity.path) {
canvas.drawRect(m[0], m[1], m[0] + activity.size, m[1] + activity.size, paint);
}
// if(ap[activity.x][activity.y]==Contants.STAR_GREEN){
// //如果撞到墙或者自己,则死亡;
//// System.out.println(Contants.currentMap[x][y]);
// activity.changdu=0;
//
//
// }
// .碰到了自己
// Look for collisions with itself
int snakelength = activity.changdu;
for (int snakex = 0; snakex < snakelength; snakex++) {
if (snakex == p[0]) {
for (int snakey = 0; snakey < snakelength; snakey++) {
if (snakey == p[1]) {
//activity.onStop();
return;
}
}
}
}
// 撞障碍物
if ((p[0] >= activity.x1 - 80) && (p[0] <= activity.x1 + 80) && (p[1] >= activity.y1 - 16)
&& (p[1] <=activity.y1 + 16)) {
activity.onStop();
return;
}
// 撞墙
if ((p[0] < 16) || (p[1] < 16) || (p[0] > activity.screenW - 16) || (p[1] > activity.screenH - 16)) {
activity.onStop();
// activity.onResume();
return;
}
// 吃食物
if (activity.path.get(activity.path.size() - 1)[0] == activity.fx
&& activity.path.get(activity.path.size() - 1)[1] == activity.fy) {
activity.changdu++;
// 重新放置食物
Random rd = new Random(System.currentTimeMillis());
int tempX = rd.nextInt(activity.screenW / 16);
int tempY = rd.nextInt(activity.screenH / 16);
activity.fx = tempX * 16;
activity.fy = tempY * 16;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
gameThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}