用vb點虐 編寫掃雷 c#做掃雷

你能夠用VB編一個掃雷游戲不?

'---------------------------------------------------------------------

做網(wǎng)站、網(wǎng)站設(shè)計服務(wù)團隊是一支充滿著熱情的團隊,執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標準與要求,同時竭誠為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)把每個網(wǎng)站當做一個產(chǎn)品來開發(fā),精雕細琢,追求一名工匠心中的細致,我們更用心!

'

'掃雷程序源代碼 (這個程序只完成了主要的部份,其他細節(jié)我想你能完成了.)

'

'

'掃雷程序最難的部份是在于如何自動打開空白區(qū)了

'我以前是用“堆?!钡姆绞竭M行判斷來打開的,

'就是把要判斷的坐標壓入用集合模擬的堆棧區(qū),然后再逐一彈出進行判斷.

'用這種方式一是要用到集合來做堆棧,二是編程煩瑣

'我想了很長時間,終于想到另外一種方法,也就是現(xiàn)在用的這種方法

'我暫時稱它為"掃描"方法吧,因為它正是用的掃描原理來打開空白區(qū)的

'"掃描"方法一是速度快,沒有用到集合,另外就是編程方便,易于讀懂程序.

'我個人對這種方法比較喜歡的,我覺得它是一個很新的思路(呵呵 別笑我笨啊)

'

'你可以任意復(fù)制或修改以下代碼以滿足你的需要,但請注明其出處

'任何問題可以和我聯(lián)系呀! Email: ZMSPU@163.COM

'

' CopyRight (C) 2003 ZMSPU 小小數(shù)點敬贈

'-----------------------------------------------------------------------

'標志說明

' 0 ~ 9 未打開的

' -1 ~ -9 已打開的

' 10 雷

' 11 已打開的空(未判斷)

' 12 已打開的空(已判斷)

' 13 標記過的

' 14 問號

'

Dim What(1 To 30, 1 To 16) As Long '點

Dim Save(1 To 30, 1 To 16) As Long '存

Dim mX As Long

Dim mY As Long '坐標

Dim mTime As Long

Dim MineFlag As Long '標記雷

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 = "加油哦,祝你好運?。?!"

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

'計算標記的雷

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

'如果標記數(shù)大于等于雷數(shù)則不處理

If T = -(What(mX + 1, mY + 1)) Then Exit Sub

'如果標記數(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

'如果標記數(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

'點到雷

Timer1.Enabled = False

Picture1.PaintPicture image1(13).Picture, mX, mY

Picture1.Enabled = False

Label3 = "哇!你點到雷了呀!重來吧?。?!"

EndGame

Timer1 = False

Picture1.Enabled = False

Exit Sub

ElseIf What(mX + 1, mY + 1) = 1 And What(mX + 1, mY + 1) = 9 Then

'點到數(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

'點到空

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

'未標記過的進行標記

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)標記過則改為?

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

'標記過?號的則

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:

'任意取一個坐標(X,Y)

X = Rnd * (mWidth - 1)

Y = Rnd * (mHeight - 1)

'如果已經(jīng)取過該坐標則重新再取

If What(X + 1, Y + 1) = 10 Then GoTo aa

'將當前坐標標記為有雷

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

'從當前列的上一列開始

StartX = X - 1

If StartX = 0 Then StartX = 1

'在當前列的下一列結(jié)束

EndX = X + 1

If EndX mWidth Then EndX = mWidth

For Y = 1 To mHeight

'如果當前位置不是雷則開始計算

If What(X, Y) 10 Then

'從當前行的上一行開始

StartY = Y - 1

If StartY = 0 Then StartY = 1

'在當前行的下一行結(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

'如果是當前位置則不計入

Else

'如果是雷則計入

If What(T, TT) = 10 Then mNumber = mNumber + 1

End If

Next

Next

If mNumber = 0 Then

'如果沒有雷在其四周則打開當前位置

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個點打開

'先打開左面的點

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

'打開左上的點

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

'再打開上面的點

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

'打開右上的點

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

'再打開右面的點

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

'再打開右下的點

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

'打開下面的點

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

'最后打開左下的點

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

'四點判斷完后將本點標記為已判斷過

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

求一個掃雷游戲程序編寫代碼,一定要是用VB.NET編寫的~急!!!!!!!!`

掃雷程序最重要的算法應(yīng)該就是空白區(qū)域展開的那段.現(xiàn)在我想到的有兩種方法

一種是遞歸算法(比較容易),一種是用類似于堆棧的算法,不過現(xiàn)在我懶的寫了,

把源碼貼出來如果大家有興趣的話可以給予改進.記得給我發(fā)一份喲,謝謝!

(本代碼為交流學習而用,大家可以任意轉(zhuǎn)載.)

下載:

掃雷中左右鍵一起按的按鍵鍵值是什么(VB.NET)

左鍵是1

右鍵是2

中鍵是4

可以組合相加

左右同時就是3,也可以寫做:vbleftbutton+vbrightbutton

VB.NET掃雷地雷是在一個控件中畫出來好還是每個方格用一個控件好呢?謝謝!

畫出來比較好,用鼠標當前坐標位置進行計算選擇的方格位置,如果一個方格用一個控件,會很浪費資源。

網(wǎng)站名稱:用vb點虐 編寫掃雷 c#做掃雷
轉(zhuǎn)載源于:http://muchs.cn/article40/ddcjdho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站導(dǎo)航、網(wǎng)站策劃、用戶體驗外貿(mào)網(wǎng)站建設(shè)小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名