Vb扫雷程序代码.docx

上传人:b****5 文档编号:8479646 上传时间:2023-01-31 格式:DOCX 页数:26 大小:19.90KB
下载 相关 举报
Vb扫雷程序代码.docx_第1页
第1页 / 共26页
Vb扫雷程序代码.docx_第2页
第2页 / 共26页
Vb扫雷程序代码.docx_第3页
第3页 / 共26页
Vb扫雷程序代码.docx_第4页
第4页 / 共26页
Vb扫雷程序代码.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

Vb扫雷程序代码.docx

《Vb扫雷程序代码.docx》由会员分享,可在线阅读,更多相关《Vb扫雷程序代码.docx(26页珍藏版)》请在冰豆网上搜索。

Vb扫雷程序代码.docx

Vb扫雷程序代码

PrivateobjMineAsNewclsWinMine

PrivateSubForm_Load()

SetobjMine、frmDisplay=Me

EndSub

PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)

'判断单击的就是哪个区域

objMine、BeginHitTestButton,x,y

EndSub

PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)

'判断当鼠标左键按下的时候鼠标指针在哪个区域

objMine、TrackHitTestButton,x,y

EndSub

PrivateSubForm_MouseUp(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)

'判断释放鼠标左键的时候鼠标指针在哪个区域

objMine、EndHitTestButton,x,y

EndSub

PrivateSubmnuBeginner_Click()

mnuBeginner、Checked=True

mnuIntermediate、Checked=False

mnuExpert、Checked=False

mnuCustom、Checked=False

'初级模式

objMine、SetMineFieldDimension8,8,10,False

objMine、mblnNewGame=True

EndSub

PrivateSubmnuCustom_Click()

mnuBeginner、Checked=False

mnuIntermediate、Checked=False

mnuExpert、Checked=False

mnuCustom、Checked=True

'中级模式

objMine、GetMineFieldDimensionsfrmCustomDlg

frmCustomDlg、Show1

'如果按ESC键,则退出

IffrmCustomDlg、mblnEscapeThenExitSub

objMine、SetMineFieldDimensionVal(frmCustomDlg、txtRows),Val(frmCustomDlg、txtColumns),Val(frmCustomDlg、txtMines),True

'卸载隐藏的对话框

UnloadfrmCustomDlg

'做好准备开始新游戏

objMine、mblnNewGame=True

EndSub

PrivateSubmnuExit_Click()

'调用terminate事件

SetobjMine=Nothing

'退出游戏

End

EndSub

PrivateSubmnuExpert_Click()

mnuBeginner、Checked=False

mnuIntermediate、Checked=False

mnuExpert、Checked=True

mnuCustom、Checked=False

'高级模式

objMine、SetMineFieldDimension16,30,100,False

objMine、mblnNewGame=True

EndSub

PrivateSubmnuIntermediate_Click()

mnuBeginner、Checked=False

mnuIntermediate、Checked=True

mnuExpert、Checked=False

mnuCustom、Checked=False

'自定义模式

objMine、SetMineFieldDimension16,16,40,False

objMine、mblnNewGame=True

EndSub

PrivateSubmnuNew_Click()

'开始新游戏

objMine、NewGame

EndSub

OptionExplicit

'判断左键就是否按下

PrivateConstLEFT_BUTTONAsByte=1

'标记没有地雷的区域

PrivateConstNONEAsByte=0

'标记就是否触雷

PrivateConstMINEAsByte=243

'已经清除地雷的区域

PrivateConstBEENAsByte=244

'标记确定已经有地雷的区域

PrivateConstFLAGGEDAsByte=2

'标记可疑区域

PrivateConstQUESTIONAsByte=1

'最大、最小行列数

PrivateConstMIN_MINESAsByte=10

PrivateConstMAX_MINESAsByte=99

PrivateConstMIN_ROWSAsInteger=8

PrivateConstMAX_ROWSAsInteger=24

PrivateConstMIN_COLSAsInteger=8

PrivateConstMAX_COLSAsInteger=36

'宽

PrivateConstmintButtonWidthAsByte=16

'高

PrivateConstmintButtonHeightAsByte=16

'总地雷数

PrivatembytNumMinesAsByte

'尚未标记的地雷数

PrivatembytCorrectHitsAsByte

'已经标记出的雷数(包括错误的)

PrivatembytTotalHitsAsByte

'不同等级游戏的总行列数

PrivatemintRowsAsInteger

PrivatemintColsAsInteger

PrivatemintRowAsInteger

PrivatemintColAsInteger

'标记就是否开始新游戏

PublicmblnNewGameAsBoolean

'标记一个鼠标单击事件正在进行

PrivatemblnHitTestBegunAsBoolean

PrivatemfrmDisplayAsForm

PrivatembytMineStatus()AsByte

PrivatembytMarked()AsByte

PrivatembytMineLocations()AsByte

PrivatemcolWrongLocationsAsNewCollection

PublicSubBeginHitTest(intButtonAsInteger,intXAsSingle,intYAsSingle)

'如果当前游戏结束则开始新的游戏

IfmblnNewGameThen

NewGame

EndIf

mblnHitTestBegun=True

'根据位图计算栅格大小

intX=Int(intX/mintButtonWidth)

intY=Int(intY/mintButtonHeight)

'退出

IfintX>=mintCols_

OrintY>=mintRows_

OrintX<0_

OrintY<0Then

ExitSub

EndIf

mintCol=intX*mintButtonWidth

mintRow=intY*mintButtonHeight

IfmbytMineStatus(intY,intX)>=BEENThenExitSub

DimblnLeftDownAsBoolean

blnLeftDown=(intButtonAndLEFT_BUTTON)>0

'如果左键单击

IfblnLeftDownThen

'如果该区域已经清除干净,则单击无效

IfmbytMarked(intY,intX)>=FLAGGEDThenExitSub

IfmbytMarked(intY,intX)=QUESTIONThen

mfrmDisplay、imgPressed、Visible=False

mfrmDisplay、imgQsPressed、Visible=False

mfrmDisplay、imgQsPressed、Left=mintCol

mfrmDisplay、imgQsPressed、Top=mintRow

mfrmDisplay、imgQsPressed、Visible=True

Else

mfrmDisplay、imgQsPressed、Visible=False

mfrmDisplay、imgPressed、Visible=False

mfrmDisplay、imgPressed、Left=mintCol

mfrmDisplay、imgPressed、Top=mintRow

mfrmDisplay、imgPressed、Visible=True

EndIf

Else

'如果右键单击

DimMsgAsString

DimCRLFAsString

CRLF=Chr$(13)&Chr$(10)

SelectCasembytMarked(intY,intX)

CaseNONE:

IfmbytTotalHits=mbytNumMinesThen

Msg="不能标记更多的雷!

"&CRLF

Msg=Msg&"一个或多个雷标记错误。

"&CRLF

Msg=Msg&"单击鼠标右键取消某些雷的标记。

"

MsgBoxMsg,vbCritical,"WinMine:

Error!

"

ExitSub

EndIf

'如果不做标记,则显示一个准备标记的图标

mfrmDisplay、PaintPicturemfrmDisplay、imgFlag,mintCol,mintRow

'增加已标记地雷的总数

mbytTotalHits=mbytTotalHits+1

mfrmDisplay、lblMinesLeft=_

"MinesLeft:

"&mbytNumMines-mbytTotalHits

'如果标记正确

IfmbytMineStatus(intY,intX)=MINEThen

mbytCorrectHits=mbytCorrectHits+1

mbytMarked(intY,intX)=FLAGGED

Else'如果标记错误

DimobjCoordsAsNewclsCoords

objCoords、mintX=intX

objCoords、mintY=intY

mcolWrongLocations、AddobjCoords

mbytMarked(intY,intX)=_

mbytTotalHits-mbytCorrectHits+2

EndIf

'如果所有地雷都正确的标记出来

IfmbytCorrectHits=mbytNumMinesThen

Msg="太棒了!

"&CRLF

Msg=Msg&"您赢了!

"&CRLF

MsgBoxMsg,vbInformation,"WinMine"

'准备开始新游戏

mblnNewGame=True

EndIf

CaseQUESTION:

'如果标记位置已做其她标记

mbytMarked(intY,intX)=NONE

'显示区域不变

mfrmDisplay、PaintPicture_

mfrmDisplay、imgButton,mintCol,mintRow

CaseElse:

mfrmDisplay、PaintPicture_

mfrmDisplay、imgQuestion,mintCol,mintRow

'总数减1

mbytTotalHits=mbytTotalHits-1

'刷新

mfrmDisplay、lblMinesLeft=_

"MinesLeft:

"&mbytNumMines-mbytTotalHits

'如果当前标记区域有地雷

IfmbytMineStatus(intY,intX)=MINEThen

'总数减1

mbytCorrectHits=mbytCorrectHits-1

Else'如果标记错误

mcolWrongLocations、RemovembytMarked(intY,intX)-2

DimintXwmAsInteger

DimintYwmAsInteger

DimiAsInteger

Fori=mbytMarked(intY,intX)-2_

TomcolWrongLocations、Count

intXwm=mcolWrongLocations(i)、mintX

intYwm=mcolWrongLocations(i)、mintY

mbytMarked(intYwm,intXwm)=_

mbytMarked(intYwm,intXwm)-1

Next

EndIf

mbytMarked(intY,intX)=QUESTION

EndSelect

EndIf

EndSub

PublicSubEndHitTest(intButtonAsInteger,intXAsSingle,intYAsSingle)

IfmblnHitTestBegunThen

'重置标记

mblnHitTestBegun=False

Else

ExitSub

EndIf

DimblnLeftDownAsBoolean

blnLeftDown=(intButtonAndLEFT_BUTTON)>0

'如果鼠标左键按下

IfblnLeftDownThen

'计算行列数

intX=Int(intX/mintButtonWidth)

intY=Int(intY/mintButtonHeight)

IfintX>=mintColsOrintY>=mintRows_

OrintX<0OrintY<0Then

ExitSub

EndIf

IfmbytMarked(intY,intX)>=FLAGGEDThenExitSub

intX=mintCol\mintButtonWidth

intY=mintRow\mintButtonHeight

IfmbytMarked(intY,intX)=QUESTIONThen

mfrmDisplay、imgQsPressed、Visible=False

Else

mfrmDisplay、imgPressed、Visible=False

EndIf

SelectCasembytMineStatus(intY,intX)

CaseIs>=BEEN:

ExitSub

CaseNONE:

OpenBlanksintX,intY

CaseMINE:

DimintXmAsInteger

DimintYmAsInteger

DimvntCoordAsVariant

DimiAsInteger

Fori=0TombytNumMines-1

intYm=mbytMineLocations(i,0)

intXm=mbytMineLocations(i,1)

IfmbytMarked(intYm,intXm)

mfrmDisplay、PaintPicturemfrmDisplay、imgMine,_

intXm*mintButtonWidth,intYm*mintButtonHeight

EndIf

Next

mfrmDisplay、PaintPicture_

mfrmDisplay、imgBlown,mintCol,mintRow

ForEachvntCoordInmcolWrongLocations

intYm=vntCoord、mintY

intXm=vntCoord、mintX

mfrmDisplay、PaintPicture_

mfrmDisplay、imgWrongMine,_

intXm*mintButtonWidth,_

intYm*mintButtonHeight

Next

'准备开始新游戏

mblnNewGame=True

DimCRLFAsString

CRLF=Chr$(13)&Chr$(10)

MsgBox"您输了!

",vbExclamation,"WinMine"

CaseElse:

mfrmDisplay、PaintPicture_

mfrmDisplay、imgPressed,mintCol,mintRow

mfrmDisplay、CurrentX=mintCol

mfrmDisplay、CurrentY=mintRow

mfrmDisplay、ForeColor=QBColor(mbytMineStatus(intY,intX))

mfrmDisplay、PrintmbytMineStatus(intY,intX)

'标记已经清除

mbytMineStatus(intY,intX)=_

mbytMineStatus(intY,intX)+BEEN

EndSelect

EndIf

EndSub

PublicPropertySetfrmDisplay(frmDisplayAsForm)

SetmfrmDisplay=frmDisplay

mfrmDisplay、FontBold=True

'为了适应游戏级别,改变窗体大小

ResizeDisplay

EndProperty

'获取当前雷区的大小

PublicSubGetMineFieldDimensions(frmDialogAsForm)

frmDialog、txtRows=mintRows

frmDialog、txtColumns=mintCols

frmDialog、txtMines=mbytNumMines

frmDialog、txtRows、SelLength=Len(frmDialog、txtRows)

frmDialog、txtColumns、SelLength=Len(frmDialog、txtColumns)

frmDialog、txtMines、SelLength=Len(frmDialog、txtMines)

EndSub

'初始化雷区

PrivateSubInitializeMineField()

ReDimmbytMineStatus(mintRows-1,mintCols-1)

ReDimmbytMarked(mintRows-1,mintCols-1)

ReDimmbytMineLocations(mbytNumMines-1,1)

Randomize

DimiAsInteger

DimrAsInteger

DimcAsInteger

Fori=0TombytNumMines-1

DimintXAsInteger

DimintYAsInteger

intX=Int(Rnd*mintCols)

intY=Int(Rnd*mintRows)

WhilembytMineStatus(intY,intX)=MINE

intX=Int(Rnd*mintCols)

intY=Int(Rnd*mintRows)

Wend

mbytMineStatus(intY,intX)=MINE

mbytMineLocations(i,0)=intY

mbytMineLocations(i,1)=intX

Forr=-1To1

Forc=-1To1

DimblnDxAsBoolean

DimblnDyAsBoolean

blnDy=intY+r>=0AndintY+r

blnDx=intX+c>=0AndintX+c

IfblnDyAndblnDxThen

IfmbytMineStatus(intY+r,intX+c)<>MINEThen

mbytMineStatus(intY+r,intX+c)=_

mbytMineStatus(intY+r,intX+c)+1

EndIf

EndIf

Next

Next

Next

EndSub

PublicSubNewGame()

'清除窗体

mfrmDisplay、Cls

'重置所有变量

mbytCorrectHits=0

mbytTotalHits=0

mintRow=-1

mintCol=-1

mblnNewGame=False

mblnHitTestBegun=False

DimiAsInteger

Fori=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1