home *** CD-ROM | disk | FTP | other *** search
/ Kids Cube / 5_Logic.iso / maze2 / maze.bas next >
BASIC Source File  |  1993-05-25  |  13KB  |  486 lines

  1. DECLARE SUB Program.Notes ()
  2. DECLARE FUNCTION Show.Time$ (n&)
  3. DECLARE FUNCTION Isoneof% (n%, a$)
  4. DECLARE SUB Set.View (direction%, down%, across%)
  5. DECLARE SUB Sign.On ()
  6. DECLARE FUNCTION Central$ (xx%, n$)
  7. DECLARE FUNCTION Fact% (n%)
  8. DECLARE SUB Draw.Blank (n%)
  9. DECLARE SUB Draw.Wall (n%, door%, Picture%, picol%)
  10. DECLARE SUB Load.Data (wide%, deep%)
  11. DEFINT A-Z
  12.  
  13. COMMON SHARED strtx, strty, finx, finy, Aspect1, Aspect2, Multiplier!, bot.line
  14.  
  15. deep = 16: wide = 24
  16.  
  17. DIM SHARED grid(1 TO deep, 1 TO wide)
  18. CALL Load.Data(deep, wide)
  19.  
  20. DO
  21.    CLS
  22.    LOCATE 3, 45: PRINT "2  - CGA (640 x 200)"
  23.    LOCATE 4, 45: PRINT "3  - Hercules (720 x 348)"
  24.    LOCATE 5, 45: PRINT "8  - EGA/VGA (640 x 200)"
  25.    LOCATE 6, 45: PRINT "9  - EGA/VGA (640 x 350)"
  26.    LOCATE 7, 45: PRINT "12 - VGA (640 x 480)"
  27.    LOCATE 3, 1
  28.    INPUT "Enter Screen Mode: (2,3,8,9,12) "; Scrn.Mode
  29.    IF Isoneof(Scrn.Mode, "0203080912") THEN EXIT DO
  30. LOOP
  31.  
  32.  
  33. bot.line = 25
  34. Multiplier! = 2
  35. Aspect1 = 85
  36. Aspect2 = 115
  37.  
  38.  
  39. SELECT CASE Scrn.Mode
  40. CASE 9, 3
  41.    Multiplier! = 3.5
  42.    Aspect1 = 149
  43.    Aspect2 = 201
  44. CASE 12
  45.    Multiplier! = 4.8
  46.    Aspect1 = 204
  47.    Aspect2 = 276
  48.    bot.line = 30
  49. END SELECT
  50.  
  51.  
  52. DEF FNx1 (n) = 270 - (6.4 * Fact(n - 1))
  53. DEF FNy1 (n) = Aspect1 - (Multiplier! * Fact(n - 1))
  54. DEF FNx2 (n) = 370 + (6.4 * Fact(n - 1))
  55. DEF FNy2 (n) = Aspect2 + (Multiplier! * Fact(n - 1))
  56.  
  57. start:
  58.    CLS
  59.    CALL Sign.On
  60.  
  61.    SCREEN Scrn.Mode
  62.    direction = 1                                        'North = 1
  63.    down = strtx                                         'South = 3
  64.    across = strty                                       'East  = 2
  65.                                                         'West  = 4
  66.  
  67. REM   CALL Program.Notes: END
  68.  
  69.    CALL Set.View(direction, down, across)
  70.  
  71.    start& = TIMER
  72.  
  73.    DO
  74.       LOCATE bot.line, 60: PRINT "Direction: "; MID$("NESW", direction, 1);
  75.       LOCATE bot.line, 1: PRINT "Down: "; down;
  76.       LOCATE bot.line, 15: PRINT "Across: "; across;
  77.  
  78.       i$ = ""
  79.       WHILE i$ = ""
  80.          i$ = INKEY$
  81.          LOCATE bot.line, 32
  82.          PRINT Show.Time$(TIMER - start&);
  83.       WEND
  84.       j = ASC(RIGHT$(i$, 1))
  85.  
  86.       IF j = 75 THEN                               ' Left
  87.          direction = direction - 1
  88.          IF direction = 0 THEN direction = 4
  89.          CLS
  90.       END IF
  91.  
  92.       IF j = 77 THEN                               ' Right
  93.          direction = direction + 1
  94.          IF direction = 5 THEN direction = 1
  95.          CLS
  96.       END IF
  97.  
  98.       IF i$ = CHR$(27) THEN EXIT DO
  99.  
  100.       IF i$ = " " THEN
  101.          SELECT CASE direction
  102.          CASE 1                                         ' North
  103.             IF grid(down - 1, across) <> 1 THEN
  104.                down = down - 1
  105.             END IF
  106.          CASE 2                                         ' East
  107.             IF grid(down, across + 1) <> 1 THEN
  108.                across = across + 1
  109.             END IF
  110.          CASE 3                                         ' South
  111.             IF grid(down + 1, across) <> 1 THEN
  112.               down = down + 1
  113.             END IF
  114.          CASE 4                                         ' West
  115.             IF grid(down, across - 1) <> 1 THEN
  116.                across = across - 1
  117.             END IF
  118.          END SELECT
  119.       END IF
  120.       CALL Set.View(direction, down, across)
  121.  
  122.       IF down = finx AND across = finy THEN
  123.          finish& = TIMER - start&
  124.          PRINT Central$(bot.line / 2, "WELL DONE - THAT TOOK:")
  125.          PRINT Central$((bot.line / 2) + 2, Show.Time$(finish&))
  126.          PLAY "MF O3 L8 C P16 L16 C C L8 E C L8 E G E G O4 L4 C."
  127.          i$ = INPUT$(1)
  128.          END
  129.       END IF
  130.    LOOP
  131.  
  132.    SCREEN 0
  133.  
  134.    END
  135.  
  136. FUNCTION Central$ (xx, n$)
  137.     LOCATE xx, (80 - LEN(n$)) / 2
  138.     PRINT n$;
  139. END FUNCTION
  140.  
  141. SUB Draw.Blank (n)
  142.  
  143.     x1 = FNx1(n)
  144.     x2 = FNx2(n)
  145.     y1 = FNy1(n)
  146.     y2 = FNy2(n)
  147.  
  148.     LINE (x1, y1)-(x2, y2), 0, BF
  149.     LINE (x1, y1)-(x2, y2), 11, B
  150. END SUB
  151.  
  152. SUB Draw.Wall (n, door, Picture, picol)
  153.  
  154.     ' 0 = no door.
  155.     ' 1=on left.
  156.     ' 2=on right.
  157.     ' 3=Door both sides.
  158.  
  159.     x1 = FNx1(n)
  160.     x2 = FNx2(n)
  161.     y1 = FNy1(n)
  162.     y2 = FNy2(n)
  163.  
  164.  
  165.     xx1 = FNx1(n - 1)
  166.     yy1 = FNy1(n - 1)
  167.     yy2 = FNy2(n - 1)
  168.     xx2 = FNx2(n - 1)
  169.  
  170.     ' Left hand wall first.
  171.  
  172.     IF door = 1 OR door = 3 THEN
  173.        LINE (xx1, yy1)-(x1, y1), 0
  174.        LINE (xx1, yy2)-(x1, y2), 0
  175.        LINE (xx1, yy1)-(x1 + 1, yy1), 11
  176.        LINE (xx1, yy2)-(x1 + 1, yy2), 11
  177.     ELSE
  178.        LINE (xx1 - 2, yy1)-(x1 + 1, yy1), 0
  179.        LINE (xx1 - 2, yy2)-(x1 + 1, yy2), 0
  180.        LINE (xx1, yy1)-(x1, y1), 11
  181.        LINE (xx1, yy2)-(x1, y2), 11
  182.     END IF
  183.  
  184.     LINE (x1 + 1, yy1 + 1)-(xx1 - 1, yy2 - 1), 0, BF   ' Blank out Picture
  185.  
  186.     ' Right Hand Wall
  187.  
  188.     IF door = 2 OR door = 3 THEN
  189.        LINE (xx2, yy1)-(x2, y1), 0
  190.        LINE (xx2, yy2)-(x2, y2), 0
  191.        LINE (xx2, yy1)-(x2 - 1, yy1), 11
  192.        LINE (xx2, yy2)-(x2 - 1, yy2), 11
  193.     ELSE
  194.        LINE (xx2 + 2, yy1)-(x2 - 1, yy1), 0
  195.        LINE (xx2 + 2, yy2)-(x2 - 1, yy2), 0
  196.        LINE (xx2, yy1)-(x2, y1), 11
  197.        LINE (xx2, yy2)-(x2, y2), 11
  198.     END IF
  199.  
  200.     LINE (xx2 + 1, yy1 + 1)-(x2 - 1, yy2 - 1), 0, BF   ' Blank out Picture
  201.  
  202.     LINE (x1, y1)-(x1, y2), 11                  ' Verticals
  203.     LINE (x2, y1)-(x2, y2), 11
  204.  
  205.  
  206.     ' Picture
  207.  
  208.     fatend = y2 - y1
  209.     thinend = yy2 - yy1
  210.     wdth = xx1 - x1
  211.  
  212.     SELECT CASE Picture
  213.     CASE 1                              ' On left
  214.        tlx = x1 + (wdth * .2)
  215.        tly = y1 + (fatend * .3)
  216.        trx = xx1 - (wdth * .2)
  217.        try = yy1 + (thinend * .3)
  218.  
  219.        blx = tlx
  220.        bly = y2 - (fatend * .3)
  221.        brx = trx
  222.        bry = yy2 - (thinend * .3)
  223.     CASE 2
  224.        tlx = xx2 + (wdth * .2)
  225.        tly = yy1 + (thinend * .3)
  226.        trx = x2 - (wdth * .2)
  227.        try = y1 + (fatend * .3)
  228.  
  229.        blx = tlx
  230.        bly = yy2 - (thinend * .3)
  231.        brx = trx
  232.        bry = y2 - (fatend * .3)
  233.     CASE 3, 0
  234.        EXIT SUB
  235.     END SELECT
  236.  
  237.     LINE (tlx, tly)-(trx, try), 15
  238.     LINE -(brx, bry), 15
  239.     LINE -(blx, bly), 15
  240.     LINE -(tlx, tly), 15
  241.     
  242.     IF Picture = 1 THEN
  243.        PAINT (trx - 5, try + 5), picol - 5, 15
  244.     ELSE
  245.        PAINT (tlx + 5, tly + 5), picol - 5, 15
  246.     END IF
  247.  
  248. END SUB
  249.  
  250. FUNCTION Fact (n)
  251.     temp = 0
  252.     FOR l = 1 TO n
  253.         temp = temp + l
  254.     NEXT l
  255.     Fact = temp
  256. END FUNCTION
  257.  
  258. FUNCTION Isoneof (n, a$)
  259.    Isoneof = 0
  260.    FOR x = 1 TO LEN(a$) STEP 2
  261.        IF VAL(MID$(a$, x, 2)) = n THEN Isoneof = -1: EXIT FOR
  262.    NEXT x
  263. END FUNCTION
  264.  
  265. SUB Load.Data (deep, wide)
  266.     OPEN "I", 1, "MAZE.DAT"
  267.     FOR x = 1 TO deep
  268.         INPUT #1, n$
  269.         FOR y = 1 TO wide
  270.             grid(x, y) = VAL(MID$(n$, y, 1))
  271.             IF grid(x, y) = 2 THEN
  272.                strtx = x
  273.                strty = y
  274.                grid(x, y) = 0
  275.             ELSEIF grid(x, y) = 3 THEN
  276.                finx = x
  277.                finy = y
  278.                grid(x, y) = 0
  279.             END IF
  280.         NEXT y
  281.     NEXT x
  282.     REM
  283. END SUB
  284.  
  285. SUB Program.Notes
  286.     CLS
  287.     CALL Draw.Wall(7, 0, 0, 0)
  288.     LOCATE 6, 12: PRINT "x1,y1"
  289.     LOCATE 20, 12: PRINT "x1,y2"
  290.     LOCATE 6, 66: PRINT "x2,y1"
  291.     LOCATE 20, 66: PRINT "x2,y2"
  292.  
  293.     LOCATE 8, 24: PRINT "xx1,yy1"
  294.     LOCATE 18, 24: PRINT "xx1,yy2"
  295.     LOCATE 8, 51: PRINT "xx2,yy1"
  296.     LOCATE 18, 51: PRINT "xx2,yy2"
  297.  
  298.  
  299.     i$ = INPUT$(1)
  300.     CLS
  301.  
  302.     CALL Draw.Wall(7, 1, 0, 0)
  303.  
  304.     LOCATE 6, 66: PRINT "x2,y1"
  305.     LOCATE 20, 66: PRINT "x2,y2"
  306.     LOCATE 8, 51: PRINT "xx2,yy1"
  307.     LOCATE 18, 51: PRINT "xx2,yy2"
  308.  
  309.  
  310.     LOCATE 6, 12: PRINT "x1,y1"
  311.     LOCATE 20, 12: PRINT "x1,y2"
  312.     LOCATE 8, 24: PRINT "xx1,yy1"
  313.     LOCATE 18, 24: PRINT "xx1,yy2"
  314.  
  315.     LOCATE 8, 11: PRINT "x1,yy1"
  316.     LOCATE 18, 11: PRINT "x1,yy2"
  317.  
  318.     LOCATE 8, 66: PRINT "x2,yy1"
  319.     LOCATE 18, 66: PRINT "x2,yy2"
  320.  
  321.     i$ = INPUT$(1)
  322.     CLS
  323.  
  324.    PRINT Central$(1, "For each wall section, lines are drawn that make the section a wall AND a")
  325.    PRINT Central$(2, "door.  However, if the section is a door, then the diagonals that make it")
  326.    PRINT Central$(3, "a wall are drawn in COLOR 0 to blank it out. The converse applies if the ")
  327.    PRINT Central$(4, "section is to be drawn as a wall, the horizontal lines that would make it")
  328.    PRINT Central$(5, "a door are drawn, but again in COLOUR zero to blank it out.  This over-  ")
  329.    PRINT Central$(6, "writes the section drawn before the move was made.                       ")
  330.  
  331.     i$ = INPUT$(1)
  332. END SUB
  333.  
  334. SUB Set.View (direction, down, across)
  335.  
  336.    SELECT CASE direction
  337.    CASE 1                               ' Facing North
  338.       hey = down
  339.       xx = 10
  340.       DO UNTIL grid(hey, across) = 1
  341.          door = 0
  342.          IF grid(hey, across - 1) <> 1 THEN door = door + 1
  343.          IF grid(hey, across + 1) <> 1 THEN door = door + 2
  344.  
  345.          IF grid(hey, across) = 9 THEN
  346.             Picture = 1                         ' On left
  347.          ELSEIF grid(hey, across) = 7 THEN
  348.             Picture = 2                         ' On right
  349.          ELSEIF grid(hey, across) = 6 THEN
  350.             Picture = 3                         ' Straight on
  351.          ELSE
  352.             Picture = 0                         ' No Picture
  353.          END IF
  354.  
  355.          CALL Draw.Wall(xx, door, Picture, grid(hey, across))
  356.          xx = xx - 1
  357.          hey = hey - 1
  358.       LOOP
  359.       CALL Draw.Blank(xx)
  360.    CASE 2                               ' Facing East
  361.       hey = across
  362.       xx = 10
  363.       DO UNTIL grid(down, hey) = 1
  364.          door = 0
  365.          IF grid(down - 1, hey) <> 1 THEN door = door + 1
  366.          IF grid(down + 1, hey) <> 1 THEN door = door + 2
  367.  
  368.          IF grid(down, hey) = 6 THEN
  369.             Picture = 1                         ' On left
  370.          ELSEIF grid(down, hey) = 8 THEN
  371.             Picture = 2                         ' On right
  372.          ELSEIF grid(down, hey) = 7 THEN
  373.             Picture = 3                         ' Straight on
  374.          ELSE
  375.             Picture = 0                         ' No Picture
  376.          END IF
  377.  
  378.          CALL Draw.Wall(xx, door, Picture, grid(down, hey))
  379.          xx = xx - 1
  380.          hey = hey + 1
  381.       LOOP
  382.       CALL Draw.Blank(xx)
  383.    CASE 3                                       ' Facing South
  384.       hey = down
  385.       xx = 10
  386.       DO UNTIL grid(hey, across) = 1
  387.          door = 0
  388.          IF grid(hey, across + 1) <> 1 THEN door = door + 1
  389.          IF grid(hey, across - 1) <> 1 THEN door = door + 2
  390.  
  391.          IF grid(hey, across) = 7 THEN
  392.             Picture = 1                         ' On left
  393.          ELSEIF grid(hey, across) = 9 THEN
  394.             Picture = 2                         ' On right
  395.          ELSEIF grid(hey, across) = 8 THEN
  396.             Picture = 3                         ' Straight on
  397.          ELSE
  398.             Picture = 0                         ' No Picture
  399.          END IF
  400.  
  401.          CALL Draw.Wall(xx, door, Picture, grid(hey, across))
  402.          xx = xx - 1
  403.          hey = hey + 1
  404.       LOOP
  405.       CALL Draw.Blank(xx)
  406.    CASE 4                                       ' Facing West
  407.       hey = across
  408.       xx = 10
  409.       DO UNTIL grid(down, hey) = 1
  410.          door = 0
  411.          IF grid(down + 1, hey) <> 1 THEN door = door + 1
  412.          IF grid(down - 1, hey) <> 1 THEN door = door + 2
  413.  
  414.          IF grid(down, hey) = 8 THEN
  415.             Picture = 1                         ' On left
  416.          ELSEIF grid(down, hey) = 6 THEN
  417.             Picture = 2                         ' On right
  418.          ELSEIF grid(down, hey) = 9 THEN
  419.             Picture = 3                         ' Straight on
  420.          ELSE
  421.             Picture = 0                         ' No Picture
  422.          END IF
  423.  
  424.          CALL Draw.Wall(xx, door, Picture, grid(down, hey))
  425.          xx = xx - 1
  426.          hey = hey - 1
  427.       LOOP
  428.       CALL Draw.Blank(xx)
  429.    END SELECT
  430.    
  431.    IF Picture = 3 THEN
  432.        x1 = FNx1(xx)
  433.        x2 = FNx2(xx)
  434.        y1 = FNy1(xx)
  435.        y2 = FNy2(xx)
  436.  
  437.        wdth = x2 - x1
  438.        depth = y2 - y1
  439.  
  440.        tlx = x1 + (wdth * .2)
  441.        tly = y1 + (depth * .3)
  442.  
  443.        brx = x2 - (wdth * .2)
  444.        bry = y2 - (depth * .3)
  445.  
  446.        LINE (tlx, tly)-(brx, bry), 15, B
  447.        PAINT (tlx + 10, tly + 10), direction, 15
  448.    END IF
  449.  
  450. END SUB
  451.  
  452. FUNCTION Show.Time$ (n&)
  453.    mins = FIX(n& / 60)
  454.    secs = n& - (mins * 60)
  455.    IF mins < 2 THEN m$ = " min. " ELSE m$ = " mins. "
  456.    Show.Time$ = STR$(mins) + m$ + STR$(secs) + " secs. "
  457. END FUNCTION
  458.  
  459. SUB Sign.On
  460.    COLOR 12
  461.    PRINT Central$(9, "Cheapo Nasty Productions Presents:")
  462.    COLOR 11
  463.    PRINT Central$(10, "EXPERIMENTAL MAZE PROGRAM")
  464.    PRINT Central$(11, "By: D. M. EVANS 1993")
  465.    COLOR 14
  466.    LOCATE 14, 15: PRINT "USE SPACEBAR TO MOVE FORWARD.   USE LEFT/RIGHT CURSOR"
  467.    LOCATE 15, 15: PRINT "KEYS TO TURN LEFT/RIGHT.  PRESS [ESC] TO ABANDON SHIP"
  468.    COLOR 15
  469.    LOCATE 17, 15: PRINT "TRY TO FIND YOUR WAY OUT IN THE QUICKEST TIME.  PRESS"
  470.    LOCATE 18, 15: PRINT "`H' KEY NOW TO DISCOVER EXIT COORDINATES OR ANY OTHER"
  471.    LOCATE 19, 15: PRINT "KEY TO ENTER THE MAZE"
  472.  
  473.    DO
  474.       i$ = UCASE$(INPUT$(1))
  475.       IF i$ = "H" THEN
  476.          CLS
  477.          PRINT "SQUARE: "; finx, finy
  478.       ELSE
  479.          CLS
  480.          EXIT DO
  481.       END IF
  482.    LOOP
  483.  
  484. END SUB
  485.  
  486.