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

📄 grids.java

📁 J2ME编程的50个例子,适合掌上系统的编程
💻 JAVA
字号:
package demo;
import java.io.IOException;
import java.util.Random;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.TiledLayer;


public class Grids {
	//定义一组格子状态值,这些值对应图片中的索引
	public static final int GRID_UP			= 1;	//未挖开的方格
	public static final int GRID_MINE 		= 2;	//地雷方格
	public static final int GRID_NUMBER0		= 3;	//0号数字方格的位置
	
	public TiledLayer m_GridTL;							//格子图像
	public Random m_Random; 							//随机数对象
	public int m_nCurCol = 0;							//当前所选格子的列数
	public int m_nCurRow = 0;							//当前所选格子的行数
	public boolean m_aMines[][];						//格子中有无地雷的标志
	
	//构造方法,
	//参数nCols,nRows分别是格子的列数和行数
	//参数scrWidth,scrHeight分别是屏幕的宽和高
	public Grids( int nCols, int nRows, int ScrWidth, int ScrHeight ){
		m_Random = new Random();
		try{
			Image img = Image.createImage("/demo/TL.png");
			m_GridTL = new TiledLayer( nCols, nRows, img, 16, 16 );
			int nX = ScrWidth / 2 - m_GridTL.getWidth() / 2;
			int nY = ScrHeight / 2 - m_GridTL.getHeight() / 2;
			m_GridTL.setPosition( nX, nY );
			m_aMines = new boolean[nCols][nRows];
		}
		catch (IOException e){}
	}
	//重新设置格子,num是规定的格子中的地雷数
	public void ResetMines( int num ){
		for( int col = 0; col < m_GridTL.getColumns(); col ++ ){
			for( int row = 0; row < m_GridTL.getRows(); row ++ ){
				m_GridTL.setCell( col, row, GRID_UP );
				m_aMines[col][row] = false;
			}
		}
		//设置地雷
		while( num > 0 ){
			int total = m_GridTL.getColumns() * m_GridTL.getRows();
			int n = Math.abs(m_Random.nextInt() % total);
			int col = n % m_GridTL.getColumns();
			int row = n / m_GridTL.getColumns();
			while( true ){
				if( m_aMines[col][row] == false ){
					m_aMines[col][row] = true;
					break;
				}
				n ++;
				if( n >= total )
					n = 0;
				col = n % m_GridTL.getColumns();
				row = n / m_GridTL.getColumns();
			}
			num --;
		}
	}
	//显示所有地雷
	public void ShowAllMines(){
		for( int col = 0; col < m_aMines.length; col ++ ){
			for( int row = 0; row < m_aMines[0].length; row ++ ){
				if( m_aMines[col][row] ){
					m_GridTL.setCell( col, row, GRID_MINE );
				}
			}
		}
	}
	//挖雷,并炸开周围没有地雷的格子
	//返回true表示挖到地雷,false表示没有挖到地雷
	public boolean DigMine( int col, int row ){
		/***第(1)步,检测当前方块是否已被挖开**********/
		if( m_GridTL.getCell( col, row ) != GRID_UP )
		{//当前方块已被挖开,结束操作
			return false;
		}
		/***第(2)步,检测当前方块中是否有地雷**********/
		if( m_aMines[col][row] )
		{//当前方块中有地雷,结束操作
			return true;
		}
		/***第(3)步,挖开当前方块并显示周围的地雷总数***/
		//计算当前方块周围地雷的总数量
		int num = 0;
		for( int c = -1; c <= 1; c ++ ){
			for( int r = -1; r <= 1; r ++ ){
				if( CheckMine( col + c, row + r ) )			//检测是否有地雷
					num ++;
			}
		}
		//挖开方块并显地雷总数
		m_GridTL.setCell( col, row, GRID_NUMBER0 + num );
		if( num > 0 )
			return false;
		
		/***第(4)步,处理周围的方块*******************/
		for( int c = -1; c <= 1; c ++ ){
			if( col + c < 0 || col + c >= m_aMines.length )
				continue;
			for( int r = -1; r <= 1; r ++ ){
				if( row + r < 0 || row + r >= m_aMines[0].length )
					continue;
				DigMine( col + c, row + r );				//重新执行第(1)步操作
			}
		}
		return false;
	}
	//检测指定格子中是否有地雷,参数col,row分别是指定格子的列数和行数
	private boolean CheckMine( int col, int row ){
		if( col < 0 || col >= m_aMines.length )
			return false;
		if( row < 0 || row >= m_aMines[0].length )
			return false;
		return m_aMines[col][row];
	}	
	//显示所有格子及当前选择的位置
	public void Paint( Graphics g ){
		m_GridTL.paint( g );
		int x = m_GridTL.getX() + m_nCurCol * m_GridTL.getCellWidth();
		int y = m_GridTL.getY() + m_nCurRow * m_GridTL.getCellHeight();
		g.drawRect(x, y, m_GridTL.getCellWidth(), m_GridTL.getCellHeight());
	}
}

⌨️ 快捷键说明

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