`

android中的贪吃蛇源码

阅读更多
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. */
	@Override
	public 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);//480
		view = new SnakeView(this);
		setContentView(view);
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		view.onKeyDown(keyCode, event);
		return super.onKeyDown(keyCode, event);
	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		view.onKeyUp(keyCode, event);
		return super.onKeyUp(keyCode, event);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		view.onTouchEvent(event);
		return super.onTouchEvent(event);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		menu.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);
	}
	
	@Override
	public void onOptionsMenuClosed(Menu menu) {
		// TODO Auto-generated method stub
		view.isPaused=false;//关闭菜单时继续游戏
		super.onOptionsMenuClosed(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		switch (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() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
					dialog.cancel();
				}
			})
			.setNegativeButton("访问首页", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
					dialog.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*480
	private 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 stub
		r=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;
		
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (isRunning) {
			long start=System.currentTimeMillis();
			if(!isPaused){
				if(isGameOver()){
					isPaused=true;
				}else{
					eatFood();
					move(direction);
					b=!b;
				}
			}
			
			postInvalidate();//相当于repaint
			long end=System.currentTimeMillis();
			if(end-start<SLEEP_TIME){
				try {
					Thread.sleep(SLEEP_TIME-(end-start));
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.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);
		}
		
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		switch (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);
	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		return super.onKeyUp(keyCode, event);
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		// TODO Auto-generated method stub
		super.onSizeChanged(w, h, oldw, oldh);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		switch (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;
	}
	
}

分享到:
评论

相关推荐

    [Android游戏源码]-简单的贪吃蛇源码.rar_Android游戏源码_android_android 贪吃蛇_贪吃蛇_贪

    这里我们将深入分析一款名为"简单的贪吃蛇源码"的Android游戏源码,探讨其设计思路、主要技术和实现细节。 首先,从标题我们可以得知,这个源码是针对Android平台的,意味着它将基于Java语言和Android SDK进行开发...

    android游戏贪吃蛇源码

    《Android游戏贪吃蛇源码解析与学习指南》 贪吃蛇是一款经典的电子游戏,它简单易懂,却又富有挑战性。在Android平台上,贪吃蛇的实现涉及到许多编程技术,包括图形绘制、事件处理、游戏逻辑等。本文将深入探讨...

    android贪吃蛇游戏源码

    《Android贪吃蛇游戏源码解析》 贪吃蛇,这款经典的街机游戏,自诞生以来就深受全球玩家喜爱。在移动设备普及的今天,它也成功移植到了Android平台上,成为许多开发者学习游戏编程的入门案例。本文将深入探讨一个...

    java Android贪吃蛇源码

    【标题】"java Android贪吃蛇源码"指的是一个基于Java编程语言开发的Android平台上的贪吃蛇游戏项目。在Android应用开发中,Java是最常用的语言之一,它为开发者提供了丰富的API和工具来构建功能丰富的移动应用。在...

    android实现贪吃蛇源码

    总的来说,"android实现贪吃蛇源码"项目能让你深入理解Android开发中的许多关键概念,包括UI设计、事件处理、多线程、动画效果、游戏逻辑以及数据管理等。通过对`SnakesGame`的分析和学习,初学者能够快速提升自己的...

    知识共享-Android版贪吃蛇源码及分析(雷惊风).

    综上所述,Android版贪吃蛇源码不仅展现了游戏开发中的技术细节,如自定义视图的创建与使用、游戏状态的精细管理等,还体现了良好的代码组织与优化实践。通过对该源码的深入分析,开发者不仅能学到具体的编程技巧,...

    android 贪吃蛇 源码分析

    在分析SDK Samples中的贪吃蛇源码时,你可以关注以下几点: - **布局文件**:查看`res/layout`目录下的XML文件,了解游戏界面是如何被定义和组织的。 - **游戏循环**:查找实现游戏循环的函数,如`updateGame()`,...

    android 贪吃蛇 源码

    首先,Android贪吃蛇游戏的核心机制是基于二维数组或者网格来表示游戏地图。地图上包含蛇、食物以及边界。蛇的身体由一系列坐标点组成,每次移动,蛇头会根据用户输入的方向改变位置,而蛇身的其他部分会沿着头部...

    android开发贪吃蛇源码

    这个“android开发贪吃蛇源码”项目为Android开发者提供了一个直接可用的基础框架,无需深入理解每一行代码,即可运行游戏。下面我们将详细探讨Android平台上的贪吃蛇游戏开发涉及的知识点。 1. **Android Studio和...

    基于android的贪吃蛇源码数据库.zip

    描述中的内容与标题相同,"基于android的贪吃蛇源码数据库.zip",暗示了压缩包中的内容是完整的,包含了一个Android平台上的贪吃蛇游戏的源代码,以及可能用到的数据库设计和实现。这可能是一个开发者分享的项目,...

    Android程序源码--贪吃蛇

    通过分析和实践这个Android贪吃蛇源码,开发者可以深入理解Android应用开发的基本流程,包括UI设计、事件处理、多线程编程以及游戏逻辑的实现。这是一个极好的学习资源,对提升Android编程技能大有裨益。

    Android 贪吃蛇源码分析

    ### Android贪吃蛇源码分析 #### 概述 在本次源码分析中,我们将深入研究一个基于Android平台的经典游戏“贪吃蛇”的实现细节。这款游戏通过简单的规则和直观的操作吸引了大量的用户。本文将从包结构、类设计、...

    Android 贪吃蛇、俄罗斯方块源码

    "Android 贪吃蛇、俄罗斯方块源码"提供了一个宝贵的资源,帮助开发者深入理解这两种经典游戏的实现原理,以及如何在Android环境下构建它们。下面我们将详细探讨这两个游戏的核心知识点。 首先,贪吃蛇游戏: 1. **...

    贪吃蛇源码eclipse开发

    这个"贪吃蛇源码eclipse开发"项目是用Java语言在Eclipse集成开发环境中编写的,因此我们可以从中深入理解Java编程语言和Eclipse IDE的使用。 首先,我们需要了解Java编程基础。Java是一种面向对象的编程语言,它的...

    android 版贪吃蛇源码_课程设计

    在Android平台上实现一款贪吃蛇游戏的课程设计是一项有趣且具有挑战性的任务,它涉及到许多核心的编程概念和Android开发技术。以下是对这个项目中涉及的知识点的详细说明: 1. **Android SDK**:Android版贪吃蛇的...

    Android 俄罗斯方块与贪吃蛇源码下载

    Android 俄罗斯方块与贪吃蛇源码;Android 俄罗斯方块与贪吃蛇源码;Android 俄罗斯方块与贪吃蛇源码;Android 俄罗斯方块与贪吃蛇源码;

Global site tag (gtag.js) - Google Analytics