用VB编程实现扫雷的思路?

2024-12-27 05:03:25
推荐回答(4个)
回答1:

'一个简单扫雷游戏
Option Explicit
Dim Map() As Integer
Dim Row_Num, Col_Num As Integer '范围,一个正方形的边长
Dim Ant_Num As Long '白蚁数量
Const x0 = 30 '方框左上角坐标
Const y0 = 30
Const 小快宽度 = 9
Dim a As Integer '各个小块的边长

Private Sub Command1_Click()
'重设按钮
Init_Form
End Sub

Private Sub Form_Load()
Init_Form
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim x1 As Integer, y1 As Integer
x1 = Fix((x - x0) / a): y1 = Fix((y - y0) / a)
If (x - x0) > ((Col_Num + 1) * a) Or (y - y0) > ((Col_Num + 1) * a) Then Exit Sub
If x < x0 Or y < y0 Then Exit Sub
If x < x0 + x1 * a + 2 Or _
x > x0 + x1 * a + a - 4 Or _
y < y0 + y1 * a + 2 Or _
y > y0 + y1 * a + a - 4 _
Then Exit Sub
If Button = 1 Then
If Map(x1, y1) = 0 Then
Call fan(x1, y1)
ElseIf Map(x1, y1) = 1 Then
Call lose
End If
ElseIf Button = 2 Then
Call draw_flg(x1, y1)
End If
Dim n As Integer
n = 0
Dim i As Integer, j As Integer
For i = 0 To Col_Num
For j = 0 To Row_Num
If Map(i, j) = -2 Then n = n + 1
Next j
Next i
If n = (Col_Num + 1) * (Row_Num + 1) - Ant_Num Then
Beep
CurrentX = (Col_Num / 2) * a + x0
CurrentY = (Row_Num / 2) * a + y0
Call sub1
a = Form1.FontSize
Form1.FontSize = 80
'Form1.ForeColor = vbBlack
Print "you win"
Form1.FontSize = a
End If
End Sub

Sub fan(x As Integer, y As Integer)
Dim i As Integer, j As Integer
Dim n As Integer
For i = -1 To 1
For j = -1 To 1
If j * i = 0 And Map(x + i, y + j) = 0 Then
Map(x + i, y + j) = -2
n = Counts(x + i, y + j)
Form1.Line (x0 + (i + x) * a + 2, y0 + (j + y) * a + 2)-Step(a - 4, a - 4), Form1.BackColor, BF

If n <> 0 Then
CurrentX = (x + i) * a + 2 + x0
CurrentY = (y + j) * a + 2 + y0
Select Case n
Case Is = 1
Form1.ForeColor = vbWhite
Case Is = 2
Form1.ForeColor = vbYellow
Case Is > 2
Form1.ForeColor = vbRed
End Select
Print n
ElseIf n = 0 Then

Call fan(x + i, y + j)
End If
End If
Next j
Next i
End Sub

Function Counts(x As Integer, y As Integer) As Integer
Dim i As Integer, j As Integer
For i = -1 To 1
For j = -1 To 1
If Map(x + i, y + j) = 1 Then Counts = Counts + 1
Next
Next
End Function
Sub lose()
Dim i As Integer, j As Integer
For i = 0 To Row_Num
For j = 0 To Col_Num
If Map(j, i) = 1 Then
Form1.FillColor = vbBlack
Form1.FillStyle = 0
Form1.Circle (x0 + j * a + a / 2, y0 + i * a + a / 2), a / 3, vbBlack, , , 0.8
Form1.Line (x0 + j * a, y0 + i * a)-Step(a, a), vbWhite
Form1.Line (x0 + j * a + a, y0 + i * a)-Step(-a, a), vbWhite

ElseIf Map(j, i) = 0 Then
Form1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), Form1.BackColor, BF
CurrentX = j * a + x0
CurrentY = i * a + y0
Print Counts(j, i)
End If
Next j

Next i
Beep
a = Form1.FontSize
Form1.FontSize = 80
'Form1.ForeColor = vbBlack
Print "you lose"
Form1.FontSize = a
End Sub
Sub draw_flg(x As Integer, y As Integer)
CurrentX = x * a + x0 + 2
CurrentY = y * a + y0 + 2
Print "?"
End Sub

Public Sub Init_Form()

Form1.Cls
Form1.ScaleMode = 3
Form1.Width = 8000
Form1.Height = 6000
Form1.BackColor = vbGreen
Form1.AutoRedraw = True
Form1.Caption = "一个简单扫雷游戏 作者 zfc"
Col_Num = 10 '获取列数
Row_Num = 10 '获取行数
a = 20 '单元宽(高)度
Ant_Num = 40 '雷的数量
ReDim Map(-1 To Col_Num + 1, -1 To Row_Num + 1)
Dim i As Integer, j As Integer
For i = -1 To Row_Num + 1

For j = -1 To Col_Num + 1
Form1.Line (x0 + j * a, y0 + i * a)-Step(a, a), 0, B
Form1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), vbRed, BF
Map(j, i) = 0 '初始化位置标记为空格0
If i = -1 Or i = Row_Num + 1 Or j = -1 Or j = Row_Num + 1 Then
Form1.Line (x0 + j * a + 1, y0 + i * a + 1)-Step(a - 2, a - 2), RGB(100, 120, 100), BF '画四周墙体
Map(j, i) = -1 '四周位置标记为墙体:-1
End If
Next j

Next i
Dim x As Integer, y As Integer
For i = 1 To Ant_Num
1000
Randomize
x = Rnd * Col_Num
y = Rnd * Row_Num
DoEvents
If Map(x, y) <> 0 Then GoTo 1000
Map(x, y) = 1
Next
End Sub

Sub sub1()

Dim i As Integer, j As Integer
For i = 0 To Row_Num
For j = 0 To Col_Num
If Map(j, i) = 1 Then
Form1.FillColor = vbBlack
Form1.FillStyle = 0
Form1.Circle (x0 + j * a + a / 2, y0 + i * a + a / 2), a / 3, vbBlack, , , 0.8
ElseIf Map(j, i) = 0 Then
Form1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), Form1.BackColor, BF
CurrentX = j * a + x0
CurrentY = i * a + y0
Print Counts(j, i)
End If
Next j

Next i
End Sub

回答2:

建立按钮(CommandButton)控件组和文字框(Label)控件组,在Form_Load事件里改变两个控件组每个控件元素的位置,再声明一个逻辑类型数组,开始时随机生成雷的位置,令数组等于True。单击按钮时判断数组的第index个值是否为True,是就GameOver……

回答3:

建立二维数组,即网格。
随机生成雷的位置
利用循环算出雷周围的数字
其他就是显示的问题了

回答4:

没用过,坐等高手