Archive for January 2008
金山词霸,etc 2 comments
《宇宙涟漪中的星球》后 2 comments
雪·夜 2 comments
白雪纷下,思随落,雀飞沧横。
彩屏徐亮,情渐升,人走心随。
长夜共漫步,风冷,话白,人美。
此生同携手,无怨,无悔,无憾。
又是五分钟出品,果然可以当品牌用了……
计划 2 comments
回家啦,都回家啦 3 comments
今天被打击了 8 comments
双起点的Floyd算法的迷宫寻路应用 1 comment
Dim ChainAX() As Integer, ChainAY() As Integer, ChainBX() As Integer, ChainBY() As Integer
Dim StickAX() As Integer, StickAY() As Integer, StickBX() As Integer, StickBY() As Integer
Dim I As Integer, N As Integer
Dim Found As Boolean
Dim TimeUsed As Single
SelectionA(A, B) = 1
SelectionB(X, Y) = 1
N = 1
ReDim ChainAX(1)
ReDim ChainAY(1)
ReDim ChainBX(1)
ReDim ChainBY(1)
ReDim StickAX(1)
ReDim StickAY(1)
ReDim StickBX(1)
ReDim StickBY(1)
StickAX(1) = A
StickAY(1) = B
StickBX(1) = X
StickBY(1) = Y
Found = False
P = 0
Q = 0
N = N + 1
ReDim ChainAX(0)
ReDim ChainAY(0)
ReDim ChainBX(0)
ReDim ChainBY(0)
For I = 1 To UBound(StickAX)
If StickAX(I) < GridW Then
If SelectionA(StickAX(I) + 1, StickAY(I)) = 0 And Not (Grids(StickAX(I) + 1, StickAY(I))) Then
SelectionA(StickAX(I) + 1, StickAY(I)) = N
ReDim Preserve ChainAX(UBound(ChainAX) + 1)
ReDim Preserve ChainAY(UBound(ChainAY) + 1)
ChainAX(UBound(ChainAX)) = StickAX(I) + 1
ChainAY(UBound(ChainAY)) = StickAY(I)
End If
End If
If StickAX(I) > 1 Then
If SelectionA(StickAX(I) – 1, StickAY(I)) = 0 And Not (Grids(StickAX(I) – 1, StickAY(I))) Then
SelectionA(StickAX(I) – 1, StickAY(I)) = N
ReDim Preserve ChainAX(UBound(ChainAX) + 1)
ReDim Preserve ChainAY(UBound(ChainAY) + 1)
ChainAX(UBound(ChainAX)) = StickAX(I) – 1
ChainAY(UBound(ChainAY)) = StickAY(I)
End If
End If
If StickAY(I) < GridH Then
If SelectionA(StickAX(I), StickAY(I) + 1) = 0 And Not (Grids(StickAX(I), StickAY(I) + 1)) Then
SelectionA(StickAX(I), StickAY(I) + 1) = N
ReDim Preserve ChainAX(UBound(ChainAX) + 1)
ReDim Preserve ChainAY(UBound(ChainAY) + 1)
ChainAX(UBound(ChainAX)) = StickAX(I)
ChainAY(UBound(ChainAY)) = StickAY(I) + 1
End If
End If
If StickAY(I) > 1 Then
If SelectionA(StickAX(I), StickAY(I) – 1) = 0 And Not (Grids(StickAX(I), StickAY(I) – 1)) Then
SelectionA(StickAX(I), StickAY(I) – 1) = N
ReDim Preserve ChainAX(UBound(ChainAX) + 1)
ReDim Preserve ChainAY(UBound(ChainAY) + 1)
ChainAX(UBound(ChainAX)) = StickAX(I)
ChainAY(UBound(ChainAY)) = StickAY(I) – 1
End If
End If
Next
ReDim StickAX(UBound(ChainAX))
ReDim StickAY(UBound(ChainAY))
For I = 1 To UBound(StickAX)
StickAX(I) = ChainAX(I)
StickAY(I) = ChainAY(I)
If SelectionB(StickAX(I), StickAY(I)) > 0 Then Found = True: MidX = StickAX(I): MidY = StickAY(I)
Next
If Found Then Exit Do
For I = 1 To UBound(StickBX)
If StickBX(I) < GridW Then
If SelectionB(StickBX(I) + 1, StickBY(I)) = 0 And Not (Grids(StickBX(I) + 1, StickBY(I))) Then
SelectionB(StickBX(I) + 1, StickBY(I)) = N
ReDim Preserve ChainBX(UBound(ChainBX) + 1)
ReDim Preserve ChainBY(UBound(ChainBY) + 1)
ChainBX(UBound(ChainBX)) = StickBX(I) + 1
ChainBY(UBound(ChainBY)) = StickBY(I)
End If
End If
If StickBX(I) > 1 Then
If SelectionB(StickBX(I) – 1, StickBY(I)) = 0 And Not (Grids(StickBX(I) – 1, StickBY(I))) Then
SelectionB(StickBX(I) – 1, StickBY(I)) = N
ReDim Preserve ChainBX(UBound(ChainBX) + 1)
ReDim Preserve ChainBY(UBound(ChainBY) + 1)
ChainBX(UBound(ChainBX)) = StickBX(I) – 1
ChainBY(UBound(ChainBY)) = StickBY(I)
End If
End If
If StickBY(I) < GridH Then
If SelectionB(StickBX(I), StickBY(I) + 1) = 0 And Not (Grids(StickBX(I), StickBY(I) + 1)) Then
SelectionB(StickBX(I), StickBY(I) + 1) = N
ReDim Preserve ChainBX(UBound(ChainBX) + 1)
ReDim Preserve ChainBY(UBound(ChainBY) + 1)
ChainBX(UBound(ChainBX)) = StickBX(I)
ChainBY(UBound(ChainBY)) = StickBY(I) + 1
End If
End If
If StickBY(I) > 1 Then
If SelectionB(StickBX(I), StickBY(I) – 1) = 0 And Not (Grids(StickBX(I), StickBY(I) – 1)) Then
SelectionB(StickBX(I), StickBY(I) – 1) = N
ReDim Preserve ChainBX(UBound(ChainBX) + 1)
ReDim Preserve ChainBY(UBound(ChainBY) + 1)
ChainBX(UBound(ChainBX)) = StickBX(I)
ChainBY(UBound(ChainBY)) = StickBY(I) – 1
End If
End If
Next
ReDim StickBX(UBound(ChainBX))
ReDim StickBY(UBound(ChainBY))
For I = 1 To UBound(StickBX)
StickBX(I) = ChainBX(I)
StickBY(I) = ChainBY(I)
If SelectionA(StickBX(I), StickBY(I)) > 0 Then Found = True: MidX = StickBX(I): MidY = StickBY(I)
Next
Loop
TimeUsed = Timer – TimeUsed
TxtMB.Text = TimeUsed * 1000
End Sub
Private Sub DrawTwoRoad()
Dim I As Integer, N As Integer, A As Integer, B As Integer
ReDim RoadAX(N)
ReDim RoadAY(N)
RoadAX(1) = MidX
RoadAY(1) = MidY
For I = 2 To SelectionA(MidX, MidY)
A = RoadAX(I – 1)
B = RoadAY(I – 1)
N = N – 1
If A > 1 Then
If SelectionA(A – 1, B) = N Then
RoadAX(I) = A – 1
RoadAY(I) = B
GoTo NEXTSTEPA
End If
End If
If A < GridW Then
If SelectionA(A + 1, B) = N Then
RoadAX(I) = A + 1
RoadAY(I) = B
GoTo NEXTSTEPA
End If
End If
If B > 1 Then
If SelectionA(A, B – 1) = N Then
RoadAX(I) = A
RoadAY(I) = B – 1
GoTo NEXTSTEPA
End If
End If
If B < GridH Then
If SelectionA(A, B + 1) = N Then
RoadAX(I) = A
RoadAY(I) = B + 1
End If
End If
NEXTSTEPA:
Next
N = SelectionB(MidX, MidY)
ReDim RoadBX(N)
ReDim RoadBY(N)
RoadBX(1) = MidX
RoadBY(1) = MidY
For I = 2 To SelectionB(MidX, MidY)
A = RoadBX(I – 1)
B = RoadBY(I – 1)
N = N – 1
If A > 1 Then
If SelectionB(A – 1, B) = N Then
RoadBX(I) = A – 1
RoadBY(I) = B
GoTo NEXTSTEPB
End If
End If
If A < GridW Then
If SelectionB(A + 1, B) = N Then
RoadBX(I) = A + 1
RoadBY(I) = B
GoTo NEXTSTEPB
End If
End If
If B > 1 Then
If SelectionB(A, B – 1) = N Then
RoadBX(I) = A
RoadBY(I) = B – 1
GoTo NEXTSTEPB
End If
End If
If B < GridH Then
If SelectionB(A, B + 1) = N Then
RoadBX(I) = A
RoadBY(I) = B + 1
End If
End If
NEXTSTEPB:
Next
End Sub
迷宫与寻路 2 comments
Begin VB.Form FrmMain
Caption = "PuzzleMaze MapMaker"
ClientHeight = 7155
ClientLeft = 120
ClientTop = 420
ClientWidth = 10800
LinkTopic = "Form1"
ScaleHeight = 7155
ScaleWidth = 10800
StartUpPosition = 3 ‘窗口缺省
Begin VB.CommandButton CmdClean
Caption = "Clean"
Height = 495
Left = 0
TabIndex = 8
Top = 2040
Width = 975
End
Begin VB.CommandButton CmdRandom
Caption = "CmdRandom"
Height = 495
Left = 0
TabIndex = 7
Top = 2640
Width = 975
End
Begin VB.TextBox Text1
Height = 375
Left = 120
TabIndex = 6
Text = "Text1"
Top = 4800
Width = 735
End
Begin VB.TextBox TxtH
Height = 270
Left = 480
TabIndex = 5
Text = "1"
Top = 1560
Width = 500
End
Begin VB.TextBox TxtW
Height = 270
Left = 0
TabIndex = 4
Text = "1"
Top = 1560
Width = 500
End
Begin VB.CommandButton CmdNew
Caption = "New"
Height = 495
Left = 0
TabIndex = 3
Top = 1080
Width = 1000
End
Begin VB.CommandButton CmdLoad
Caption = "Load"
Height = 495
Left = 0
TabIndex = 2
Top = 480
Width = 1000
End
Begin VB.PictureBox PicPuzzle
BackColor = &H00FFFFFF&
BorderStyle = 0 ‘None
Height = 4095
Left = 3480
ScaleHeight = 4095
ScaleWidth = 5775
TabIndex = 1
Top = 1680
Width = 5775
End
Begin VB.CommandButton CmdSave
Caption = "Save"
Height = 495
Left = 0
TabIndex = 0
Top = 0
Width = 1000
End
End
Attribute VB_Name = "FrmMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim Grids() As Boolean
Dim GridW As Integer, GridH As Integer
Dim Selection() As Boolean
Dim ClkBtn As Integer, ClkX As Integer, ClkY As Integer, ClkStat As Boolean, ClkOn As Boolean
PicPuzzle.Top = 0
PicPuzzle.Left = 1000
GridW = 30
GridH = 30
InitialMaze GridW, GridH
TxtW.Text = GridW
TxtH.Text = GridH
End Sub
Private Sub Form_Resize()
PicPuzzle.Width = Me.ScaleWidth – 1000
PicPuzzle.Height = Me.ScaleHeight
DrawMaze GridW, GridH
End Sub
Dim W As Single, H As Single
W = PicPuzzle.ScaleWidth / GridW
H = PicPuzzle.ScaleHeight / GridH
Text1.Text = Int(X / W + 1) & "," & Int(Y / H + 1)
ClkX = Int(X / W + 1)
ClkY = Int(Y / H + 1)
If ClkOn Then
PicPuzzle_Click
End If
End Sub
Private Sub PicPuzzle_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
ClkOn = False
End Sub
Private Sub PicPuzzle_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim W As Single, H As Single
W = PicPuzzle.ScaleWidth / GridW
H = PicPuzzle.ScaleHeight / GridH
Text1.Text = Int(X / W + 1) & "," & Int(Y / H + 1)
ClkX = Int(X / W + 1)
ClkY = Int(Y / H + 1)
ClkBtn = Button
ClkStat = Grids(ClkX, ClkY)
ClkOn = True
End Sub
Private Sub PicPuzzle_Click()
On Error GoTo ERR
ClkStat = Grids(ClkX, ClkY)
If ClkBtn = 1 Then
DrawGrid ClkX, ClkY
ElseIf ClkBtn = 2 Then
DrawGrid ClkX, ClkY, True
End If
ERR:
End Sub
Private Sub PicPuzzle_DblClick()
Dim I As Integer, J As Integer
Dim W As Single, H As Single
H = PicPuzzle.Height / GridH
Grids(ClkX, ClkY) = ClkStat
FillField ClkX, ClkY
PicPuzzle.AutoRedraw = True
For I = 0 To GridW
For J = 0 To GridH
If Selection(I, J) Then
If ClkBtn = 1 And ClkStat = False Then
PicPuzzle.Line (W * I – W, H * J – H)-(W * I, H * J), vbBlue, BF
Grids(I, J) = True
End If
If ClkBtn = 2 And ClkStat = True Then
PicPuzzle.Line (W * I – W, H * J – H)-(W * I, H * J), vbWhite, BF
Grids(I, J) = False
End If
PicPuzzle.Line (W * I – W, H * J – H)-(W * I, H * J), vbBlack, B
End If
Next
Next
PicPuzzle.AutoRedraw = False
End Sub
Dim FileName As String
Dim ST As String
Dim I As Integer, J As Integer
FileName = App.Path & "Map" & FileName & ".maze"
ST = ""
For I = 1 To GridW
For J = 1 To GridH
If Grids(I, J) Then
ST = ST & "1"
Else
ST = ST & "0"
End If
Next
ST = ST & ";"
Next
Open FileName For Output As #1
Print #1, ST
Close #1
End Sub
Private Sub CmdLoad_Click()
Dim FileName As String
Dim ST As String, STS() As String
Dim I As Integer, J As Integer
FileName = App.Path & "Map" & FileName & ".maze"
Open FileName For Input As #1
Input #1, ST
Close #1
STS = Split(ST, ";")
GridH = Len(STS(0))
GridW = UBound(STS)
ReDim Grids(GridW, GridH)
For I = 0 To GridW – 1
For J = 1 To GridH
If Mid(STS(I), J, 1) = "0" Then
Grids(I + 1, J) = False
Else
Grids(I + 1, J) = True
End If
Next
Next
DrawMaze GridW, GridH
TxtW.Text = GridW
TxtH.Text = GridH
End Sub
Private Sub CmdNew_Click()
GridW = Int(Val(TxtW.Text))
GridH = Int(Val(TxtH.Text))
InitialMaze GridW, GridH
DrawMaze GridW, GridH
End Sub
Private Sub CmdClean_Click()
Dim I As Integer, J As Integer
For J = 1 To GridH
Grids(I, J) = False
Next
Next
DrawMaze GridW, GridH
End Sub
Private Sub CmdRandom_Click()
Dim I As Integer, J As Integer
Dim Seed As Single
Randomize
For I = 1 To GridW
For J = 1 To GridH
If Rnd > Seed Then
Grids(I, J) = True
End If
Next
Next
DrawMaze GridW, GridH
End Sub
TxtH.Text = Int(Val(TxtH.Text))
End Sub
TxtW.Text = Int(Val(TxtW.Text))
End Sub
Dim I As Integer, J As Integer
For I = 1 To X
For J = 1 To Y
Grids(I, J) = False
Next
Next
End Sub
Dim I As Integer
Dim PX As Single, PY As Single
Dim W As Single, H As Single
H = PicPuzzle.Height / Y
PicPuzzle.AutoRedraw = True
PicPuzzle.Cls
ReDrawGrid
For I = 0 To X – 1
PicPuzzle.Line (W * I, 0)-(W * I, PicPuzzle.Height), vbBlack
Next
For I = 0 To Y – 1
PicPuzzle.Line (0, H * I)-(PicPuzzle.Width, H * I), vbBlack
Next
PicPuzzle.AutoRedraw = False
End Sub
Dim W As Single, H As Single
H = PicPuzzle.Height / GridH
PicPuzzle.AutoRedraw = True
If IsClean Then
PicPuzzle.Line (W * X – W, H * Y – H)-(W * X, H * Y), vbWhite, BF
Else
PicPuzzle.Line (W * X – W, H * Y – H)-(W * X, H * Y), vbBlue, BF
End If
PicPuzzle.Line (W * X – W, H * Y – H)-(W * X, H * Y), vbBlack, B
PicPuzzle.AutoRedraw = False
Grids(X, Y) = Not (IsClean)
End Sub
Dim I As Integer, J As Integer
Dim W As Single, H As Single
H = PicPuzzle.Height / GridH
For I = 0 To GridW
For J = 0 To GridH
If Grids(I, J) Then
PicPuzzle.Line (W * I – W, H * J – H)-(W * I, H * J), vbBlue, BF
End If
Next
Next
End Sub
Dim I As Integer, J As Integer
Dim Stat As Boolean
ReDim Selection(GridW, GridH)
For I = 0 To GridW
For J = 0 To GridH
Selection(I, J) = False
Next
Next
FindNext X, Y, Stat
End Function
Private Sub FindNext(ByVal X As Integer, ByVal Y As Integer, ByVal Stat As Boolean)
Selection(X, Y) = True
If X > 1 And X < GridW Then
If Grids(X – 1, Y) = Stat And Selection(X – 1, Y) = False Then FindNext X – 1, Y, Stat
If Grids(X + 1, Y) = Stat And Selection(X + 1, Y) = False Then FindNext X + 1, Y, Stat
ElseIf X = 1 Then
If Grids(X + 1, Y) = Stat And Selection(X + 1, Y) = False Then FindNext X + 1, Y, Stat
ElseIf X = GridW Then
If Grids(X – 1, Y) = Stat And Selection(X – 1, Y) = False Then FindNext X – 1, Y, Stat
End If
If Y > 1 And Y < GridH Then
If Grids(X, Y – 1) = Stat And Selection(X, Y – 1) = False Then FindNext X, Y – 1, Stat
If Grids(X, Y + 1) = Stat And Selection(X, Y + 1) = False Then FindNext X, Y + 1, Stat
ElseIf Y = 1 Then
If Grids(X, Y + 1) = Stat And Selection(X, Y + 1) = False Then FindNext X, Y + 1, Stat
ElseIf Y = GridH Then
If Grids(X, Y – 1) = Stat And Selection(X, Y – 1) = False Then FindNext X, Y – 1, Stat
End If
End Sub
Begin VB.Form FrmGame
Caption = "迷宫寻路"
ClientHeight = 7230
ClientLeft = 120
ClientTop = 420
ClientWidth = 10965
LinkTopic = "Form1"
ScaleHeight = 7230
ScaleWidth = 10965
StartUpPosition = 3 ‘窗口缺省
Begin VB.CommandButton CmdShow
Caption = "ShowRange"
Height = 500
Left = 3120
TabIndex = 3
Top = 0
Width = 1095
End
Begin VB.CommandButton CmdExit
Caption = "Exit"
Height = 500
Left = 1560
TabIndex = 2
Top = 0
Width = 1095
End
Begin VB.CommandButton CmdLoad
Caption = "LoadMaze"
Height = 500
Left = 0
TabIndex = 1
Top = 0
Width = 1095
End
Begin VB.PictureBox PicPuzzle
BackColor = &H00FFFFFF&
BorderStyle = 0 ‘None
Height = 4095
Left = 3120
ScaleHeight = 4095
ScaleWidth = 5775
TabIndex = 0
Top = 1680
Width = 5775
End
End
Attribute VB_Name = "FrmGame"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim Grids() As Boolean
Dim GridW As Integer, GridH As Integer
Dim Selection() As Integer
Dim SelectionA() As Integer, SelectionB() As Integer
Dim RoadX() As Integer, RoadY() As Integer
Dim FX As Integer, FY As Integer, TX As Integer, TY As Integer
PicPuzzle.Top = 500
PicPuzzle.Left = 0
GridW = 30
GridH = 30
InitialMaze GridW, GridH
FX = 1
FY = 1
End Sub
Private Sub Form_Resize()
PicPuzzle.Width = Me.ScaleWidth
PicPuzzle.Height = Me.ScaleHeight – 500
DrawMaze GridW, GridH
End Sub
Dim W As Single, H As Single
Dim I As Integer
W = PicPuzzle.ScaleWidth / GridW
H = PicPuzzle.ScaleHeight / GridH
TX = Int(X / W + 1)
TY = Int(Y / H + 1)
ReDim Selection(GridW, GridH)
If Grids(TX, TY) = False Then
SeekRoad FX, FY, TX, TY
If Selection(TX, TY) = 0 Then
FX = TX
FY = TY
Exit Sub
End If
DrawRoad TX, TY
PicPuzzle.Cls
For I = UBound(RoadX) To 1 Step -1
DrawGrid RoadX(I), RoadY(I), 3
Next
DrawGrid TX, TY, 2
FX = TX
FY = TY
End If
ERR:
End Sub
Dim FileName As String
Dim ST As String, STS() As String
Dim I As Integer, J As Integer
FileName = App.Path & "Map" & FileName & ".maze"
Open FileName For Input As #1
Input #1, ST
Close #1
STS = Split(ST, ";")
GridH = Len(STS(0))
GridW = UBound(STS)
ReDim Grids(GridW, GridH)
For I = 0 To GridW – 1
For J = 1 To GridH
If Mid(STS(I), J, 1) = "0" Then
Grids(I + 1, J) = False
Else
Grids(I + 1, J) = True
End If
Next
Next
DrawMaze GridW, GridH
FX = 1
FY = 1
End Sub
Private Sub CmdShow_Click()
Dim I As Integer, J As Integer, S As Integer
Dim W As Single, H As Single
H = PicPuzzle.ScaleHeight / GridH
PicPuzzle.Cls
For I = 1 To GridW
For J = 1 To GridH
S = Selection(I, J) / Selection(TX, TY) * 255
If Not Grids(I, J) Then PicPuzzle.Line ((I – 1) * W, (J – 1) * H)-(I * W, J * H), RGB(S, S, S), BF
Next
Next
For I = UBound(RoadX) To 1 Step -1
DrawGrid RoadX(I), RoadY(I), 3
Next
DrawGrid TX, TY, 2
End Sub
Private Sub CmdExit_Click()
End
End Sub
Dim I As Integer, J As Integer
For I = 1 To X
For J = 1 To Y
Grids(I, J) = False
Next
Next
End Sub
Dim I As Integer
Dim PX As Single, PY As Single
Dim W As Single, H As Single
H = PicPuzzle.Height / Y
PicPuzzle.AutoRedraw = True
PicPuzzle.Cls
ReDrawGrid
For I = 0 To X – 1
PicPuzzle.Line (W * I, 0)-(W * I, PicPuzzle.Height), vbBlack
Next
For I = 0 To Y – 1
PicPuzzle.Line (0, H * I)-(PicPuzzle.Width, H * I), vbBlack
Next
PicPuzzle.AutoRedraw = False
End Sub
Dim W As Single, H As Single
H = PicPuzzle.Height / GridH
If IsClean < 2 Then PicPuzzle.AutoRedraw = True
If IsClean = 1 Then
PicPuzzle.Line (W * X – W, H * Y – H)-(W * X, H * Y), vbWhite, BF
ElseIf IsClean = 0 Then
PicPuzzle.Line (W * X – W, H * Y – H)-(W * X, H * Y), vbBlue, BF
ElseIf IsClean = 2 Then
PicPuzzle.Line (W * X – W, H * Y – H)-(W * X, H * Y), vbGreen, BF
ElseIf IsClean = 3 Then
PicPuzzle.Line (W * X – W, H * Y – H)-(W * X, H * Y), vbRed, BF
End If
PicPuzzle.Line (W * X – W, H * Y – H)-(W * X, H * Y), vbBlack, B
If IsClean < 2 Then PicPuzzle.AutoRedraw = False
If IsClean < 2 Then Grids(X, Y) = Not (IsClean)
End Sub
Dim I As Integer, J As Integer
Dim W As Single, H As Single
H = PicPuzzle.Height / GridH
For I = 0 To GridW
For J = 0 To GridH
If Grids(I, J) Then
PicPuzzle.Line (W * I – W, H * J – H)-(W * I, H * J), vbBlue, BF
End If
Next
Next
End Sub
Dim ChainX() As Integer, ChainY() As Integer
Dim StickX() As Integer, StickY() As Integer
Dim I As Integer, N As Integer
N = 1
ReDim ChainX(1)
ReDim ChainY(1)
ReDim StickX(1)
ReDim StickY(1)
StickX(1) = A
StickY(1) = B
Do While Selection(X, Y) = 0 And UBound(ChainX) > 0
N = N + 1
ReDim ChainX(0)
ReDim ChainY(0)
For I = 1 To UBound(StickX)
If StickX(I) < GridW Then
If Selection(StickX(I) + 1, StickY(I)) = 0 And Not (Grids(StickX(I) + 1, StickY(I))) Then
Selection(StickX(I) + 1, StickY(I)) = N
ReDim Preserve ChainX(UBound(ChainX) + 1)
ReDim Preserve ChainY(UBound(ChainY) + 1)
ChainX(UBound(ChainX)) = StickX(I) + 1
ChainY(UBound(ChainY)) = StickY(I)
End If
End If
If StickX(I) > 1 Then
If Selection(StickX(I) – 1, StickY(I)) = 0 And Not (Grids(StickX(I) – 1, StickY(I))) Then
Selection(StickX(I) – 1, StickY(I)) = N
ReDim Preserve ChainX(UBound(ChainX) + 1)
ReDim Preserve ChainY(UBound(ChainY) + 1)
ChainX(UBound(ChainX)) = StickX(I) – 1
ChainY(UBound(ChainY)) = StickY(I)
End If
End If
If StickY(I) < GridH Then
If Selection(StickX(I), StickY(I) + 1) = 0 And Not (Grids(StickX(I), StickY(I) + 1)) Then
Selection(StickX(I), StickY(I) + 1) = N
ReDim Preserve ChainX(UBound(ChainX) + 1)
ReDim Preserve ChainY(UBound(ChainY) + 1)
ChainX(UBound(ChainX)) = StickX(I)
ChainY(UBound(ChainY)) = StickY(I) + 1
End If
End If
If StickY(I) > 1 Then
If Selection(StickX(I), StickY(I) – 1) = 0 And Not (Grids(StickX(I), StickY(I) – 1)) Then
Selection(StickX(I), StickY(I) – 1) = N
ReDim Preserve ChainX(UBound(ChainX) + 1)
ReDim Preserve ChainY(UBound(ChainY) + 1)
ChainX(UBound(ChainX)) = StickX(I)
ChainY(UBound(ChainY)) = StickY(I) – 1
End If
End If
Next
ReDim StickX(UBound(ChainX))
ReDim StickY(UBound(ChainY))
For I = 1 To UBound(StickX)
StickX(I) = ChainX(I)
StickY(I) = ChainY(I)
Next
Loop
End Sub
Private Sub DrawRoad(ByVal X As Integer, ByVal Y As Integer)
Dim I As Integer, N As Integer, A As Integer, B As Integer
ReDim RoadX(N)
ReDim RoadY(N)
RoadX(1) = X
RoadY(1) = Y
For I = 2 To N
A = RoadX(I – 1)
B = RoadY(I – 1)
N = N – 1
If A > 1 Then
If Selection(A – 1, B) = N Then
RoadX(I) = A – 1
RoadY(I) = B
GoTo NEXTSTEP
End If
End If
If A < GridW Then
If Selection(A + 1, B) = N Then
RoadX(I) = A + 1
RoadY(I) = B
GoTo NEXTSTEP
End If
End If
If B > 1 Then
If Selection(A, B – 1) = N Then
RoadX(I) = A
RoadY(I) = B – 1
GoTo NEXTSTEP
End If
End If
If B < GridH Then
If Selection(A, B + 1) = N Then
RoadX(I) = A
RoadY(I) = B + 1
End If
End If
NEXTSTEP:
Next
End Sub
这两天(很没创意地有较这个名字) 4 comments
一放假就感觉没了动力——希望以后时刻都能保有动力。
大前天,在Flash8里看到了不少牛人,于是研究了一天的Flash AS(2和3),感觉有了不少的感悟。
Flash比我们想象得都要强大。Macromedia将AS引入Flash,使得Flash的动画和网络互动能力上升了不少。而Adobe将AS3引入Flash则大大提高了Flash的能力。现在的Flash已经可以和C#、J2相提并论了(某些方面)。当然,Flash不支持外调Dll,这样限制了它的部分功能。不过Flash与生俱来的图形图像能力却是它的一大优点。也难怪Microsoft会推出Sliverlight,Google会推出Gears了。富媒体的内容比我们想象地要广阔啊。就好比去年和前年我们还在想Web2会是什么,现在则发现Web2比我们想象的还要丰富。
上面这段话说得像是工作汇报一样,恶心。
随后,前天小龙来了。让人很无奈的,是第三次了,说要出去K歌的,结果他们都在寝室里Dota。让人很无奈。
从小龙那了解了不少关于架构的概念。架构师的工作感觉就像是战场上的指挥官,企业里的经理。他负责总体统筹软件的开发和结构,具体怎么做和做什么他则不管。他提出一个概念,别人按照他的感念来做。
不过,任何事情都有正反两面,CPU和内存要同时兼顾是几乎不可能的。对于小软件来说,一个很宏大的架构并不适合。任何架构都有自己的适用空间。现在的许多架构不适合小型企业和小型软件。事实上,正如汇编牛人从来不知接口为何物一样,不用架构也能完成不少工作。架构使得以后的管理和维护变得更顺利,更新需要的开销减小,分工合作的时候更加和谐,但是架构也使得一些很容易完成的事情变得复杂。比如AS2中两三行的代码,在AS3中需要十多行——虽然看上去更结构紧凑意图清晰了,但是从开发的角度说不见得,因为原本举手就能完成的工作现在需要多调用不少东西——都从原来的东西上“掉落”了下来。同样的情况在VB6和VB.NET中也有。VB6中的控件数组很实用,在VB.NET中则需要动不少脑经。难道控件数组就不是OOP了?显然不是。
因而,架构现在走的一条路是:把原本整合的东西都分拆了出来,以至于一些东西分拆得过分了。
用我导师的话说,这是西方文明的典型行为。从语言就能看出来:他们把东西不断地分啊分啊,最后期望的是把各个最小组件都了解清楚了,就把整个世界了解清楚了——这个在物理中也是如此。问题是,还原论不一定正确——事实上,我们几乎可以说这种观念是错的。
同样的,有没有一种架构是可以让开发者自由选择哪些要哪些不要。给你一个功能充足的模型,随后你可以从上面拨东西下来,也可以把东西加上去。
从某种程度上说,这个就需要C++中的多重继承来实现了。
这种想法和不断把东西搭起来并不相同。我把一个本来有的东西禁掉,和去调用另一个东西,这是两种不同的方法。至少从开发的角度说,这样的方式适合小型软件的开发,而且能保证效率。
如果以后有机会让我接触到编译原理,并且自己有时间开发编译器的话,我一定会走这条路。合有的时候比分好。
昨天,小龙走了,XM来了——中学等于是放假了,当老师的XM现在就处于放假状态了。于是,他过来Dota。
随后,今天元帅生日。中午接受了建议打算去邀请XXX,结果把明天打算说的话提前了。现在心里挺乱的。
这两天看到了不少Flash大师的作品,顿时战斗欲无限。
今天看到有人在研究Flash中的寻路算法。我想起了我以前做的一个寻路的东东,最变态的就是里面是用一张图片来保存地图信息的,包括房子、商店等等地图信息,都是用颜色来分辨的,感觉很不错。不过这个算法后来没深入下去,今天打算深入一下。
Flash雷电算法~~ 2 comments
var SMin:Number=10;//每段最小
var SMax:Number=20;//每段最大
var Layers:Number=0;//记录当前雷电数
var LayerMax:Number=500;//记录雷电最大数
var WQ:Number=10;//记录雷电的弯曲程度
var wq:Number=0;//记录每小段的长度
var w:Number=0;//记录每小段的位
var CD:Number=120;//记录每小段弯曲程度
var PMin:Number=0;//最低概率
var PMax:Number=2;//最大底部放大倍率
var X:Number=0;
var Y:Number=200;
var DMin:Number=10;
var FolkLength:Number=100;//分叉雷电长度
var FolkDis:Number=10;//分叉雷电生成间隔
var FolkHeight:Number=50;//分叉雷电产生高度下限
var FolkShift:Number=100;//分叉雷电横移量
var FolkSize:Number=0.5;//分叉雷电大小比率
var FolkAng:Number=0.6;//分叉雷电变化角度比率
var i:Number;
BallA._height=SMin*0.37;
BallA._width=SMin*0.37;
BallB._height=SMin;
BallB._width=SMin;
BallA._x=X;
BallA._y=Y;
BallB._x=X;
BallB._y=Y;
for(i=0;(i<=Layers)||(i<=LayerMax);i++){
removeMovieClip(LayerName add "A" add i);
removeMovieClip(LayerName add "B" add i);
}
}
var i:Number;
var wq:Number;
var Ang:Number;
var Beta:Number;
var S:Number;
var I:Number=1;
var f:Number=0;
var F:Number=FolkDis*Math.random();
for(i=1;(BallA._y<=TY)&&(i<=LayerMax);){
wq=WQ*Math.random();
Beta=Math.pow(Math.random(),2);
if(Math.random()>0.5)Beta=-Beta;
Beta=Beta*(Math.pow(Math.abs((BallA._y-Y)/Y),0.5)+PMin);
Ang=-Math.atan2(BallA._y-Y,X-BallA._x)+CD/180*Math.PI*Beta;
for(w=0;(w<wq)&&(BallA._y<=Y)&&(i<=LayerMax);w++,i++,I++){
duplicateMovieClip("BallA","BallA" add I,10005+I);
duplicateMovieClip("BallB","BallB" add I,5+I);
S=SMin+(SMax-SMin)*Math.random()*(1+PMax*(1-Math.abs((BallA._y-Y)/Y)));
setProperty("BallA",_height,S*0.37);
setProperty("BallA",_width,S*0.37);
setProperty("BallB",_height,S);
setProperty("BallB",_width,S);
setProperty("BallA",_x,BallA._x+D*Math.cos(Ang));
setProperty("BallA",_y,BallA._y+D*Math.sin(Ang));
setProperty("BallB",_x,BallB._x+D*Math.cos(Ang));
setProperty("BallB",_y,BallB._y+D*Math.sin(Ang));
}
f++;
if((f>=F)&&(BallA._y<=TY-FolkHeight)){
f=0;
F=FolkDis*Math.random();
if(Math.random()>0.5){
I=FolkLight(BallA._x,BallA._y,BallB._x,BallB._y,BallA._x+FolkShift+100*Math.random(),BallA._y+100*Math.random(),I);
}else{
I=FolkLight(BallA._x,BallA._y,BallB._x,BallB._y,BallA._x-FolkShift-100*Math.random(),BallA._y+100*Math.random(),I);
}
}
I+=2;
}
return I;
}
function FolkLight(FX:Number,FY:Number,BX:Number,BY:Number,TX:Number,TY:Number,Sts:Number){
var i:Number;
var wq:Number;
var Ang:Number;
var Beta:Number;
var S:Number;
var I:Number=Sts;
var Length:Number=FolkLength*Math.random();
var R:Number=Math.sqrt(Math.pow(FX-TX,2)+Math.pow(FY-TY,2));
var r:Number=Math.sqrt(Math.pow(BallA._x-TX,2)+Math.pow(BallA._y-TY,2));
for(i=1;(r>=DMin)&&(i<=Length);){
wq=WQ*Math.random();
Beta=Math.pow(Math.random(),2);
if(Math.random()>0.5)Beta=-Beta;
Beta=Beta*(Math.pow(r/R,0.5)+PMin);
Ang=-Math.atan2(BallA._y-TY,TX-BallA._x)+CD*FolkAng/180*Math.PI*Beta;
for(w=0;(w<wq)&&(r<=Dmin)&&(i<=Length);w++,i++,I++){
duplicateMovieClip("BallA","BallA" add I,10005+I);
duplicateMovieClip("BallB","BallB" add I,5+I);
S=SMin+(SMax-SMin)*Math.random();
S*=FolkSize;
setProperty("BallA",_height,S*0.37);
setProperty("BallA",_width,S*0.37);
setProperty("BallB",_height,S);
setProperty("BallB",_width,S);
setProperty("BallA",_x,BallA._x+D*FolkSize*Math.cos(Ang));
setProperty("BallA",_y,BallA._y+D*FolkSize*Math.sin(Ang));
setProperty("BallB",_x,BallB._x+D*FolkSize*Math.cos(Ang));
setProperty("BallB",_y,BallB._y+D*FolkSize*Math.sin(Ang));
setProperty("BallA" add I,_alpha,200*Math.min((r-DMin)/R,(Length-i)/Length));
setProperty("BallB" add I,_alpha,200*Math.min((r-DMin)/R,(Length-i)/Length));
r=Math.sqrt(Math.pow(BallA._x-TX,2)+Math.pow(BallA._y-TY,2));
}
I+=2;
}
BallA._x=FX;
BallA._y=FY;
BallB._x=BX;
BallB._y=BY;
return I;
}
removeMovieClip("Point");
this.createEmptyMovieClip("Point",1);
this.Point.lineStyle(1,0xffffff,100);
this.Point.moveTo(X,Y);
this.Point.lineTo(X,Y-10);
Initial(0,0,"Ball",Layers,LayerMax);
Layers=MainLight(0,0,X,200);
removeMovieClip("Over");