package com.dc.app;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.KeyEvent;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import com.dc.view.SnakeView;public class SnakeActivity extends Activity {private static final String tag = "SnakeActivity";SnakeView view;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//DisplayMetrics dm = new DisplayMetrics();//this.getWindowManager().getDefaultDisplay().getMetrics(dm);//int screenWidth = dm.widthPixels;//int screenHeight = dm.heightPixels;//Log.w(tag, "screenWidth=" + screenWidth);//320//Log.w(tag, "screenHeight=" + screenHeight);//480view = new SnakeView(this);setContentView(view);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubview.onKeyDown(keyCode, event);return super.onKeyDown(keyCode, event);}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {// TODO Auto-generated method stubview.onKeyUp(keyCode, event);return super.onKeyUp(keyCode, event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubview.onTouchEvent(event);return super.onTouchEvent(event);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// TODO Auto-generated method stubmenu.add(0, Menu.FIRST+2, 0, "继续").setShortcut('3', 'c');//设置快捷键menu.add(0, Menu.FIRST, 0, "重新开始").setShortcut('1', 'p');//设置快捷键menu.add(0, Menu.FIRST+1, 0, "关于...").setShortcut('2', 'a');//设置快捷键return super.onCreateOptionsMenu(menu);}public boolean onPrepareOptionsMenu(Menu menu) {view.isPaused=true;//显示菜单时暂停游戏return super.onPrepareOptionsMenu(menu);}@Overridepublic void onOptionsMenuClosed(Menu menu) {// TODO Auto-generated method stubview.isPaused=false;//关闭菜单时继续游戏super.onOptionsMenuClosed(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubswitch (item.getItemId()) {case Menu.FIRST:if(view!=null){view.setFocusable(true);view.init();}break;case Menu.FIRST+1:Dialog aboutDialog=new AlertDialog.Builder(this).setTitle("贪吃蛇").setMessage("贪吃蛇V1.0").setCancelable(true).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubdialog.cancel();}}).setNegativeButton("访问首页", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubdialog.cancel();Uri uri=Uri.parse("http://www.iteye.com");Intent intent=new Intent(Intent.ACTION_VIEW,uri);startActivity(intent);}}).create();aboutDialog.setCanceledOnTouchOutside(true);aboutDialog.show();break;case Menu.FIRST+2:view.isPaused=false;break;default:break;}return super.onOptionsItemSelected(item);}}

这里使用了继承了View作为“画布”,实际是个控件;最好继承SurfaceView。看情况啦!
package com.dc.view;import java.util.Random;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.FontMetrics;import android.graphics.Paint.Style;import android.util.Log;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;public class SnakeView extends View implements Runnable{private static final String tag="SnakeView";public boolean isPaused=false;public boolean isRunning=true;private int[][] snake=new int[100][2];//100节点总数,第二维下标0代表x坐标,1代表y坐标private int snakeNum;//已经使用的节点数private int direction;private final int direction_up=0;private final int direction_down=1;private final int direction_left=2;private final int direction_right=3;private int width=320,height=480;//view的宽高,不是全屏320*480private final int SNAKEWIDTH=5;//单节蛇体宽private int SLEEP_TIME;private int foodX,foodY;//食物坐标private boolean b=true;//控制食物闪烁private Random r;private Thread t;private Paint paint;public SnakeView(Context context) {super(context);// TODO Auto-generated constructor stubr=new Random();paint=new Paint();init();t=new Thread(this);t.start();}public void init(){snakeNum=12;for(int i=0;i<snakeNum;i++){snake[i][0]=100-SNAKEWIDTH*i;snake[i][1]=100;}direction=direction_right;generateFood();SLEEP_TIME=200;b=true;isRunning=true;isPaused=false;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (isRunning) {long start=System.currentTimeMillis();if(!isPaused){if(isGameOver()){isPaused=true;}else{eatFood();move(direction);b=!b;}}postInvalidate();//相当于repaintlong end=System.currentTimeMillis();if(end-start<SLEEP_TIME){try {Thread.sleep(SLEEP_TIME-(end-start));} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);width=getWidth();height=getHeight();Log.w(tag, "width="+width);Log.w(tag, "height="+height);width=canvas.getWidth();height=canvas.getHeight();Log.w(tag, "width=="+width);Log.w(tag, "height=="+height);canvas.drawColor(0xffffff);paint.setColor(Color.BLUE);paint.setAntiAlias(true);paint.setStyle(Style.FILL);for(int i=0;i<snakeNum;i++){canvas.drawRect(snake[i][0], snake[i][1], snake[i][0]+SNAKEWIDTH, snake[i][1]+SNAKEWIDTH, paint);}paint.setColor(Color.WHITE);if(b){canvas.drawRect(foodX,foodY,foodX+SNAKEWIDTH,foodY+SNAKEWIDTH,paint);}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubswitch (keyCode) {case KeyEvent.KEYCODE_DPAD_DOWN:if(direction!=direction_up)direction=direction_down;break;case KeyEvent.KEYCODE_DPAD_UP:if(direction!=direction_down)direction=direction_up;break;case KeyEvent.KEYCODE_DPAD_LEFT:if(direction!=direction_right)direction=direction_left;break;case KeyEvent.KEYCODE_DPAD_RIGHT:if(direction!=direction_left)direction=direction_right;break;case KeyEvent.KEYCODE_DPAD_CENTER:isPaused=!isPaused;break;default:break;}return super.onKeyDown(keyCode, event);}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {// TODO Auto-generated method stubreturn super.onKeyUp(keyCode, event);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {// TODO Auto-generated method stubsuper.onSizeChanged(w, h, oldw, oldh);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubswitch (event.getAction()) {case MotionEvent.ACTION_DOWN:break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:break;}return super.onTouchEvent(event);}private void eatFood(){if(snake[0][0]==foodX&&snake[0][1]==foodY){snakeNum++;generateFood();}}private void generateFood(){while(true){//确保在屏幕内产生食物foodX=Math.abs(r.nextInt()%(width-SNAKEWIDTH+1))/SNAKEWIDTH*SNAKEWIDTH;foodY=Math.abs(r.nextInt()%(height-SNAKEWIDTH+1))/SNAKEWIDTH*SNAKEWIDTH;boolean b=true;for(int i=0;i<snakeNum;i++){//确保不在蛇体上产生食物if(foodX==snake[i][0]&&foodY==snake[i][1]){b=false;break;}}if(b){break;}}}private void move(int direction){for(int i=snakeNum-1;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];}switch (direction) {case direction_up:snake[0][1]=snake[0][1]-SNAKEWIDTH;break;case direction_down:snake[0][1]=snake[0][1]+SNAKEWIDTH;break;case direction_left:snake[0][0]=snake[0][0]-SNAKEWIDTH;break;case direction_right:snake[0][0]=snake[0][0]+SNAKEWIDTH;break;default:break;}}private boolean isGameOver(){//越界判断if(snake[0][0]<0||snake[0][0]>width-SNAKEWIDTH||snake[0][1]<0||snake[0][1]>height-SNAKEWIDTH){return true;}for(int i=4;i<snakeNum;i++){//自身碰撞判断if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1]){return true;}}return false;}}

更多相关文章

  1. 【Android】柱状图示例
  2. android中的贪吃蛇源码
  3. Android(安卓)Studio 快捷键中英文对译
  4. android中的贪吃蛇源码
  5. android Rect的使用
  6. 自定义Android六边形进度条(附源码)
  7. android GOOGLE MAP应用
  8. Android中文API (39) —— AbsSpinner
  9. 新手学Android

随机推荐

  1. Android中常用的Drawable
  2. android fragment 切换时隐藏软键盘
  3. 安卓(Android)x86 4.4 VMware虚拟机安装
  4. 做谷歌地图是获得Map key的方法
  5. 直播代码Android怎么实现定时任务及闹钟?
  6. Android 开发资料总结--依赖注入框架
  7. Android属性动画AnimatorSet源码简单分析
  8. Android的Adapter用法理解
  9. Android(安卓)AES加密工具类分享
  10. Android Http通信