扫雷游戏代码.docx
《扫雷游戏代码.docx》由会员分享,可在线阅读,更多相关《扫雷游戏代码.docx(10页珍藏版)》请在冰豆网上搜索。
扫雷游戏代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceMine
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
privateButton[,]Mines;
privateintXNum=8;//一行方块的数目
privateintYNum=9;//一列方块的数目
privateintMineNum=10;//雷的总数
privateint[,]Turn;//==-1表示这个位置已经翻开;
//==0表示这个位置没有翻开;
//==1表示这个位置插上红旗;
privateintCostTime=0;//所用时间
privateintRestMine=10;//剩余的雷数
privateintMineWidth=30;//雷方块的大小(宽度为30像素)
privatevoidForm1_Load(objectsender,EventArgse)
{
Turn=newint[XNum,YNum];
Mines=newButton[XNum,YNum];
for(intx=0;xfor(inty=0;y{
Mines[x,y]=newButton();
this.Controls.Add(Mines[x,y]);
Mines[x,y].Left=10+MineWidth*x;
Mines[x,y].Top=50+MineWidth*y;
Mines[x,y].Width=MineWidth;
Mines[x,y].Height=MineWidth;
Mines[x,y].Font=newFont("宋体",10.5F,FontStyle.Bold,GraphicsUnit.Point,((byte)(134)));
Mines[x,y].BackgroundImageLayout=System.Windows.Forms.ImageLayout.Stretch;
Mines[x,y].Name="Mines"+(x+y*XNum).ToString();
Mines[x,y].MouseUp+=newMouseEventHandler(bt_MouseUp);
Mines[x,y].Visible=false;
}
}
privatevoidGameInit()//游戏初始化
{
for(intx=0;xfor(inty=0;y{
Mines[x,y].Text="";
Mines[x,y].Visible=true;
Mines[x,y].Enabled=true;
Mines[x,y].Tag=null;
Mines[x,y].BackgroundImage=null;
Turn[x,y]=0;
}
LayMines();
}
///
///布雷
///
privatevoidLayMines()
{
intx,y;
Randoms=newRandom();
//取随机数
for(inti=0;i{
//取随机数
x=s.Next(XNum);
y=s.Next(YNum);
if(Convert.ToInt16(Mines[x,y].Tag)!
=1)
{
//==1时,代表这个位置是地雷
Mines[x,y].Tag=1;//修改属性为雷
//Mines[x,y].Text="u";
i++;
}
}
}
///
///获取某个小方块区域相邻8个区域的雷个数
///
privateintGetAroundNum(introw,intcol)
{
inti,j;
intaround=0;
intminRow=(row==0)?
0:
row-1;
intmaxRow=row+2;
intminCol=(col==0)?
0:
col-1;
intmaxCol=col+2;
for(i=minRow;i{
for(j=minCol;j{
if(!
IsInMineArea(i,j))//判断是否在扫雷区域
continue;
if(Convert.ToInt16(Mines[i,j].Tag)==1)around++;
}
}
returnaround;
}
///
///判断是否在扫雷区域
///
privateboolIsInMineArea(introw,intcol)
{
return(row>=0&&row=0&&col}
///
///雷方块拓展(对于周围无雷的空白区域)
///
privatevoidExpandMines(introw,intcol)
{
inti,j;
intminRow=(row==0)?
0:
row-1;
intmaxRow=row+2;
intminCol=(col==0)?
0:
col-1;
intmaxCol=col+2;
intaround=GetAroundNum(row,col);
//对周围一个雷都没有的空白区域拓展
if(around==0)
{
Mines[row,col].Enabled=false;
for(i=minRow;i{
for(j=minCol;j{
//对于周围可以拓展的区域进行的规拓展
if(!
IsInMineArea(i,j))continue;
if(!
(i==row&&j==col)&&Mines[i,j].Enabled!
=false)
//&&Convert.ToInt16(Mines[i,j].Tag)!
=1
{
ExpandMines(i,j);
}
Mines[i,j].Enabled=false;//周围无雷的区域按钮无效
if(GetAroundNum(i,j)!
=0)//周围无雷**********6--28
Mines[i,j].Text=GetAroundNum(i,j).ToString();
}
}
}
}
///
///胜利判断并处理
///
privateboolVictory()//检测是否胜利
{
for(inti=0;ifor(intj=0;j{
//没翻开且未标示,则未成功
if(Mines[i,j].Enabled==true&&Turn[i,j]!
=1)returnfalse;
//不是雷却误标示为雷,则也未成功
if(Convert.ToInt16(Mines[i,j].Tag)!
=1&&Turn[i,j]==1)returnfalse;
}
returntrue;
}
//添加按钮控件Click事件与处理方法bt_Click:
privatevoidbt_MouseUp(objectsender,MouseEventArgse)//这里处理事件方法
{
StringbtName;
ButtonbClick=(Button)sender;//将被击的按钮赋给定义的bClick变量
btName=bClick.Name;//获取按钮的Name
intn=Convert.ToInt16(btName.Substring(5));
intx=n%XNum;
inty=n/XNum;
//通过按钮Name属性来判断是哪个Button被点击,并执行相应的操作
switch(e.Button)
{
caseMouseButtons.Left:
if(Convert.ToInt16(Mines[x,y].Tag)!
=1)//不是雷
{
Mines[x,y].BackgroundImage=null;
Mines[x,y].Text=GetAroundNum(x,y).ToString();
Mines[x,y].Enabled=false;
ExpandMines(x,y);//完成无雷拓展
if(Victory())
{
//判断是否胜利,是则将地图中所有雷标识出来
show();
MessageBox.Show("胜利!
!
!
","结束");
timer1.Enabled=false;//停止计时
}
}
else//触雷
{
Mines[x,y].BackgroundImage=Image.FromFile("mine1.bmp");
MessageBox.Show("失败!
!
!
","结束");
timer1.Enabled=false;//停止计时
show();//将地图中所有雷标识出来
}
break;
caseMouseButtons.Right:
Mines[x,y].BackgroundImage=Image.FromFile("flag.bmp");
if(Turn[x,y]==1)//表示这个位置插上红旗
{
Turn[x,y]=0;//取消红旗,表示这个位置没有翻开
RestMine++;
Mines[x,y].BackgroundImage=null;
}
else
{
Turn[x,y]=1;//表示这个位置插上红旗
RestMine--;
}
lblMine.Text=RestMine.ToString();
if(Victory())
{
MessageBox.Show("胜利!
!
!
","结束");
timer1.Enabled=false;//停止计时
}
break;
}
}
privatevoidshow()//将地图中所有雷标识出来
{
for(inti=0;ifor(intj=0;jif(Convert.ToInt16(Mines[i,j].Tag)==1)
{
//==1时,代表这个位置是地雷
Mines[i,j].BackgroundImage=Image.FromFile("mine.bmp");
}
}
privatevoidbtnStart_Click(objectsender,EventArgse)
{
GameInit();//游戏初始化
timer1.Enabled=true;
}
privatevoidtimer1_Tick(objectsender,EventArgse)
{
CostTime++;
lblTime.Text=CostTime.ToString();//"用时:
"+CostTime.ToString()+"秒";
}
privatevoidbutton2_Click(objectsender,EventArgse)
{
show();//将地图中所有雷标识出来
}
}
}