📄 grids.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 + -