#pragma strict
var rows:int;
var cols:int;
var all_num:int;
var mine_num:int;
var mines:Mine[];
var guiSkin:GUISkin;
var minesArea:Rect;
var flagMode:boolean;
var gameOver:boolean;
var winner:boolean;
/**
Start
**/
function Start () {
flagMode = false;
gameOver = false;
winner = false;
//依据屏幕大小计算雷区矩阵尺寸
rows = 9;
cols = 9;
mine_num = 10;
all_num = rows*cols;
var width = 120*cols;
var height = 120*rows;
if(width>Screen.width)
{
height = height*(Screen.width*0.8/width);
width = Screen.width*0.8;
}
if(height>Screen.height)
{
width = width*(Screen.height*0.8/height);
height = Screen.height*0.8;
}
minesArea = Rect((Screen.width-width)/2,(Screen.height-height)/2,width,height);
//依据雷区尺寸生成雷区内全部有雷卡、0雷卡、正雷卡
mines = BuildMineField(minesArea);
}
//生成雷区
function BuildMineField(rect:Rect):Mine[]
{
var minesArray:int[] = new int[all_num];
var p = 0;
//Random.seed = System.DateTime.Now.Millisecond;
//print(Random.seed);
//random mine
for(var i=0;i<mine_num;i++)
{
while(true)
{
p += Random.Range(0,all_num);
p = p%all_num;
if(minesArray[p]!=-1)
{
minesArray[p] = -1;
break;
}
}
}
//count border mine number
for(i=0;i<all_num;i++)
{
if(minesArray[i]==0)
{
var r:int = i/cols;
var c:int = i%cols;
var count = 0;
count += isMine(minesArray,r-1,c);
count += isMine(minesArray,r-1,c-1);
count += isMine(minesArray,r-1,c+1);
count += isMine(minesArray,r+1,c);
count += isMine(minesArray,r+1,c-1);
count += isMine(minesArray,r+1,c+1);
count += isMine(minesArray,r,c-1);
count += isMine(minesArray,r,c+1);
minesArray[i] = count;
}
}
//mine filed
var mines:Mine[] = new Mine[all_num];
var dr = rect.height/rows;
var dc = rect.width/cols;
for(i=0;i<rows;i++)
{
for(var j=0;j<cols;j++)
{
var x = j*dc+rect.x;
var y = i*dr+rect.y;
mines[i*cols+j] = new Mine(minesArray[i*cols+j],x,y,dc,dr);
}
}
return mines;
}
/**
Update
**/
function Update () {
if(gameOver||winner)return;
//check win or not
var count_win = 0;
var count_flag = 0;
for(var i=0;i<all_num;i++)
{
if(mines[i].isFlag)
{
count_flag ++;
if(mines[i].num==-1)count_win++;
}
}
if(count_win==mine_num&&count_flag==count_win)
{
winner = true;
for(i=0;i<all_num;i++)
{
mines[i].isFace = true;
faceAll();
}
}
}
/**
OnGUI
**/
function OnGUI(){
GUI.skin = guiSkin;
if(GUI.Button(Rect(2,2,minesArea.width/cols,minesArea.height/rows),Resources.Load("77")))
{
flagMode = true;
}
if(flagMode)GUI.TextArea(Rect(Screen.width*0.5-35,2,70,20),"Flag Mode");
if(winner||gameOver)
{
if(GUI.Button(Rect(Screen.width/2-60,Screen.height*0.02,120,Screen.height*0.08),Resources.Load("restart")))
{
//Application.LoadLevel("Title");
Application.LoadLevel("minesweeper");
}
}
//绘制雷区
OnMinesGrid();
var ww = 600;
var wh = 400;
if(ww>Screen.width*0.25)
{
wh = wh*(Screen.width*0.25/ww);
ww = Screen.width*0.25;
}
if(winner)GUI.DrawTexture(Rect((Screen.width-ww)*0.5,Screen.height*0.2,ww,wh),Resources.Load("winner"));
if(gameOver)GUI.DrawTexture(Rect((Screen.width-ww)*0.5,Screen.height*0.2,ww,wh),Resources.Load("lose"));
}
//绘制雷区
function OnMinesGrid()
{
for(var i=0;i<all_num;i++)
{
var img;
if(mines[i].isFlag) img = "77";
else if(mines[i].isFace) img = mines[i].face;
else img = "hide";
if(GUI.Button(mines[i].rect,Resources.Load(img)))
{
if(gameOver||winner)continue;
if(mines[i].isFace)continue;
if(flagMode)
{
mines[i].isFlag = !mines[i].isFlag;
flagMode = false;
}else if(!mines[i].isFlag)
{
mines[i].isFace = true;
if(mines[i].num==-1)
{
mines[i].face = "mine_bomb";
gameOver = true;
faceAll();
}else if(mines[i].num==0)
{
//explore linked empty area
exploreEmpty(i);
}
}
}
}
}
//游戏结束展示所有雷区
function faceAll()
{
for(var i=0;i<all_num;i++)
{
mines[i].isFace = true;
}
}
//扩展与i相邻的0雷卡和所有0雷卡附近的计数标示
function exploreEmpty(i:int)
{
var list:ArrayList = new ArrayList();
list.Add(i);
for(var k=0;k<list.Count;k++)
{
var item:int = list[k];
mines[item].isFace = true;
var r:int = item/cols;
var c:int = item%cols;
var index = isEmpty(mines,r+1,c);
if(index>=0&&!list.Contains(index)&&!mines[index].isFlag)list.Add(index);
index = isEmpty(mines,r-1,c);
if(index>=0&&!list.Contains(index)&&!mines[index].isFlag)list.Add(index);
index = isEmpty(mines,r,c-1);
if(index>=0&&!list.Contains(index)&&!mines[index].isFlag)list.Add(index);
index = isEmpty(mines,r,c+1);
if(index>=0&&!list.Contains(index)&&!mines[index].isFlag)list.Add(index);
faceNumber(mines,r+1,c);
faceNumber(mines,r-1,c);
faceNumber(mines,r,c+1);
faceNumber(mines,r,c-1);
faceNumber(mines,r+1,c+1);
faceNumber(mines,r+1,c-1);
faceNumber(mines,r-1,c+1);
faceNumber(mines,r-1,c-1);
}
list.Clear();
}
function isEmpty(minesArray:Mine[],r:int,c:int):int
{
var index = r*cols+c;
if(r>=0&&r<rows&&c>=0&&c<cols&&minesArray[index].num==0)return index;
return -1;
}
function isMine(minesArray:int[],r:int,c:int):int
{
if(r>=0&&r<rows&&c>=0&&c<cols&&minesArray[r*cols+c]==-1)return 1;
return 0;
}
function faceNumber(minesArray:Mine[],r:int,c:int)
{
var index = r*cols+c;
if(r<0||r>=rows||c<0||c>=cols)return;
if(minesArray[index].num>0)minesArray[index].isFace = true;
}
//10 mine 9x9
//40 mine 16x16
//99 mine 16x30
class Mine extends System.Object
{
var num:int;//雷卡类型,-1有雷卡,0为0雷卡,1,2,3,4,5,6,7,8表示8方向上有雷卡数量
var face:String;//根据雷卡类型,定义正面朝上是应该显示的素材名称
var isFace:boolean;//是否正面朝上
var isFlag:boolean;//是否被标记旗帜
var rect:Rect;//雷卡位置
function Mine(num:int,x:int,y:int,w:int,h:int)
{
this.num = num;
if(num==-1)
{
face = "mine";
}else
{
face = num+"";
}
rect = Rect(x,y,w,h);
isFlag = isFace = false;
}
}
- 1
- 2
- 3
前往页