AS写的简单的扫雷

来源:互联网 发布:gtaol捏脸数据女泰勒 编辑:程序博客网 时间:2024/06/06 05:24

/*

10*10平铺网格,10个雷,未作扩展

可用上下左右键移动,F键标识,空格扫雷

扫雷结束后,未实现开始新游戏的功能

*/

package

{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.ui.Keyboard;

public class MineSweeper extends Sprite
{
private var w:uint;//横向节点数
private var h:uint;//纵向节点数
private var wh:uint;//节点的宽与高
private var c:uint;//控制地图中地雷的数量
private var sweepCount:uint;//已扫出雷的数量
private var sum:uint;//扫雷过程中,开启的节点总数
private var dx:uint;//当前操作格x坐标
private var dy:uint;//当前操作格y坐标
private var map:Sprite;//地图容器
private var mapArr:Array = new Array;//地图数组 
private var curr:MovieClip = new MovieClip;
private var old:MovieClip = new MovieClip;
private var res:TextField;

//构造函数
public function MineSweeper()
{
init();
}

//初始化
private function init():void
{
w = 10;
h = 10;
wh = 30;
c = (w+h)/2;
sweepCount = 0;
sum = 0;
createMap();
createTip();
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);//键盘事件
}

//生成地图
private function makeMap():void 
{
if (null != map)
{
removeChild(map);
mapArr = [];
createMap();
}
}

//创建地图
private function createMap():void
{
map = new Sprite;
map.x = wh;
map.y = wh;
addChild(map);
map.addEventListener(MouseEvent.MOUSE_DOWN, mapMouseDown);//鼠标点击地图事件
for (var x:uint=0; x<w; x++) {
mapArr.push(new Array);//建立二维数组保存地图信息
for (var y:uint=0; y<h; y++) {
var mapPoint:uint = 0/*Math.round(Math.random() - goo)*/;
var point:MovieClip=drawRect(mapPoint);//画出节点
point.name = "p"+x+"_"+y;
mapArr[x].push(point);//将节点加入地图数组中
mapArr[x][y].px=x;//当前节点横向索引位置
mapArr[x][y].py=y;//当前节点纵向索引位置
mapArr[x][y].mine=0;//标识雷 0:无雷 1:有雷
mapArr[x][y].status=0;//标识是否已经扫雷 0:未扫 1:已扫
mapArr[x][y].flag=0;//标识是否为雷 0:为标识 1:已标识
mapArr[x][y].x=x * wh;//当前节点的x位置
mapArr[x][y].y=y * wh;//当前节点的y位置
map.addChild(point);//将节点显示到地图容器中

//显示地图编号
var txt:TextField = new TextField;
var tf:TextFormat = new TextFormat;
tf.color = 0x0000ff;
txt.setTextFormat(tf);
txt.name = "t" + x + "_" + y;
txt.width = 30;
txt.height = 30;
txt.x=x * wh;
txt.y=y * wh;
// txt.text = "("+x+","+y+")";
txt.mouseEnabled = false;
map.addChild(txt);
}
}
createMine();
setFocus();//当前操作格
}

//创建提示信息
private function createTip():void {
res = new TextField;
res.x = wh;
res.y = (h+1)*wh + 10;
res.width = 200;
res.height = 30;
// res.text = "just do it ";
addChild(res);
}

//创建地雷
private function createMine():void
{
var count:uint = c;
//埋雷
while (count > 0) {
var x:uint = uint(Math.random()*w);
var y:uint = uint(Math.random()*h);
//防止埋重复的地雷
if (mapArr[x][y].mine == 0) {
mapArr[x][y].mine = 1;
count--;
(map.getChildByName("t" + x + "_" + y) as TextField).text = "*";
}
}
}

//点击地图事件处理
private function mapMouseDown(event:MouseEvent):void 
{
var point:MovieClip = event.target as MovieClip;
start(point);
}

//开始扫雷
private function start(point:MovieClip):void {
if (point.status == 1) return;//如果已扫雷,则返回
var count:uint = 0;//统计周边雷的数量
if (point.mine == 0) {
openMap(point);
// trace("无雷");
} else {
drawRect(3, point);//标识为已扫雷状态
point.status = 1;
showResult(0);//扫雷失败
}
}

//设置焦点
private function setFocus():void {
dx = 0;
dy = 0;
curr = map.getChildByName("p"+dx+"_"+dy) as MovieClip;
old = curr;
drawRect(4,curr);
}


//清除焦点
private function clearFocus(point:MovieClip):void {
if (point.status == 0) {
drawRect(0,point);
} else {
drawRect(2,point);
}
}

//改变焦点
private function changeFocus():void {
clearFocus(old);
curr = map.getChildByName("p"+dx+"_"+dy) as MovieClip;
old = curr;
drawRect(4,curr);
}


//监听键盘事件
private function keyDown(event:KeyboardEvent):void {
/*
backspace 8
tab 9
enter 13
esc 27
space 32
left   37
  up    38
right 39
down   40
*/
switch (event.keyCode) {
case Keyboard.SPACE:
start(curr);
break;
case Keyboard.LEFT:
if (dx>0) dx--;
changeFocus();
break;
case Keyboard.RIGHT:
if (dx<w-1) dx++;
changeFocus();
break;
case Keyboard.UP:
if (dy>0) dy--;
changeFocus();
break;
case Keyboard.DOWN:
if (dy<h-1) dy++;
changeFocus();
break;
case 70://'F'
case 102://'f'
var p:MovieClip = map.getChildByName("p" + dx + "_" + dy) as MovieClip;
if (p.status == 1) return;//如果已扫雷,则返回
//如果未标识,则标识为雷;否则清除
var t:TextField = map.getChildByName("t" + dx + "_" + dy) as TextField;
t.textColor = 0xff0000;
if (p.flag == 0) {
t.text = "F";
p.flag = 1;
if (p.mine == 1) {
sweepCount++;
if (sweepCount == c) showResult(1);//扫雷成功
}
} else {
t.text = "";
p.flag = 0;
}

break;
}
}

//扫雷,显示无雷节点的周边节点雷的数量
private function openMap(mc:MovieClip):void
{
var count:uint = 0;//统计周边雷的数量
//显示周边雷的情况
for (var x:int=mc.px-1; x<=mc.px+1; x++) {
for (var y:int=mc.py-1; y<=mc.py+1; y++) {
//边界处理
if (x>=0 && x<=w-1 && y>=0 && y<=h-1) {
if (x==mc.px && y==mc.py) continue;
if (mapArr[x][y].mine == 1) {
count++;
}
}
}
}
mc.status = 1;
sum++;
if (sum == w*h) showResult(1);
drawRect(2, mc);//标识为已扫雷状态
if (count > 0) {
(map.getChildByName("t" + mc.px + "_" + mc.py) as TextField).text = "" + count;
} else {
//显示节点周边雷的数量
for (x=mc.px-1; x<=mc.px+1; x++) {
for (y=mc.py-1; y<=mc.py+1; y++) {
if (x>=0 && x<=w-1 && y>=0 && y<=h-1) {
if (x==mc.px && y==mc.py) continue;
var tmp:MovieClip = map.getChildByName("p" + x + "_" + y) as MovieClip;
if (tmp.status == 0) openMap(tmp);
}
}
}
}
}

//显示结果
private function showResult(win:uint = 1):void {
if (win == 1) {
res.text = "You win!";
} else {
res.text = "You lose.";
}
}

//根据传入的数值,生成不同的节点
private function drawRect(mapPoint:uint, mc:MovieClip = null):MovieClip
{
if (null == mc) {
mc = new MovieClip;
} else {
mc.graphics.clear();
}
var color:uint;
switch (mapPoint) {
case 0 :
color=0x999999;//可通过为灰色
break;
case 1 :
color=0x000000;//不可通过为黑色
break;
case 2:
color=0xa4cec8;
break;
case 3:
color=0xff0000;
break;
case 4:
color=0x9bafb9;
break;
default :
color=0xff0000;
}//End switch
mc.graphics.beginFill(color);
mc.graphics.lineStyle(0.2,0xFFFFFF);
mc.graphics.drawRect(0,0,wh,wh);
mc.graphics.endFill();
return mc;
}
}
}