畫出來比較好,用鼠標(biāo)當(dāng)前坐標(biāo)位置進(jìn)行計算選擇的方格位置,如果一個方格用一個控件,會很浪費(fèi)資源。
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、楊浦網(wǎng)絡(luò)推廣、微信平臺小程序開發(fā)、楊浦網(wǎng)絡(luò)營銷、楊浦企業(yè)策劃、楊浦品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供楊浦建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:muchs.cn
左鍵是1
右鍵是2
中鍵是4
可以組合相加
左右同時就是3,也可以寫做:vbleftbutton+vbrightbutton
掃雷程序最重要的算法應(yīng)該就是空白區(qū)域展開的那段.現(xiàn)在我想到的有兩種方法
一種是遞歸算法(比較容易),一種是用類似于堆棧的算法,不過現(xiàn)在我懶的寫了,
把源碼貼出來如果大家有興趣的話可以給予改進(jìn).記得給我發(fā)一份喲,謝謝!
(本代碼為交流學(xué)習(xí)而用,大家可以任意轉(zhuǎn)載.)
下載:
'---------------------------------------------------------------------
'
'掃雷程序源代碼 (這個程序只完成了主要的部份,其他細(xì)節(jié)我想你能完成了.)
'
'
'掃雷程序最難的部份是在于如何自動打開空白區(qū)了
'我以前是用“堆?!钡姆绞竭M(jìn)行判斷來打開的,
'就是把要判斷的坐標(biāo)壓入用集合模擬的堆棧區(qū),然后再逐一彈出進(jìn)行判斷.
'用這種方式一是要用到集合來做堆棧,二是編程煩瑣
'我想了很長時間,終于想到另外一種方法,也就是現(xiàn)在用的這種方法
'我暫時稱它為"掃描"方法吧,因?yàn)樗怯玫膾呙柙韥泶蜷_空白區(qū)的
'"掃描"方法一是速度快,沒有用到集合,另外就是編程方便,易于讀懂程序.
'我個人對這種方法比較喜歡的,我覺得它是一個很新的思路(呵呵 別笑我笨啊)
'
'你可以任意復(fù)制或修改以下代碼以滿足你的需要,但請注明其出處
'任何問題可以和我聯(lián)系呀! Email: ZMSPU@163.COM
'
' CopyRight (C) 2003 ZMSPU 小小數(shù)點(diǎn)敬贈
'-----------------------------------------------------------------------
'標(biāo)志說明
' 0 ~ 9 未打開的
' -1 ~ -9 已打開的
' 10 雷
' 11 已打開的空(未判斷)
' 12 已打開的空(已判斷)
' 13 標(biāo)記過的
' 14 問號
'
Dim What(1 To 30, 1 To 16) As Long '點(diǎn)
Dim Save(1 To 30, 1 To 16) As Long '存
Dim mX As Long
Dim mY As Long '坐標(biāo)
Dim mTime As Long
Dim MineFlag As Long '標(biāo)記雷
Dim OpenFlag As Long '已打開的
Dim NowWidth As Long
Dim NowHeight As Long
Dim TotMine As Long '總雷數(shù)
Private Sub Command1_Click()
Timer1.Enabled = True
Label2 = "00:00"
Label1 = TotMine
Label3 = "加油哦,祝你好運(yùn)?。。?
Picture1.Enabled = True
For X = 0 To NowWidth - 1
For Y = 0 To NowHeight - 1
Picture1.PaintPicture image1(9).Picture, X, Y
Next
Next
ClearStart NowWidth, NowHeight, TotMine
WriteNumber NowWidth, NowHeight
End Sub
Private Sub Command2_Click()
If Command2.Caption = "顯示源代碼" Then
Command2.Caption = "隱藏源代碼"
Frame2.Visible = True
Else
Command2.Caption = "顯示源代碼"
Frame2.Visible = False
End If
End Sub
Private Sub Form_Load()
Dim X As Long
Dim Y As Long
Show
NowHeight = 16
NowWidth = 30
TotMine = 40
Picture1.Height = (image1(0).Height) * NowHeight
Picture1.Width = (image1(0).Width) * NowWidth
Picture1.ScaleMode = 3
Picture1.ScaleHeight = NowHeight
Picture1.ScaleWidth = NowWidth
For X = 0 To NowWidth - 1
For Y = 0 To NowHeight - 1
Picture1.PaintPicture image1(9).Picture, X, Y
Next
Next
ClearStart NowWidth, NowHeight, TotMine
WriteNumber NowWidth, NowHeight
Exit Sub
'--------------------------
For X = 1 To NowWidth
For Y = 1 To NowHeight
If What(X, Y) = 10 Then
Picture1.PaintPicture image1(13).Picture, X - 1, Y - 1
ElseIf What(X, Y) = 1 And What(X, Y) = 9 Then
Picture1.PaintPicture image1(What(X, Y)).Picture, X - 1, Y - 1
Else
Picture1.PaintPicture image1(9).Picture, X - 1, Y - 1
End If
Next
Next
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
Dim T As Long
Dim X1 As Long
Dim Y1 As Long
Dim x2 As Single
Dim y2 As Single
mX = Int(X)
mY = Int(Y)
If Button = vbLeftButton Then
'左鍵按下
If What(mX + 1, mY + 1) = 0 And What(mX + 1, mY + 1) = 10 Then
Picture1.PaintPicture image1(14).Picture, mX, mY
End If
ElseIf Button = vbRightButton Then
'右鍵按下
'只有是打開的才處理
If What(mX + 1, mY + 1) = -9 And What(mX + 1, mY + 1) = -1 Then
T = 0
'計算標(biāo)記的雷
For X1 = mX To mX + 2
For Y1 = mY To mY + 2
If X1 = mX + 1 And Y1 = mY + 1 Then
Else
If X1 = 1 And X1 = NowWidth Then
If Y1 = 1 And Y1 = NowHeight Then
If What(X1, Y1) = 13 Then
T = T + 1
End If
End If
End If
End If
Next
Next
'如果標(biāo)記數(shù)大于等于雷數(shù)則不處理
If T = -(What(mX + 1, mY + 1)) Then Exit Sub
'如果標(biāo)記數(shù)等于雷數(shù)則打開
If T = -What(mX + 1, mY + 1) Then
For X1 = mX To mX + 2
For Y1 = mY To mY + 2
If X1 = mX + 1 And Y1 = mY + 1 Then
Else
If X1 = 1 And X1 = NowWidth Then
If Y1 = 1 And Y1 = NowHeight Then
x2 = X1: y2 = Y1
Picture1_MouseUp vbLeftButton, 0, x2, y2
End If
End If
End If
Next
Next
Exit Sub
End If
'如果標(biāo)記數(shù)小于雷數(shù)則按下余下的
For X1 = mX To mX + 2
For Y1 = mY To mY + 2
If X1 = mX + 1 And Y1 = mY + 1 Then
Else
If X1 = 1 And X1 = NowWidth Then
If Y1 = 1 And Y1 = NowHeight Then
If What(X1, Y1) = 0 And What(X1, Y1) = 10 Then
' Picture1.PaintPicture image1(14).Picture, X1 - 1, Y1 -
1
' Picture1.PaintPicture image1(9).Picture, X1 - 1, Y1 - 1
End If
End If
End If
End If
Next
Next
End If
End If
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single,
Y As Single)
If Button = vbLeftButton Then
'左擊
If What(mX + 1, mY + 1) = 10 Then
'點(diǎn)到雷
Timer1.Enabled = False
Picture1.PaintPicture image1(13).Picture, mX, mY
Picture1.Enabled = False
Label3 = "哇!你點(diǎn)到雷了呀!重來吧?。?!"
EndGame
Timer1 = False
Picture1.Enabled = False
Exit Sub
ElseIf What(mX + 1, mY + 1) = 1 And What(mX + 1, mY + 1) = 9 Then
'點(diǎn)到數(shù)字
OpenFlag = OpenFlag + 1
Picture1.PaintPicture image1(What(mX + 1, mY + 1)).Picture, mX, mY
What(mX + 1, mY + 1) = -What(mX + 1, mY + 1)
ElseIf What(mX + 1, mY + 1) = 0 Then
'點(diǎn)到空
Picture1.PaintPicture image1(0).Picture, mX, mY
What(mX + 1, mY + 1) = 11
OpenBlank mX + 1, mY + 1
End If
If MineFlag + OpenFlag = NowHeight * NowWidth Then
Label3 = "恭喜恭喜!你過關(guān)了!"
Timer1.Enabled = False
Picture1.Enabled = False
End If
ElseIf Button = vbRightButton Then
'右擊
If What(mX + 1, mY + 1) = 0 And What(mX + 1, mY + 1) = 10 Then
'未標(biāo)記過的進(jìn)行標(biāo)記
Save(mX + 1, mY + 1) = What(mX + 1, mY + 1)
What(mX + 1, mY + 1) = 13
Picture1.PaintPicture image1(10).Picture, mX, mY
MineFlag = MineFlag + 1
Label1 = TotMine - MineFlag
ElseIf What(mX + 1, mY + 1) = 13 Then
'已經(jīng)標(biāo)記過則改為?
What(mX + 1, mY + 1) = 14
MineFlag = MineFlag - 1
Label1 = TotMine - MineFlag
Picture1.PaintPicture image1(11).Picture, mX, mY
ElseIf What(mX + 1, mY + 1) = 14 Then
'標(biāo)記過?號的則
What(mX + 1, mY + 1) = Save(mX + 1, mY + 1)
Picture1.PaintPicture image1(9).Picture, mX, mY
End If
End If
End Sub
Private Sub ClearStart(ByVal mWidth As Long, ByVal mHeight As Long, ByVal
MineNumber As Long)
'預(yù)置雷位置
Randomize
mTime = 0
MineFlag = 0
OpenFlag = 0
'清空數(shù)組
Erase What
For T = 1 To MineNumber
aa:
'任意取一個坐標(biāo)(X,Y)
X = Rnd * (mWidth - 1)
Y = Rnd * (mHeight - 1)
'如果已經(jīng)取過該坐標(biāo)則重新再取
If What(X + 1, Y + 1) = 10 Then GoTo aa
'將當(dāng)前坐標(biāo)標(biāo)記為有雷
What(X + 1, Y + 1) = 10
Save(X + 1, Y + 1) = 10
Next
End Sub
Private Sub WriteNumber(ByVal mWidth As Long, ByVal mHeight As Long)
'寫入信息
Dim X As Long
Dim Y As Long
Dim StartX As Long
Dim StartY As Long
Dim EndX As Long
Dim EndY As Long
Dim T As Long
Dim TT
Dim mNumber As Long
For X = 1 To mWidth
'從當(dāng)前列的上一列開始
StartX = X - 1
If StartX = 0 Then StartX = 1
'在當(dāng)前列的下一列結(jié)束
EndX = X + 1
If EndX mWidth Then EndX = mWidth
For Y = 1 To mHeight
'如果當(dāng)前位置不是雷則開始計算
If What(X, Y) 10 Then
'從當(dāng)前行的上一行開始
StartY = Y - 1
If StartY = 0 Then StartY = 1
'在當(dāng)前行的下一行結(jié)束
EndY = Y + 1
If EndY mHeight Then EndY = mHeight
'累加器置0
mNumber = 0
'計算四周有多少顆雷
For T = StartX To EndX
For TT = StartY To EndY
If TT = Y And T = X Then
'如果是當(dāng)前位置則不計入
Else
'如果是雷則計入
If What(T, TT) = 10 Then mNumber = mNumber + 1
End If
Next
Next
If mNumber = 0 Then
'如果沒有雷在其四周則打開當(dāng)前位置
What(X, Y) = 0
Save(X, Y) = 0
Else
'寫入雷數(shù)
What(X, Y) = mNumber
Save(X, Y) = mNumber
End If
End If
Next
Next
End Sub
Private Sub Timer1_Timer()
Dim sTime As String
Dim mM As Long
Dim mS As Long
Dim sM As String
Dim sS As String
mTime = mTime + 1
mM = Int(mTime / 60)
mS = mTime - mM
sS = mS
sM = mM
If mM 10 Then sM = "0" mM
If mS 10 Then sS = "0" mS
Label2 = sM ":" sS
End Sub
Private Sub OpenBlank(ByVal zmX As Long, ByVal zmY As Long)
Dim Continue As Boolean
Dim mX As Long
Dim mY As Long
OpenFlag = OpenFlag + 1
Do While True
Continue = False
For mY = 1 To NowHeight
For mX = 1 To NowWidth
If What(mX, mY) = 11 Then
'如果存在未判斷的空
Continue = True
'把它周圍的8個點(diǎn)打開
'先打開左面的點(diǎn)
If mX - 1 = 1 Then
If What(mX - 1, mY) = 0 Then
What(mX - 1, mY) = 11
Picture1.PaintPicture image1(0).Picture, mX - 2, mY - 1
OpenFlag = OpenFlag + 1
ElseIf What(mX - 1, mY) = 1 And What(mX - 1, mY) = 9 Then
Picture1.PaintPicture image1(What(mX - 1, mY)).Picture, mX
- 2, mY - 1
What(mX - 1, mY) = -What(mX - 1, mY)
OpenFlag = OpenFlag + 1
End If
End If
'打開左上的點(diǎn)
If mX - 1 = 1 And mY - 1 = 1 Then
If What(mX - 1, mY - 1) = 0 Then
What(mX - 1, mY - 1) = 11
Picture1.PaintPicture image1(0).Picture, mX - 2, mY - 2
OpenFlag = OpenFlag + 1
ElseIf What(mX - 1, mY - 1) = 1 And What(mX - 1, mY - 1)
= 9 Then
Picture1.PaintPicture image1(What(mX - 1, mY -
1)).Picture, mX - 2, mY - 2
What(mX - 1, mY - 1) = -What(mX - 1, mY - 1)
OpenFlag = OpenFlag + 1
End If
End If
'再打開上面的點(diǎn)
If mY - 1 = 1 Then
If What(mX, mY - 1) = 0 Then
What(mX, mY - 1) = 11
Picture1.PaintPicture image1(0).Picture, mX - 1, mY - 2
OpenFlag = OpenFlag + 1
ElseIf What(mX, mY - 1) = 1 And What(mX, mY - 1) = 9 Then
Picture1.PaintPicture image1(What(mX, mY - 1)).Picture, mX
- 1, mY - 2
What(mX, mY - 1) = -What(mX, mY - 1)
OpenFlag = OpenFlag + 1
End If
End If
'打開右上的點(diǎn)
If mY - 1 = 1 And mX + 1 = NowWidth Then
If What(mX + 1, mY - 1) = 0 Then
What(mX + 1, mY - 1) = 11
Picture1.PaintPicture image1(0).Picture, mX, mY - 2
OpenFlag = OpenFlag + 1
ElseIf What(mX + 1, mY - 1) = 1 And What(mX + 1, mY - 1)
= 9 Then
Picture1.PaintPicture image1(What(mX + 1, mY -
1)).Picture, mX, mY - 2
What(mX + 1, mY - 1) = -What(mX + 1, mY - 1)
OpenFlag = OpenFlag + 1
End If
End If
'再打開右面的點(diǎn)
If mX + 1 = NowWidth Then
If What(mX + 1, mY) = 0 Then
What(mX + 1, mY) = 11
Picture1.PaintPicture image1(0).Picture, mX, mY - 1
OpenFlag = OpenFlag + 1
ElseIf What(mX + 1, mY) = 1 And What(mX + 1, mY) = 9 Then
Picture1.PaintPicture image1(What(mX + 1, mY)).Picture, mX,
mY - 1
What(mX + 1, mY) = -What(mX + 1, mY)
OpenFlag = OpenFlag + 1
End If
End If
'再打開右下的點(diǎn)
If mY + 1 = NowHeight And mX + 1 = NowWidth Then
If What(mX + 1, mY + 1) = 0 Then
What(mX + 1, mY + 1) = 11
Picture1.PaintPicture image1(0).Picture, mX, mY
OpenFlag = OpenFlag + 1
ElseIf What(mX + 1, mY + 1) = 1 And What(mX + 1, mY + 1)
= 9 Then
Picture1.PaintPicture image1(What(mX + 1, mY +
1)).Picture, mX, mY
What(mX + 1, mY + 1) = -What(mX + 1, mY + 1)
OpenFlag = OpenFlag + 1
End If
End If
'打開下面的點(diǎn)
If mY + 1 = NowHeight Then
If What(mX, mY + 1) = 0 Then
What(mX, mY + 1) = 11
Picture1.PaintPicture image1(0).Picture, mX - 1, mY
OpenFlag = OpenFlag + 1
ElseIf What(mX, mY + 1) = 1 And What(mX, mY + 1) = 9 Then
Picture1.PaintPicture image1(What(mX, mY + 1)).Picture, mX
- 1, mY
What(mX, mY + 1) = -What(mX, mY + 1)
OpenFlag = OpenFlag + 1
End If
End If
'最后打開左下的點(diǎn)
If mY + 1 = NowHeight And mX - 1 = 1 Then
If What(mX - 1, mY + 1) = 0 Then
What(mX - 1, mY + 1) = 11
Picture1.PaintPicture image1(0).Picture, mX - 2, mY
OpenFlag = OpenFlag + 1
ElseIf What(mX - 1, mY + 1) = 1 And What(mX - 1, mY + 1)
= 9 Then
Picture1.PaintPicture image1(What(mX - 1, mY +
1)).Picture, mX - 2, mY
What(mX - 1, mY + 1) = -What(mX - 1, mY + 1)
OpenFlag = OpenFlag + 1
End If
End If
'四點(diǎn)判斷完后將本點(diǎn)標(biāo)記為已判斷過
What(mX, mY) = 12
End If
Next
Next
If Continue = False Then Exit Do
Loop
End Sub
Private Sub EndGame()
Dim X As Long
Dim Y As Long
For Y = 1 To NowHeight
For X = 1 To NowWidth
If What(X, Y) = 10 Then
Picture1.PaintPicture image1(13).Picture, X - 1, Y - 1
Else
If What(X, Y) = 13 Then
If Save(X, Y) 10 Then
Picture1.PaintPicture image1(12).Picture, X - 1, Y - 1
End If
ElseIf What(X, Y) = 14 Then
If Save(X, Y) = 10 Then
Picture1.PaintPicture image1(13).Picture, X - 1, Y - 1
End If
End If
End If
Next
Next
End Sub
網(wǎng)站題目:掃雷編程vb.net 掃雷編程素材
當(dāng)前URL:http://muchs.cn/article14/doeoede.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、自適應(yīng)網(wǎng)站、標(biāo)簽優(yōu)化、網(wǎng)站收錄、服務(wù)器托管、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)