⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake.java

📁 用J2ME 的手机贪吃蛇游戏源代码蛇头不能碰到蛇尾 吃点东西蛇身增长
💻 JAVA
字号:
import javax.microedition.lcdui.Graphics;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreFullException;
import javax.microedition.rms.RecordStoreNotFoundException;

public class Snake 
{
	public static final int V = 6 ;
	private int[][] snake ;
	public byte m ;
	private int l ;
	public boolean ok ;   //  是否执行完一次主循环
	
	public Snake(int max)
	{
		snake = new int[max][2] ;
		init() ;
	}
	
	public void init()
	{
		l = 5 ;
		for(int i = 0 ; i < l ; i++)
		{
			snake[i][0] = 120 ;
			snake[i][1] = 160 ;
		}
		m = 1 ;
	}
	
	public void render(Graphics g)
	{
		g.setColor(0x425A8B) ;
		for(int i = 0 ; i < l ; i++)
		{
			g.fillArc(snake[i][0] , snake[i][1] , V , V , 0 , 360) ;
		}
	}
	
	public void upData(Point p , MC mc)
	{
		if(p.isHit(snake[0][0] , snake[0][1]) == true)   //  检测碰撞点
		{
			l++ ;
			mc.score += 10 ;
			p.reset(this) ;
		}
		
		
		for(int i = l-1 ; i > 0 ; i--)     //   身体的移动
		{
			snake[i][0] = snake[i-1][0] ;
			snake[i][1] = snake[i-1][1] ;
		}
		switch(m)
		{
		case 1 :
			snake[0][1] -= V ;
			break ;
		case 2 :
			snake[0][0] -= V ;
			break ;
		case 3 :
			snake[0][1] += V ;
			break ;
		case 4 :
			snake[0][0] += V ;
			break ;
		}
		
		if(isHit(snake[0][0] , snake[0][1]) == true ||         //   检测死亡
				snake[0][0] < 0 || snake[0][0] > 240 - V ||
				snake[0][1] < 0 || snake[0][1] > 310 - V)
		{
			save(mc) ;
			mc.canvasIndex = 21 ;
		}
		
		ok = true ;
	}
	
	public void save(MC mc)   //   RMS  记录存储
	{
		byte[] data ;
		try {                //读取已存纪录
			RecordStore rs=RecordStore.openRecordStore("jj",true);//打开仓库
			if(rs.getNextRecordID()==1)  //  判断目前记录长度。
										 //   因为记录是从一开始记数的,
										 //  所以如果当前记录是一说明目前记录仓库是空的
			{
				for(int j=0;j<mc.result.length;j++) //  若是空的  先默认想排行数组中都存0
				{
					mc.result[j]=0;
				}
			}
			else   //   否则 依次从记录仓库中读出所有的排行信息。
			{
				for(int j=0;j<mc.result.length;j++)
				{
					data=rs.getRecord(j+1);  //  读出记录仓库中的第j+1条记录,读出的是一个byte[]  数组
					mc.result[j]=Tools.toInt(data);  //  利用自己写的转换方法,把读出的数组转换成int整数,放在排行数组中
				}
			}
			for(int j=0;j<mc.result.length;j++)//与纪录比较并更新纪录
			{
				if(mc.score>mc.result[j])//  若目前的分数大于记录中的分数
				{
					for(int l=mc.result.length -1 ;l>j;l--)  //  之后的分数向后移动,
					{
						mc.result[l]=mc.result[l-1];
					}
					mc.result[j]=mc.score;   // 把当前分数插在排行数组中
					break;
				}
			}
            //	  存入更新后的纪录
			if(rs.getNextRecordID()==1)  //  若当前数据仓库是空的
			{
				for(int j=0;j<10;j++)
				{
					data=Tools.toByte(mc.result[j]);  //  利用自己写的方法  把int整数转换成byte[]数组
					rs.addRecord(data,0,data.length); //  把转换后的数组依次存放在仓库中,存放的序号会自动向后移
	// 参数分别是 :     要存储的buye[]数组  ,   存储的启始位置   ,   存储的长度
				}
			}
			else   //  否则说明记录仓库中已经存储了之前的排行信息
			{
				for(int j=0;j<10;j++)
				{
					data=Tools.toByte(mc.result[j]);  //  利用自己写的方法  把int整数转换成byte[]数组
					rs.setRecord(j+1,data,0,data.length); //用转换后的数组替换之前的信息
	// 参数分别是 : 要替换的位置序号    ,    要存储的buye[]数组  ,   存储的启始位置   ,   存储的长度     
				}
			}
			rs.closeRecordStore();//关闭仓库
		} catch (RecordStoreFullException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (RecordStoreNotFoundException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (RecordStoreException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
	}
	
	public boolean isHit(int _x , int _y)
	{
		for(int i = 1 ; i < l ; i++)
		{
			if(Math.abs(snake[i][0] - _x) < V &&
			   Math.abs(snake[i][1] - _y) < V)
			{
				return true ;
			}
		}
		return false ;
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -