'===========================================================================
' Subject: WHIZWORD SEARCHER                  Date: 03-19-00 (10:56)       
'  Author: Wayne Henderson                    Code: QB, QBasic, PDS        
'  Origin: whenders@becon.org               Packet: MISC.ABC
'===========================================================================
'WHIZWORD(tm), by Wayne Henderson_____March 18, 2000_____1:00pm EST
DEFINT A-Z: OPTION BASE 1
x = 5: y = 8: k = 11: DIM w$(x, y), sd(8)
CLS : GOSUB ReadArray: GOSUB Directions
COLOR 5, 0: LOCATE 1, 55: PRINT "Words in puzzle"
LOCATE , 55: PRINT "---------------": COLOR 6
RESTORE words
FOR c = 1 TO 10
   READ a$
   LOCATE c + 2, 59
   PRINT a$
NEXT
'
start:
COLOR 7: LOCATE 7, 1: PRINT SPACE$(30)
LOCATE 7, 1: PRINT "Word to find: ";
COLOR 14: LINE INPUT f$: f$ = LTRIM$(RTRIM$(f$))
IF f$ = "" OR LEN(f$) > 16 THEN LOCATE k, 1: COLOR 3: SYSTEM
FOR c = 11 TO 22
   LOCATE c, 1
   PRINT SPACE$(45)
NEXT
L = LEN(f$): f$ = UCASE$(f$): COLOR 9
LOCATE 9, 1: PRINT SPACE$(30): LOCATE 9, 1: PRINT f$
PRINT : COLOR 3
PRINT "Letter  Row  Col      Search Directions"
PRINT "-----------------------------------------"
'
work$ = LEFT$(f$, 1): Letter = 0
FOR Row = 1 TO x
   FOR Col = 1 TO y
      q$ = w$(Row, Col): Found = 0
      IF work$ = q$ THEN
         Letter = Letter + 1
         COLOR 6: PRINT "   "; work$; "    ";            'first letter found
         COLOR 7: PRINT STR$(Row); "   "; STR$(Col);
         GOSUB sd                               'get valid search directions
         GOSUB Remainder                         'look for remaining letters
         IF Found THEN EXIT FOR
      END IF
   NEXT Col
   IF Found THEN EXIT FOR
NEXT Row
COLOR 9
IF Found THEN
   PRINT : PRINT "FOUND: ";
   COLOR 3: PRINT "Row";
   COLOR 6: PRINT STR$(Row);
   COLOR 3: PRINT ", Col";
   COLOR 6: PRINT STR$(Col);
   COLOR 3: PRINT ", Direction";
   COLOR 6: PRINT Found
   k = CSRLIN
   GOSUB Highlite
ELSE
   IF Letter = 0 THEN PRINT "No letters found      No directions"
   COLOR 28: PRINT : PRINT "Word not found"
   k = CSRLIN
END IF
COLOR 3, 0: GOTO start
'
ReadArray: 'Read the puzzle matrix into a 2-dimensional array and display it
   RESTORE puzzle
   COLOR 14
   FOR Row = 1 TO x
      READ a$
      FOR Col = 1 TO y
         w$(Row, Col) = MID$(a$, Col, 1)
         PRINT w$(Row, Col); " ";
      NEXT
      PRINT
   NEXT Row
   COLOR 7
RETURN
'
Directions:
   LOCATE 3, 30: PRINT " 4   3   2"
   LOCATE , 30: PRINT "   \ | /"
   LOCATE , 30: PRINT "5 -- * -- 1"
   LOCATE , 30: PRINT "   / | \"
   LOCATE , 30: PRINT " 6   7   8"
RETURN
'
sd:
   FOR c = 1 TO 8: sd(c) = c: NEXT c
   IF Col + L > y + 1 THEN sd(1) = 0
   IF Row - L < 0 THEN sd(3) = 0   'If sd(?)=1 then search in that direction
   IF Col - L < 0 THEN sd(5) = 0       'If it's 0 then the word wouldn't fit
   IF Row + L > x + 1 THEN sd(7) = 0
   IF Col + L > y + 1 OR Row - L < 0 THEN sd(2) = 0
   IF Row - L < 0 OR Col - L < 0 THEN sd(4) = 0
   IF Col - L < 0 OR Row + L > x + 1 THEN sd(6) = 0
   IF Row + L > x + 1 OR Col + L > y + 1 THEN sd(8) = 0
   COLOR 5: PRINT "   "; : COLOR 4
   FOR c = 1 TO 8: PRINT sd(c); : NEXT c: PRINT    'display valid directions
RETURN
'
Remainder:      'Find the rest of the letters in the word ignoring line-wrap
   FOR c = 2 TO LEN(f$)
      wrk$ = MID$(f$, c, 1)
      IF sd(1) THEN IF wrk$ <> w$(Row, Col + c - 1) THEN sd(1) = 0
      IF sd(2) THEN IF wrk$ <> w$(Row - c + 1, Col + c - 1) THEN sd(2) = 0
      IF sd(3) THEN IF wrk$ <> w$(Row - c + 1, Col) THEN sd(3) = 0
      IF sd(4) THEN IF wrk$ <> w$(Row - c + 1, Col - c + 1) THEN sd(4) = 0
      IF sd(5) THEN IF wrk$ <> w$(Row, Col - c + 1) THEN sd(5) = 0
      IF sd(6) THEN IF wrk$ <> w$(Row + c - 1, Col - c + 1) THEN sd(6) = 0
      IF sd(7) THEN IF wrk$ <> w$(Row + c - 1, Col) THEN sd(7) = 0
      IF sd(8) THEN IF wrk$ <> w$(Row + c - 1, Col + c - 1) THEN sd(8) = 0
   NEXT
   FOR c = 1 TO 8      'run through the array and pick the correct direction
      IF sd(c) THEN Found = c: EXIT FOR
   NEXT
RETURN
'
Highlite:
   COLOR 15, 5: LOCATE Row, Col * 2 - 1: PRINT work$
   FOR c = 2 TO LEN(f$)
      IF sd(1) THEN LOCATE Row, (Col + c - 1) * 2 - 1
      IF sd(2) THEN LOCATE Row - c + 1, (Col + c - 1) * 2 - 1
      IF sd(3) THEN LOCATE Row - c + 1, Col * 2 - 1
      IF sd(4) THEN LOCATE Row - c + 1, (Col - c + 1) * 2 - 1
      IF sd(5) THEN LOCATE Row, (Col - c + 1) * 2 - 1
      IF sd(6) THEN LOCATE Row + c - 1, (Col - c + 1) * 2 - 1
      IF sd(7) THEN LOCATE Row + c - 1, Col * 2 - 1
      IF sd(8) THEN LOCATE Row + c - 1, (Col + c - 1) * 2 - 1
      PRINT MID$(f$, c, 1)
   NEXT
RETURN
'
puzzle:     'the puzzle could be stored as an ASCII file on disk and read in
DATA DRYHWELA
DATA UNIARPSD
DATA MLYYNOPD
DATA ENILIONE
DATA ELACSOJD
'
words:      'the words could be automatically read and searched sequentially
DATA Dry, Jon, Line, Lion, Mud, Pony, Scale, Sprain, Wayne, Added
