以前用QB写的算迷宫路径的程序(广度搜索):
DIM MGData(0 TO 999) AS INTEGER
DIM X AS INTEGER, Y AS INTEGER
DIM CurView(0 TO 33) AS INTEGER
DIM CurX AS INTEGER, CurY AS INTEGER
DIM ik AS STRING
DIM I AS INTEGER, J AS INTEGER
DIM OldX AS INTEGER, OldY AS INTEGER
DIM L AS INTEGER, MGX(I) AS INTEGER, MGY(I) AS INTEGER
DIM Pic1(0 TO 33) AS INTEGER, Pic2(0 TO 33) AS INTEGER, Pic3(0 TO 33) AS INTEGER, Pic4(0 TO 33) AS INTEGERSCREEN 13LINE (0, 0)-(7, 7), 15, B
GET (0, 0)-(7, 7), CurViewCONST FXC = 8
LINE (8 + 3, 0)-STEP(1, 7), FXC, B
LINE (8 + 2, 1)-STEP(3, 0), FXC
LINE (8 + 1, 2)-STEP(5, 0), FXC
GET (8, 0)-STEP(7, 7), Pic1
LINE (16 + 3, 0)-STEP(1, 7), FXC, B
LINE (16 + 2, 6)-STEP(3, 0), FXC
LINE (16 + 1, 5)-STEP(5, 0), FXC
GET (16, 0)-STEP(7, 7), Pic2
LINE (24, 3)-STEP(7, 1), FXC, B
LINE (24 + 1, 2)-STEP(0, 3), FXC
LINE (24 + 2, 1)-STEP(0, 5), FXC
GET (24, 0)-STEP(7, 7), Pic3
LINE (32, 3)-STEP(7, 1), FXC, B
LINE (32 + 6, 2)-STEP(0, 3), FXC
LINE (32 + 5, 1)-STEP(0, 5), FXC
GET (32, 0)-STEP(7, 7), Pic4'WHILE INKEY$ = "": WEND
CLSStart:
FOR I = 1 TO 999
MGData(I) = &H7FFF
NEXT I
LINE (0, 0)-STEP(7, 7), 10, BF
LINE (312, 192)-STEP(7, 7), 10, BF
PUT (CurX, CurY), CurView, XORDO
ik = INKEY$
SELECT CASE ik$
CASE CHR$(27)
EXIT DO CASE " "
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
PUT (CurX, CurY), CurView, XOR CASE CHR$(0) + CHR$(72)
IF CurY > 0 THEN
PUT (CurX, CurY), CurView, XOR
CurY = CurY - 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(80)
IF CurY < 192 THEN
PUT (CurX, CurY), CurView, XOR
CurY = CurY + 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(75)
IF CurX > 0 THEN
PUT (CurX, CurY), CurView, XOR
CurX = CurX - 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(77)
IF CurX < 312 THEN
PUT (CurX, CurY), CurView, XOR
CurX = CurX + 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(141) 'Ctrl+Up
IF CurY > 0 THEN
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
CurY = CurY - 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(145) 'Ctrl+Down
IF CurY < 192 THEN
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
CurY = CurY + 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(115) 'Ctrl+Left
IF CurX > 0 THEN
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
CurX = CurX - 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(116) 'Ctrl+Right
IF CurX < 312 THEN
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
CurX = CurX + 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(60)'F2
CLS
GOTO Start
DIM MGData(0 TO 999) AS INTEGER
DIM X AS INTEGER, Y AS INTEGER
DIM CurView(0 TO 33) AS INTEGER
DIM CurX AS INTEGER, CurY AS INTEGER
DIM ik AS STRING
DIM I AS INTEGER, J AS INTEGER
DIM OldX AS INTEGER, OldY AS INTEGER
DIM L AS INTEGER, MGX(I) AS INTEGER, MGY(I) AS INTEGER
DIM Pic1(0 TO 33) AS INTEGER, Pic2(0 TO 33) AS INTEGER, Pic3(0 TO 33) AS INTEGER, Pic4(0 TO 33) AS INTEGERSCREEN 13LINE (0, 0)-(7, 7), 15, B
GET (0, 0)-(7, 7), CurViewCONST FXC = 8
LINE (8 + 3, 0)-STEP(1, 7), FXC, B
LINE (8 + 2, 1)-STEP(3, 0), FXC
LINE (8 + 1, 2)-STEP(5, 0), FXC
GET (8, 0)-STEP(7, 7), Pic1
LINE (16 + 3, 0)-STEP(1, 7), FXC, B
LINE (16 + 2, 6)-STEP(3, 0), FXC
LINE (16 + 1, 5)-STEP(5, 0), FXC
GET (16, 0)-STEP(7, 7), Pic2
LINE (24, 3)-STEP(7, 1), FXC, B
LINE (24 + 1, 2)-STEP(0, 3), FXC
LINE (24 + 2, 1)-STEP(0, 5), FXC
GET (24, 0)-STEP(7, 7), Pic3
LINE (32, 3)-STEP(7, 1), FXC, B
LINE (32 + 6, 2)-STEP(0, 3), FXC
LINE (32 + 5, 1)-STEP(0, 5), FXC
GET (32, 0)-STEP(7, 7), Pic4'WHILE INKEY$ = "": WEND
CLSStart:
FOR I = 1 TO 999
MGData(I) = &H7FFF
NEXT I
LINE (0, 0)-STEP(7, 7), 10, BF
LINE (312, 192)-STEP(7, 7), 10, BF
PUT (CurX, CurY), CurView, XORDO
ik = INKEY$
SELECT CASE ik$
CASE CHR$(27)
EXIT DO CASE " "
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
PUT (CurX, CurY), CurView, XOR CASE CHR$(0) + CHR$(72)
IF CurY > 0 THEN
PUT (CurX, CurY), CurView, XOR
CurY = CurY - 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(80)
IF CurY < 192 THEN
PUT (CurX, CurY), CurView, XOR
CurY = CurY + 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(75)
IF CurX > 0 THEN
PUT (CurX, CurY), CurView, XOR
CurX = CurX - 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(77)
IF CurX < 312 THEN
PUT (CurX, CurY), CurView, XOR
CurX = CurX + 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(141) 'Ctrl+Up
IF CurY > 0 THEN
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
CurY = CurY - 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(145) 'Ctrl+Down
IF CurY < 192 THEN
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
CurY = CurY + 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(115) 'Ctrl+Left
IF CurX > 0 THEN
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
CurX = CurX - 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(116) 'Ctrl+Right
IF CurX < 312 THEN
PUT (CurX, CurY), CurView, XOR
IF POINT(CurX, CurY) = 0 THEN
LINE (CurX, CurY)-STEP(7, 7), 13, BF
LINE (CurX, CurY)-STEP(7, 7), 5, B
ELSEIF POINT(CurX, CurY) = 5 THEN
LINE (CurX, CurY)-STEP(7, 7), 0, BF
END IF
CurX = CurX + 8
PUT (CurX, CurY), CurView, XOR END IF CASE CHR$(0) + CHR$(60)'F2
CLS
GOTO Start
PUT (CurX, CurY), CurView, XOR
I = 0
DO
L = 0
FOR J = 0 TO 999
IF MGData(J) = I THEN
IF J = 999 THEN EXIT DO
X = J MOD 40: Y = INT(J / 40)
IF X - 1 >= 0 THEN
IF POINT((X - 1) * 8, Y * 8) <> 5 THEN
IF I + 1 < MGData((X - 1) + Y * 40) THEN
MGData((X - 1) + Y * 40) = I + 1
L = -1
END IF
END IF
END IF
IF Y - 1 >= 0 THEN
IF POINT(X * 8, (Y - 1) * 8) <> 5 THEN
IF I + 1 < MGData(X + (Y - 1) * 40) THEN
MGData(X + (Y - 1) * 40) = I + 1
L = -1
END IF
END IF
END IF
IF X + 1 <= 39 THEN
IF POINT((X + 1) * 8, Y * 8) <> 5 THEN
IF I + 1 < MGData((X + 1) + Y * 40) THEN
MGData((X + 1) + Y * 40) = I + 1
L = -1
END IF
END IF
END IF
IF Y + 1 <= 24 THEN
IF POINT(X * 8, (Y + 1) * 8) <> 5 THEN
IF I + 1 < MGData(X + (Y + 1) * 40) THEN
MGData(X + (Y + 1) * 40) = I + 1
L = -1
END IF
END IF
END IF END IF NEXT J
I = I + 1
IF L = 0 THEN MGData(999) = 0: EXIT DO
LOOP
IF MGData(999) THEN
L = MGData(999) - 1
REDIM MGX(0 TO L) AS INTEGER
REDIM MGY(0 TO L) AS INTEGER
MGX(L) = 39: MGY(L) = 24
DO WHILE L
X = MGX(L)
Y = MGY(L)
DO
IF Y - 1 >= 0 THEN
IF MGData(X + (Y - 1) * 40) = L THEN
L = L - 1
MGX(L) = X
MGY(L) = Y - 1
MGData(X + (Y - 1) * 40) = &H7FFF
EXIT DO
END IF
END IF
IF X - 1 >= 0 THEN
IF MGData((X - 1) + Y * 40) = L THEN
L = L - 1
MGX(L) = X - 1
MGY(L) = Y
MGData((X - 1) + Y * 40) = &H7FFF
EXIT DO
END IF
END IF
IF Y + 1 <= 24 THEN
IF MGData(X + (Y + 1) * 40) = L THEN
L = L - 1
MGX(L) = X
MGY(L) = Y + 1
MGData(X + (Y + 1) * 40) = &H7FFF
EXIT DO
END IF
END IF
IF X + 1 <= 39 THEN
IF MGData((X + 1) + Y * 40) = L THEN
L = L - 1
MGX(L) = X + 1
MGY(L) = Y
MGData((X + 1) + Y * 40) = &H7FFF
EXIT DO
END IF
END IF
L = L + 1
LOOP WHILE 0
LOOP
X = 0: Y = 0
FOR I = 0 TO UBOUND(MGX) - 1
LINE (MGX(I) * 8, MGY(I) * 8)-STEP(7, 7), 2, BF
IF MGX(I) = X THEN
IF MGY(I) > Y THEN
PUT (MGX(I) * 8, MGY(I) * 8), Pic2, XOR
ELSE
PUT (MGX(I) * 8, MGY(I) * 8), Pic1, XOR
END IF
ELSE
IF MGX(I) > X THEN
PUT (MGX(I) * 8, MGY(I) * 8), Pic4, XOR
ELSE
PUT (MGX(I) * 8, MGY(I) * 8), Pic3, XOR
END IF
END IF
X = MGX(I)
Y = MGY(I)
NEXT I
ELSE
LOCATE 1, 1
PRINT "No!"
END IF
BEEP
WHILE INKEY$ = "": WEND
FOR I = 0 TO 39
FOR J = 0 TO 24
IF POINT(I * 8, J * 8) <> 5 THEN LINE (I * 8, J * 8)-STEP(7, 7), 0, BF
NEXT J
NEXT I
GOTO Start
END SELECTLOOPEND