用 new 来建立格子类 Grid 对象 grid, 同时通过 push 方法把对象 grid 加到二维数组 Mines。 通过代码设置 grid 对象位置等属性, 然后用 addChild (grid) 方法把对象 grid 添加到舞台上可见。
private function init():void {//创建所有的雷对象
var row:int;//行
var col:int;//列
var grid:Grid;//一个格子
for (row=0; row<Grid.ROW_COUNT; row++) {
var temp:Array= new Array();
for (col=0; col<Grid.COL_COUNT; col++) {
//创建一个格子,设置格子的编号、行号、列号
grid = new Grid();
grid.id = row*Grid.COL_COUNT+col;
grid.row = row;
grid.col = col;
//排列摆放格子,格子的 x 位置为左边距
//加上列数乘以格子宽度和水平间距的和,
//格子的 y 位置为上边距加上行数乘以格
//子高度和垂直间距的和
grid.x = LEFT_MARGIN + col * (grid.
width + HORIZONTAL_SPACING);
grid.y = TOP_MARGIN + row * (grid.
height + VERTICAL_SPACING);
grid.state = Mine.SOURCE;//初始状态
grid.isMine =false; //不是雷
//添加格子的“鼠标移入”、“鼠标单击”、
//“鼠标移出”事件
grid.addEventListener (MouseEvent.MOUSE_OVER,
gridMouseOverHandler);
grid.addEventListener(MouseEvent. CLICK, grid-
MouseDownHandler);
grid.addEventListener(MouseEvent.MOUSE_OUT,
gridMouseOutHandler);
//将格子存入数组 temp,便于管理控制
temp.push(grid);
addChild(grid);
}
Mines.push(temp);
}
}
LayMines() 完成布雷功能, 同时计算每个小格子方块区域相邻 8 个区域的雷个数。
private function LayMines():void { // 布雷
var x,y:int;
for (var i:int = 0; i < restMineCount; )
{
//取随机数
x = Math.floor (Math.random () * Grid.
ROW_COUNT) ;
y = Math.floor (Math.random () * Grid.
COL_COUNT) ;
if (Mines[x][y].isMine)//代表这个位置是地雷
continue;
else {
Mines[x][y].isMine= true;//修改属性为雷
i++;
}
}
for (var row=0; row<Grid.ROW_COUNT; row++) {
for (var col=0; col<Grid.COL_COUNT; col++) {
//获取某个小方块格子相邻 8 个区域的雷个数
Mines[row][col].aroundMineCount=GetAround-
Num(row,col)
}
}
}
/// 获取某个小方块格子相邻 8 个区域的雷个数
private function GetAroundNum(row:int, col:int):int
{
var i, j:int;
var minRow:int = (row == 0) ? 0 : row - 1;
var maxRow:int = row + 2;
var minCol:int = (col == 0) ? 0 : col - 1;var maxCol:int = col + 2;
var around:int = 0;
for (i = minRow; i < maxRow; i++)
{
for (j = minCol; j < maxCol; j++)
{
if (! IsInMineArea(i, j))//判断是否在扫雷区域
continue;
if (Mines[i][j].isMine) around++;
}
}
return around;
}
IsInMineArea(int row, int col) //判断(row, col)坐标点是
//否在扫雷区域。
// 判断是否在扫雷区域
private function IsInMineArea(row:int, col:int):Boolean
{
return (row >= 0 && row <Grid.ROW_COUNT &&
col >= 0 && col <Grid.COL_COUNT);
}
2.4、无雷格子拓展 (对于周围无雷的空白块)
对于无雷格子拓展, 首先判断该格子是否为空白块 (其相邻的 8 个格子都不是雷块), 如果是则向这相邻的 8 个格子进行递归拓展, 直到不可拓展为止。
private function ExpandMines ( row:int, col:int):
void//雷方块拓展
{
var i, j:int;
var minRow:int = (row == 0) ? 0 : row - 1;
var maxRow:int = row + 2;
var minCol:int = (col == 0) ? 0 : col - 1;
var maxCol:int = col + 2;
var around:int = GetAroundNum(row, col);
//对周围一个雷都没有的空白区域拓展
if (around == 0)
{
Mines[row][col].state= Mine.TRUN_OVER;
Mines[row][col].setState(Mine.TRUN_OVER);
for (i = minRow; i < maxRow; i++)
{
for (j = minCol; j < maxCol; j++)
{
//对于周围可以拓展的区域进行的规拓展
if (! IsInMineArea(i, j)) continue;
if (! (i == row && j == col) && Mines[i]
[j].state==Mine.SOURCE)
{
ExpandMines(i, j);
}
Mines[i][j].state= Mine.TRUN_OVER;//格子翻开
if (GetAroundNum(i,j) ! = 0) //周围有雷
{
Mines[i][j].gotoAndStop(GetAroundNum(i, j));
}
}
}
}
}
2.5、格子的“鼠标单击”事件处理
格子的鼠标单击事件处理, 根据不同情况, 显示数字、显示空格、 过关、 结束游戏等。
private function gridMouseDownHandler (event:
MouseEvent):void {
var grid:Grid = (Grid)(event.currentTarget);
//当前格子
//游戏未结束,且当前位置未点开时,才可单击
//执行相应操作
if (! isOver && grid.state == Mine.SOURCE)
{
//若点到雷,则游戏结束
if (grid.isMine) {//检测当前位置为雷,则
//游戏结束
grid.setState(Mine.GAME_OVER);
win_txt.visible=true;
win_txt.text="你点到雷了! ";//你失败了
endGame();
} else {
//若此位置周围雷的个数为 0,
//则须遍历出周围所有无雷的位置
if (grid.aroundMineCount == 0) {
ExpandMines(grid.row,grid.col);
}
else{//显示周围雷数
grid.state= Mine.TRUN_OVER;//格子翻开
trace("显示周围雷数",grid.aroundMineCount);
grid.gotoAndStop(grid.aroundMineCount);
}
flagAllMine();//标记出可以计算出是雷的位置
//若所有雷都已用旗帜标记,则显示全部雷
if (checkPass()) {
displayAllMine();//显示全部雷
trace("胜利显示全部雷");
win_txt.text="你过关了,笑脸重新开始";
win_txt.visible=true; //成功文字提示可见
isStart = false;
isOver = true;
}
}
}
//刷新显示剩余雷的个数
refreshRestMineCount();
}