迷宫,简单游戏
不想说什么了,迷宫产生部分是网上找的,然后把它拆成二个部分,然后再加上游戏部分就是了。整个代码如下:
程序代码:
Option Explicit 'Dim A(1001, 1001) Dim A() Dim mx As Long Dim my As Long Private Const 格子大小 = 500 Private Const 边距 = 500 Dim Rx As Long, Ry As Long Dim RB As Long Private Sub Command1_Click() Call 产生迷宫(Int(Picture1.ScaleWidth / 500) * 500 - 1000, Int(Picture1.ScaleHeight / 500) * 500 - 1000, Picture1) Picture1.SetFocus End Sub Private Sub 产生迷宫(szx As Long, szy As Long, obj As Object) 'Dim szx As Long 'Dim szy As Long 'Dim tr As Long 'Dim l As Long Dim i As Long Dim x As Long Dim y As Long Dim s As Long Dim xx As Long Dim yy As Long Dim R As Long Dim q As Long, p As Long Dim qq As Long, pp As Long Dim t As Long 'szx = 10000 '整个迷宫的长 'szy = 15000 '整个迷宫的宽 'tr = 500 '离左,上边的距离 'l = 500 '格子的大小 mx = szx / 格子大小 my = szy / 格子大小 ReDim A(mx + 1, my + 1) For i = 0 To mx + 1 '给边边赋值-1 A(i, 0) = -1 A(i, my + 1) = -1 Next For i = 0 To my + 1 A(0, i) = -1 A(mx + 1, i) = -1 Next x = mx - 1 y = my s = 1 A(x, y) = s '此段是网上找的代码 Do While Not (x = 2 And y = 1) '从右下角开始 寻找一条路径到左上角,每经过一个点就赋值s s会自己累加 If A(x - 1, y) = 0 Or A(x, y - 1) = 0 Or A(x, y + 1) = 0 Or A(x + 1, y) = 0 Then Do Until A(xx, yy) = 0 R = Int(Rnd(1) * 4) xx = x + (R = 0) - (R = 2) yy = y + (R = 1) - (R = 3) Loop x = xx y = yy s = s + 1 A(x, y) = s Else For i = 0 To 3 xx = x + (i = 0) - (i = 2) yy = y + (i = 1) - (i = 3) If A(xx, yy) = s - 1 Then x = xx y = yy s = A(x, y) Exit For End If Next End If 'Call VIEW(Me) 'DEUBG Loop For q = my To 1 Step -1 '扫描所有的点 找到值为1以下的点 For p = mx To 1 Step -1 If A(p, q) > 0 Then Else Do R = Int(Rnd(1) * 4) pp = p + (R = 0) - (R = 2) qq = q + (R = 1) - (R = 3) Loop Until A(pp, qq) >= 1 x = p y = q s = A(pp, qq) * 2 + 1000 A(x, y) = s Do While Not (x = 2 And y = 1) '从找到的点 开始寻找路径到左上角,没路的话就跳出 并给经过的点赋值s If A(x - 1, y) = 0 Or A(x, y - 1) = 0 Or A(x, y + 1) = 0 Or A(x + 1, y) = 0 Then Do Until A(xx, yy) = 0 R = Int(Rnd(1) * 4) xx = x + (R = 0) - (R = 2) yy = y + (R = 1) - (R = 3) Loop x = xx y = yy s = s + 1 A(x, y) = s Else For i = 0 To 3 xx = x + (i = 0) - (i = 2) yy = y + (i = 1) - (i = 3) If A(xx, yy) = s - 1 Then x = xx y = yy s = A(x, y) Exit For End If Next Exit Do End If Loop End If Next Next '定义出口,以便直接输出出口的位置,不需要擦线 A(mx - 1, my + 1) = 0 '出口 '小人位置 Rx = 2 Ry = 1 RB = 0 '显示 Call VIEW(obj) End Sub Private Sub Command2_Click() Call VIEW(Picture1) '这句是打印迷宫的命令,A4纸横放的默认打印机 ' Call 产生迷宫(10000, 15000, Printer) End Sub Public Sub VIEW(obj As Object) '显示迷宫 Dim x As Long, y As Long Dim t As Long If Not obj Is Printer Then obj.Cls End If For x = 1 To mx '从左上角开始向下和向右扫描每个点的值,假如是同一路径的点就不画线 其他画线 For y = 1 To my 'DEBUG 用 ' obj.CurrentX = x * 格子大小 + 边距 - 格子大小 ' obj.CurrentY = y * 格子大小 + 边距 - 格子大小 ' obj.Print A(x, y) '这个判断,没弄懂怎么来的,注意这个判断里有时有问题,但情况极少 t = Abs(A(x, y) - A(x + 1, y)) If t <= 1 Or t - 1000 = A(x, y) Or t - 1000 = A(x + 1, y) Then Else obj.Line (x * 格子大小 + 边距, y * 格子大小 - 格子大小 + 边距)-(x * 格子大小 + 边距, y * 格子大小 + 边距) End If '上面是向下的判断,这个是向右的判断 t = Abs(A(x, y) - A(x, y + 1)) If t <= 1 Or t - 1000 = A(x, y) Or t - 1000 = A(x, y + 1) Then Else obj.Line (x * 格子大小 - 格子大小 + 边距, y * 格子大小 + 边距)-(x * 格子大小 + 边距, y * 格子大小 + 边距) End If Next Next 'obj.Line (tr, tr)-(tr + szx, tr + szy), , B '画整个迷宫的边框 obj.Line (边距, 边距)-(边距 + 边距, 边距) '画最上面那根线的左边部分 obj.Line (边距 + 2 * 边距, 边距)-(边距 + mx * 格子大小, 边距) '画最上面那根线的右边部分 obj.Line (边距, 边距)-(边距, 边距 + my * 格子大小) '画迷宫的最左边那根线 '原来采用清除的办法画出口,如果是打印的话,此方法有问题,取消 'obj.Line (L + tr, tr)-(L + L + tr, tr), &H8000000F '画迷宫的入口 'obj.Line (szx - L + tr, szy + tr)-(szx - L - L + tr, szy + tr), &H8000000F '画迷宫的出口 If obj Is Printer Then obj.EndDoc End If Call 显示小人 DoEvents End Sub Private Sub Command3_Click() Call VIEWEND End Sub Private Sub VIEWEND() '显示从入口到结束的路线 Dim i As Long Dim x As Long Dim y As Long Dim x1 As Long Dim y1 As Long Dim 半格 As Long 半格 = 格子大小 / 2 i = A(2, 1) x = 2 y = 0 x1 = 2 y1 = 1 '从外面画到入口 Picture1.Line (边距 + x * 格子大小 - 半格, 边距 + y * 格子大小 - 半格)-(边距 + x1 * 格子大小 - 半格, 边距 + y1 * 格子大小 - 半格), RGB(255, 0, 0) x = 2 y = 1 '搜索方位, Do While i > 0 If A(x - 1, y) = i - 1 Then x1 = x - 1 y1 = y i = i - 1 End If If A(x + 1, y) = i - 1 Then x1 = x + 1 y1 = y i = i - 1 End If If A(x, y - 1) = i - 1 Then x1 = x y1 = y - 1 i = i - 1 End If If A(x, y + 1) = i - 1 Then x1 = x y1 = y + 1 i = i - 1 End If Picture1.Line (边距 + x * 格子大小 - 半格, 边距 + y * 格子大小 - 半格)-(边距 + x1 * 格子大小 - 半格, 边距 + y1 * 格子大小 - 半格), RGB(255, 0, 0) x = x1 y = y1 Loop End Sub Private Sub Command4_Click() '小人位置 Rx = 2 Ry = 1 RB = 0 Call VIEW(Picture1) End Sub Private Sub Form_Load() Randomize Timer End Sub Private Sub Form_Resize() On Error Resume Next Picture1.Move Picture1.Left, Picture1.Top, Me.ScaleWidth - Picture1.Left - Picture1.Left, Me.ScaleHeight - Picture1.Top - 64 End Sub Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) 'MsgBox KeyCode Dim x As Long, y As Long Dim 半格 As Long 半格 = 格子大小 / 2 Dim t As Long x = Rx y = Ry '方向键,并记录步数 Select Case KeyCode Case vbKeyLeft x = x - 1 RB = RB + 1 Case vbKeyRight x = x + 1 RB = RB + 1 Case vbKeyUp y = y - 1 RB = RB + 1 Case vbKeyDown y = y + 1 RB = RB + 1 End Select If x > 0 And y > 0 And x <= mx And y <= my Then '判断是否能通过,使用了前面看不懂的判断 t = Abs(A(Rx, Ry) - A(x, y)) If t <= 1 Or t - 1000 = A(Rx, Ry) Or t - 1000 = A(x, y) Then Picture1.Line (边距 + Rx * 格子大小 - 半格, 边距 + Ry * 格子大小 - 半格)- _ (边距 + x * 格子大小 - 半格, 边距 + y * 格子大小 - 半格), RGB(0, 255, 0) '此行分成二行写 Rx = x Ry = y Call 显示小人 End If End If End Sub Private Sub 显示小人() Dim i As Long Image1.Move 边距 + Rx * 格子大小 - 格子大小 + 100, 边距 + Ry * 格子大小 - 格子大小 + 100 Label1.Caption = RB & " / " & A(2, 1) - 1 If Rx = mx - 1 And Ry = my Then MsgBox "祝贺你走出了这个迷宫,你的成绩是 " & RB & " 步,本迷宫最佳路线是 " & A(2, 1) - 1 & " 步。", vbInformation End If End Sub